PHP Laravel アプリケーションにおける CPU 時間の消費状況を確認(OpenResty XRay を使用)
本チュートリアルでは、OpenResty XRayを使用して PHP Laravel アプリケーションにおける CPU 時間の消費状況を定量的に分析する方法をご紹介します。CPU を最も消費している PHP コードパスを示します。これらのホットコードパスは、OpenResty XRayが PHP 言語レベルの CPU フレームグラフを自動的に分析・解釈して得られたものです。OpenResty XRay は真の非侵襲的動的分析ツールであり、対象アプリケーションに特別なモジュールやプラグインをインストールする必要はなく、対象アプリケーションを再コンパイルする必要もなく、実行中のプロセスを再起動する必要さえありません。
問題:高 CPU 使用率
PHP の Laravel フレームワークを使用して、シンプルな「hello world」Web アプリケーションを構築しました。
ここでは、「Hello, world」というレスポンスを返すリクエストハンドラ関数を定義しています。
curl
コマンドを使用して Laravel の HTTP インターフェースにアクセスします。レスポンスボディは確かに「hello world」です。
top
コマンドを実行して、対象の PHP プロセスの CPU 使用状況を確認します。
これは先ほど示した PHP「hello world」サービスプロセスです。
事前にクライアント側の負荷テストツールを使用して CPU 使用率を 100% まで上げています。
ps
コマンドを実行して、このプロセスの詳細を確認します。
この php
バイナリ実行ファイルは Linux ディストリビューションに付属のものです。
Laravel アプリケーションの CPU 分布を分析
次に、OpenResty XRayを使用して、PHP プロセス内のすべてのコードパスで CPU 時間がどのように消費されているかを確認します。ブラウザで OpenResty XRay の Web コンソールを開きます。
現在分析中のマシンが正しいことを確認してください。
正しくない場合は、リストから再選択することができます。
「Guided Analysis」ページに移動します。
ここでは、システムが分析可能な様々な種類の問題を確認できます。
「High CPU usage」を選択します。
「Next」をクリックします。
先ほどの PHP アプリケーションを選択します。
約 100% CPU リソースを消費しているプロセスを選択します。これは先ほど top
で確認したものです。
アプリケーションのタイプが正しいことを確認します。通常、デフォルト値が正しいです。
OpenResty XRay は、様々な言語レベルで分析を行うことができます。ここでは PHP と C/C++ の両方を選択したままにします。
最長分析時間を設定することもできます。ここではデフォルトの 300 秒のままにします。
分析を開始します。
システムは複回数の分析を継続的に実行します。現在、初回の分析を実行中です。
初回の分析が完了し、現在 2 回目のラウンドに入っております。この例では、1 回の分析で十分です。
分析を停止します。
自動生成された分析レポートが表示されます。
これは分析対象の問題タイプである CPU です。
これは CPU リソースを最も消費している C コードパスです。
最初の zend_execute
関数は PHP オペコードの解釈と実行に使用されます。
サーバーが新しい HTTP リクエストを受信すると、php_cli_server_dispatch_router
関数が呼び出されてリクエストデータの読み取りと解析を行います。
main
関数は、これが PHP CLI によって起動された組み込み Web サーバーであることを示しています。
詳細を表示するにはクリックしてください。
このホットコードパスは、C 言語レベルの CPU フレームグラフから自動的に導き出されたものです。
以下は問題に関するより詳細な説明と提案です。先ほど見た zend_execute
関数について言及しています。
最もホットな PHP コードパスの詳細を見てみましょう。
bootProvider
関数は Laravel フレームワークの一部で、アプリケーションに登録された Service Provider を起動する役割を担っています。
「More」をクリックして詳細を表示します。
このアイコンをクリックして拡大します。
さらに拡大します。
Laravel の ServiceProvider プログラムにおいて、ServiceProvider::boot
メソッドは Carbon 日付ライブラリのマクロ登録と設定に使用されます。対応する boot メソッドはタイムゾーンなどの設定の初期化に使用されます。
IgnitionServiceProvider::boot
関数は Laravel アプリケーションのデバッグページ用エラーページの初期化を行います。
2 番目にホットな PHP コードパスを見てみましょう。これは CPU 時間の約 14% を消費しています。
この register
関数はアプリケーションのブートストラッププロセス中に呼び出され、Service Provider プログラムの登録プロセスの一部です。Laravel では、リクエストごとに新しいアプリケーションインスタンスが起動されます。
「More」をクリックして詳細を表示します。
フレームグラフを拡大します。
さらに拡大します。
resolveProvider
は Laravel フレームワーク内のメソッドで、Service Provider の解決と登録に使用されます。
DatabaseServiceProvider::register
メソッドは Laravel においてデータベースサービスとその関連コンポーネントをサービスコンテナに登録する役割を担っています。
3 番目にホットなコードパスは CPU 時間の約 13% を消費しています。
このコードパスの詳細を見てみましょう。
このコードパスは HTTP レスポンスの送信に使用され、「hello world」レスポンスの実装です。
1 番目のコードパスと 2 番目のパスは同じサービスではありませんが、類似しています。
これは Laravel と OpenResty のパフォーマンス比較グラフです。Laravel のパフォーマンスが OpenResty より 2 桁低いことがわかります。OpenResty フレームワークはより効率的で先進的な設計と実装がなされています。
自動生成レポート
OpenResty XRay はオンラインプロセスを自動的に監視し、分析レポートを生成することができます。「Insights」ページに切り替えてください。
「Insights」ページでは、日次および週次の自動レポートをご確認できます。そのため、「Guided Analysis」機能を必ずしも使用する必要はないですが、
その機能はアプリケーションの開発やデモンストレーションに非常に有用です。
OpenResty XRay について
OpenResty XRay は動的トレーシング製品であり、実行中のアプリケーションを自動的に分析して、パフォーマンスの問題、動作の問題、セキュリティの脆弱性を解決し、実行可能な提案を提供いたします。基盤となる実装において、OpenResty XRay は弊社の Y 言語によって駆動され、Stap+、eBPF+、GDB、ODB など、様々な環境下で複数の異なるランタイムをサポートしております。
著者について
章亦春(Zhang Yichun)は、オープンソースの OpenResty® プロジェクトの創始者であり、OpenResty Inc. の CEO および創業者です。
章亦春(GitHub ID: agentzh)は中国江蘇省生まれで、現在は米国ベイエリアに在住しております。彼は中国における初期のオープンソース技術と文化の提唱者およびリーダーの一人であり、Cloudflare、Yahoo!、Alibaba など、国際的に有名なハイテク企業に勤務した経験があります。「エッジコンピューティング」、「動的トレーシング」、「機械プログラミング」 の先駆者であり、22 年以上のプログラミング経験と 16 年以上のオープンソース経験を持っております。世界中で 4000 万以上のドメイン名を持つユーザーを抱えるオープンソースプロジェクトのリーダーとして、彼は OpenResty® オープンソースプロジェクトをベースに、米国シリコンバレーの中心部にハイテク企業 OpenResty Inc. を設立いたしました。同社の主力製品である OpenResty XRay動的トレーシング技術を利用した非侵襲的な障害分析および排除ツール)と OpenResty XRay(マイクロサービスおよび分散トラフィックに最適化された多機能
翻訳
英語版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!