PHP 8: 実際の Web アプリケーションでの JIT パフォーマンス

in Vlog

(jp) =

PHP 8 の JIT に興味がある方のために、実際の Web アプリケーションのシナリオでいくつかのベンチマークを行いました。 これらのベンチマークは、JIT が有用かどうかについては何も述べていないことに注意してください。JIT が平均的な Web アプリケーションのパフォーマンスを改善できるかどうかを示しているだけです。

# 設定

まずシーンを設定しましょう。 これらのベンチマークは、私のローカル マシンで実行されました。 そのため、彼らは絶対的なパフォーマンスの向上については何も述べていません。私は、JIT が実際のコードに与える相対的な影響について結論を出すことにのみ関心があります。

20 の子プロセスを生成するように構成された PHP FPM を実行します。FPM レベルでの余分なパフォーマンス ヒットを排除するために、一度に 20 の同時要求のみを実行するように常に確認します。 これらのリクエストの送信は、ApacheBench で次のコマンドを使用して行われます。

ab -n 100 -c 20 -l http://aggregate.stitcher.io.test:8081/discover

tpyoに気づきましたか? PR を送信して修正することができます。 このブログの最新情報を知りたい場合は、私をフォローしてください。 ツイッター または私のニュースレターを購読してください:

# JITセットアップ

プロジェクトが整ったら、JIT 自体を構成しましょう。 JIT は、 opcache.jit_buffer_size オプション php.ini. このディレクティブが除外されている場合、デフォルト値は 0 に設定され、JIT は実行されません。

opcache.jit_buffer_size=100M

また、JIT モードを設定する必要があります。これは、JIT がコードのホットな部分を監視して反応する方法を決定します。 を使用する必要があります。 opcache.jit オプション。 そのデフォルトはに設定されています tracing、しかし、あなたはそれをオーバーライドすることができます function:

opcache.jit=function

実際のベンチマークでは、両方のモードを互いに比較します。 それでは、ベンチマークを開始しましょう。

# ベースラインの確立

まず、JIT が適切に機能しているかどうかを確認するのが最善です。 RFC から、フラクタルの計算に大きな影響を与えることがわかっています。 それでは、その例から始めましょう。 RFC から mandelbrot の例をコピーし、次のベンチマークを実行するのと同じ HTTP アプリケーションを介してアクセスしました。

public function index()

    for ($y = -39; $y < 39; $y++) 
        printf("\n");

        for ($x = -39; $x < 39; $x++) 
            $i = $this->mandelbrot(
                $x / 40.0,
                $y / 40.0
            );

            if ($i == 0) 
                printf("*");
             else 
                printf(" ");
            
        
    

    printf("\n");


private function mandelbrot($x, $y)

    $cr = $y - 0.5;
    $ci = $x;
    $zi = 0.0;
    $zr = 0.0;
    $i = 0;

    while (1) 
        $i++;
        
        $temp = $zr * $zi;
        
        $zr2 = $zr * $zr;
        $zi2 = $zi * $zi;
        
        $zr = $zr2 - $zi2 + $cr;
        $zi = $temp + $temp + $ci;

        if ($zi2 + $zr2 > 16) 
            return $i;
        

        if ($i > 5000) 
            return 0;
        
    

走った後 ab 数百のリクエストの場合、結果を確認できます。

リクエスト/秒 (多いほど良い)
JITなしのマンデルブロ 3.60
JIT をトレースするマンデルブロ 41.36

JIT が機能しているようです。 これは、10 倍のパフォーマンス向上です。 期待どおりに動作することを確認したら、最初の実際の比較に移りましょう。 JIT なしを関数およびトレース JIT と比較します。 100MBのメモリを使用。 ベンチマークしようとしているページは、投稿の概要を示しているため、再帰が発生しています。 また、ルーティング、依存関係コンテナー、ORM レイヤーなど、Laravel のいくつかのコア部分にも触れています。

サイドノート:

JIT が実行されているかどうかを確認する場合は、次を使用できます。 opcache_get_status()、それは jit すべての関連情報をリストするエントリ:

dd(opcache_get_status()['jit']);









リクエスト/秒 (多いほど良い)
いいえJIT 63.56
関数 JIT 66.32
JIT のトレース 69.45

ここに結果が表示されます。JIT を有効にしても、わずかな改善しかありません。 実際、ベンチマークを何度も実行すると、結果は毎回わずかに異なります。JIT を有効にした実行のパフォーマンスが、JIT を実行していないバージョンよりも悪い場合さえ見てきました。 最終的な結論を出す前に、メモリ バッファの制限を増やしてみましょう。 100MB の代わりに 500MB のメモリを使用して、JIT に余裕を持たせます。

リクエスト/秒 (多いほど良い)
いいえJIT 71.69
関数 JIT 72.82
JITのトレース 70.11

ご覧のとおり、JIT のパフォーマンスが悪いケースです。 この投稿の冒頭で述べたように、JIT が実際の Web プロジェクトに与える相対的な影響を測定したいと考えています。 これらのテストから、利点がある場合があることは明らかですが、最初に使用したフラクタルの例ほど顕著ではありません。 私はそれについて本当に驚いていないことを認めます. 前に書いたように、実際のアプリケーションで最適化されるホットなコードはほとんどなく、フラクタルのような計算を行うことはめったにありません。

JITは必要ないと言っているのですか? そうではありませんが、JIT は PHP の新しい領域を開くことができると思います。複雑な計算が JIT 化されたコードの恩恵を受ける領域です。 機械学習、AI などについて考えています。 JIT そうかもしれない まだ存在していなかった PHP コミュニティに機会を提供しますが、現時点では確実なことを言うことはできません。


以上で、私の JIT テストは終了です。 予想どおり、JIT が Web アプリケーションに大きな影響を与えることはおそらくないでしょう。少なくとも現時点ではそうです。

この投稿では、JIT 自体が良い追加であるかどうかについての私の考えを議論することはしません。ここで一緒に議論しましょう!

//platform.twitter.com/widgets.js

関連記事

前の投稿
ルイジアナ州で最も寒い場所を発見する
次の投稿
ブルンジの国旗: 歴史、意味、象徴