実稼働環境:mod_php
64 ビット Linux でApache 2.2 と 5.3 を実行しているワーカー マシンのクラスターの前にあるロード バランサー/HTTP リバース プロキシ。すべてのワーカー マシンは、完全にカスタム化された同一の PHP コードを実行し、単一のバックエンド PostgreSQL データベースと通信します。PHP コードは、データベースとの対話に CPU を費やすように最適化されています。データベース マシンにはまだ多くのアイドル状態があることが確認されています。
私が探しているもの: PID によって PHP プロセスにアタッチし、定期的にプロセスを停止し (例: を使用SIGSTOP
)、メモリ インスペクションを介して PHP スタックを収集し、プロセスを続行できるサンプリング プロファイラー (例: を使用SIGCONT
)。停止期間は調整可能ですが、停止間隔は 1 ~ 10 ms 程度にする必要があると思います。
単一のワーカー マシンの PHP プロセスは、常に 100 ミリ秒未満で単一の要求を実行することが期待されます。私は主に、100 ミリ秒以上かかるプロセスのプロファイル データを収集することに関心があります。最良のシナリオは、リクエストの開始時に通知されるサンプリング プロファイラーであり、リクエストを処理する PHP プロセスがまだ 100 ミリ秒後に実行されている場合は、1 ミリ秒間隔でサンプルの収集を開始します。このようにして、通常実行中のプロセスは中断することなく最後まで実行され、問題のあるケースのプロファイルを引き続き取得できます。
この種の PHP 用のサンプリング プロファイラーは存在しますか? 意図は、オーバーヘッドが高すぎてインストルメンテーションが統計を台無しにするため、インストルメント化プロファイラーを使用しないことです (そこにありましたが、それを行いました)。
私はすでに XHProf と Xdebug を認識していますが、私が知る限り、どちらもプロファイラーを計測しており、PHP プログラムの実際のオペコードに影響を与えています。代わりに、通常の PHP オペコードを実行するものを強く希望します。
私が知っている最も近い方法は、PHP コードを HipHop で実行し、C/C++ コードにサンプリング プロファイラーを使用することですが、まだソフトウェアを HipHop に移植する準備ができていません。その場合、プロファイリングの結果は、mod_php ではなく HipHop のみを代表するものになります。