問題の背景
New RelicでPHPのアプリケーションを監視する際にCPUが高負荷状態になった場合に確認・対処する方法についてExplorer Hubというコミュニティベースの掲示板に記事が公開されています。日本で利用されている方の中で困っている方がいるかもしれませんので、今回はこの記事の概要を紹介します。
Relic Solution: PHP Agent CPU Overhead Tips
PHPに限らずNew Relicが各言語向けに提供しているAPMのエージェントは有効にすることでシステムに深刻な影響を与えることがないように作られています。ですので、もし何か問題が発生していましたら、サポートチケットを作成いただくか先ほどのExplore Hubなどに質問をお願いします。英語はちょっと...という方はお手伝いしますので私までご連絡ください。
診断方法
さて、PHPエージェントにおいてCPUが通常よりも高負荷状態になった場合、以下のコマンドにてクロックソースの確認をお願いします。
利用可能なクロックソースを確認します。
cat /sys/devices/system/clocksource/clocksource0/available_clocksource
現在設定しているクロックソースを確認します。
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
CPUが利用可能なタイムスタンプカウンターを確認します。
cat /proc/cpuinfo | grep tsc
vDSOが利用可能か確認します。
strace php -m 2>&1 | grep gettimeofday
もし、vDSOが利用可能でない場合対処方法をご確認ください。
問題の詳細
PHPのエージェントでは、関数の開始と終了時刻を取得するのにgettimeofday()
関数を利用しています。vDSOwをサポートしていないクロックソースを利用した場合、CPU負荷が高くなる問題が発生する可能性があります。
対処方法
vDSOが利用可能なクロックソースを利用するように設定してください。例えばtsc
になります。
echo tsc > /sys/devices/system/cl*/cl*/current_clocksource
もしクロックソースの変更ができない場合、次善の策としましてCPUを利用するエージェントの設定を無効化する方法があります。newrelic.ini
ファイルに次の設定を追加してください。
newrelic.transaction_tracer.enabled = false
newrelic.transaction_tracer.detail = 0
もしこれらの方法で改善されない場合、さらに詳細な調査が必要となりますのでお問い合わせください。