• English日本語한국어
  • ログイン今すぐ開始

この機械翻訳は参考用に提供されます。

英語版と翻訳版に矛盾がある場合は、英語版が優先されます。詳細については、こちらのページをご覧ください。

問題を作成する

長時間実行されるPHPタスクでの高いメモリ負荷

問題

長時間実行されるタスクがあるアプリケーションで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();
}
}
}
Copyright © 2024 New Relic Inc.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.