問題
長時間実行されるタスクがあるアプリケーションでPHPAgentを使用すると、メモリ使用量が高くなります。
解決
分散トレースをサポートするには、PHPエージェントは、スパンを可能な限り正確にサンプリングできるように、実行時に大量の関数呼び出しデータを保持する必要があります。 Webトランザクションおよびより短いバックグラウンドトランザクションの場合、これはCPUとメモリのオーバーヘッドの両方の観点から一般的に目立たないものです。ただし、バックグラウンドトランザクションが長くなると、メモリ不足状態になるまで、メモリオーバーヘッドの増加が顕著になる場合があります。
影響を受けるトランザクションが、メッセージキューコンシューマーや複数の外部呼び出しを伴うループなど、一連の反復プロセスを実行するトランザクションである場合は、各反復を個別のトランザクションとして手動でインストルメント化することをお勧めします。これにより、使用されているメモリは各トランザクションの後に解放されます。
トランザクションを手動で開始および停止することには、次の利点があります。
- すべてのPHPエージェント機能を有効のままにしておくことができます。
- プロセスの動作に関するより詳細なデータを提供します。
これを実装するには、まずnewrelic_end_transaction()
による最初の自動トランザクションを無視し、次にnewrelic_start_transaction()
とnewrelic_end_transaction()
を使用して各トランザクションを順番に計測します。
次のコード サンプルは、これを行う方法を示しています。実際のコードでは、 while()
構造を適切な PHP ループ ステートメントに置き換え、省略記号の代わりに関数ロジックを挿入します。
function example_long_task() { // Ensure PHP agent is available and // stop recording the current transaction if (extension_loaded('newrelic')) { newrelic_end_transaction(); }
// replace next while statement with actual loop while (<condition>) { if (extension_loaded('newrelic')) { // start recording a new transaction newrelic_start_transaction(ini_get("newrelic.appname")); transaction }
// your function logic starts ... ... // your function logic stops
// end transaction for current loop if (extension_loaded('newrelic')) { newrelic_end_transaction(); } }}