• ログイン今すぐ開始

本書は、お客様のご参考のために原文の英語版を機械翻訳したものです。

英語版と齟齬がある場合、英語版の定めが優先するものとします。より詳しい情報については、本リンクをご参照ください。

問題を作成する

長時間実行される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 © 2022 New Relic株式会社。

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