PHPカンファレンス2020 レポート

PHPカンファレンス2020 レポート[後編]

この記事を読むのに必要な時間:およそ 5 分

富所亮さん「PHPのソースコードから理解するPreloadとJIT」

Webアプリケーションエンジニアの富所さんは,PHP7.4でサポートされたPreloadとPHP8でサポートされたJITについて,これらを比較しながら解説しました

画像

今回のセッションでは,次の3点について解説しました。

  • PreloadとJITを謎の技術にせず,仕組みを理解する
  • PreloadとJITではどのくらいの速度向上が見込まれるか
  • JITは本番稼働中のWebアプリケーション動作環境に導入する価値があるか

はじめに,PHPの高速化の歴史について話しました。

高速化の仕組みとしてXCache,APCなどが用いられた時期もありましたが,PHP5.5以降ははOPCacheがデファクトスタンダードになっています。

まれに本番環境でOPCacheが有効になっていないことが見受けられると指摘した上で,DockerHubで公式配布されているイメージにはOPCacheが導入されていないことがある点についても触れました。OPCacheが無効化されていて良いことはないため,必ず有効化するようにと述べていました。

次に,PHPのスクリプトが実行されるまでの過程について詳細な説明があり,その中でコンパイルの流れを取り上げました。字句解析,構文解析を経て生成されたOPCodeをZendVMが実行することでPHPのコードは実行されること,OPCacheではコンパイルの部分が省略されることから高速化を実現できると説明しました。

Autoload機構が存在する場合にはコンパイルが何回動くのか,実際のWebアプリケーションを模擬したサンプルコードを元に説明しました。次のような依存関係の場合にはコンパイル処理が4回動作することを示しました。

index.php (コンパイル)
    -> autoload.php (コンパイル)
        -> 依存クラスA.php (コンパイル)
        -> 依存クラスA.php (コンパイル)

続いて,OPCacheの有効化によりコンパイル結果がキャッシュされるとパフォーマンスにどのように影響するかを検証しました。Laravelでベンチマークしたところ,OPCacheの有効化により約6倍の処理速度が高速化しました。ソースコードをコンパイルしてOPCodeを生成するには大きなコストがかかるため,回数を削減するだけでここまでの処理速度の高速化が可能になったことに言及していました。

PHP7.4で追加されたPreloadで,さらなる高速化処理が可能となります。Preloadでは,サーバ起動時にpreload.phpで指定されたファイルのコンパイルが走り,OPCodeをメモリに展開します。これにより,外部ファイルを参照する場合にautoload.phpを一度読み込む必要がなくなるため,さらに高速化されます。セッションの中では,PHPのソースコードレベルでPrealoadの仕組みについても触れました。結果,Preloadを有効化した場合,OPCache単体と比較して約14%の高速化が実現していました。

そして,PHP8.0でJITがサポートされた点に触れ,JITの検証も行いました。OPCodeはZendVM上で実行されますが,JITの場合はネイティブコードを生成しCPUで実行することで最適化を行います。ZendVM上での実行速度よりもCPU上での実行速度が高速であるため,結果として実行速度が向上します。一見OPCodeをネイティブコードに変換するコストが発生するため,速度が遅くなるのではないかとの懸念を持つかもしれませんが,変換コストを合わせてもZendVM上での実行速度を上回って高速に動作するためカバーできると説明しました。ただしJITの最適化はクラスや関数単位で行われることから,JITの恩恵を最大限に受けるには元のソースの書き方についても考慮が必要になります。結果,OPCache+Preloadの場合と比較して2.5%〜5%の処理速度が向上しました。

これらの結果を踏まえ,富所さんは「JITについては仕組みを理解して,適切なアプリケーションに導入することが重要である」と述べながらも, ⁠Webアプリケーションの場合には,ネットワークアクセスやデータベースアクセスのボトルネックが大きなウエイトを占めるため,JITで速度改善を図ることは有効な対策とはいえず,最優先で本番投入することはお勧めしない」と結びました。

著者プロフィール

西祐太郎(にしゆうたろう)

株式会社アドベンチャーでエンジニアとして勤務。WordPressでPHPを触り始め,その後Laravel,独自フレームワークと複数のPHPプロジェクトを経験。最近は開発の傍ら,プロジェクトリーダーやエンジニア採用などにも携わる。レガシーコードのモダン化とマイクロサービスアーキテクチャにご執心。

Facebook:https://www.facebook.com/profile.php?id=100028405416669
GitHub:https://github.com/yuta-ron

バックナンバー

PHPカンファレンス2020 レポート