現在、サーバーにいくつかの問題があり、断続的に、100%のCPUを占有するだけで実行されるApacheプロセスが表示されるようです。
Topを実行すると、次のようになります。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20788 www-data 20 0 318m 18m 3984 R 100 0.0 40:29.21 /usr/sbin/Apache2 -k start
23523 www-data 20 0 319m 20m 4684 R 100 0.0 4:12.36 /usr/sbin/Apache2 -k start
これを引き起こしているスクリプト(またはそれが何であれ)を調べてみたいので、試しました。
strace -p 20788
しかし、それでは何も出力されません(約10分間放置したので、何も表示されません)。私の理解では、これは無限ループに陥っており、表示する「システムコール」がないことを意味している可能性があります。
何が起こっているのかを示すために他に何かできることはありますか?
ありがとう
編集-言うまでもありませんが、これは一度に数百のユーザーがいるライブサーバーです!だから私は本当に自由に設定オプションを変更してApacheを再起動することはできません。
編集2- PHPが--enable-debugで構成されていない場合、gdbからのバックトレース(bt)はそれほど有用ではないようです。 「execute()」を示していますが、PHPスクリプトが実際に実行されていることを知る必要があります。他の方法はありますか?
#0 0x00007f6c143fb0c5 in ?? () from /usr/lib/Apache2/modules/libphp5.so
#1 0x00007f6c143b040b in execute () from /usr/lib/Apache2/modules/libphp5.so
#2 0x00007f6c1438b970 in zend_execute_scripts () from /usr/lib/Apache2/modules/libphp5.so
#3 0x00007f6c14337fe3 in php_execute_script () from /usr/lib/Apache2/modules/libphp5.so
#4 0x00007f6c1441ae7d in ?? () from /usr/lib/Apache2/modules/libphp5.so
#5 0x00007f6c18912508 in ap_run_handler ()
#6 0x00007f6c1891297e in ap_invoke_handler ()
#7 0x00007f6c18922570 in ap_process_request ()
#8 0x00007f6c1891f398 in ?? ()
#9 0x00007f6c18918fa8 in ap_run_process_connection ()
#10 0x00007f6c189271d0 in ?? ()
#11 0x00007f6c1892793a in ?? ()
#12 0x00007f6c189284e7 in ap_mpm_run ()
#13 0x00007f6c188fd4a4 in main ()
まあ、あなたが勇気を感じている場合のために:
gdb -p 20788
次に、bt
を発行して、スタックフレームを表示します。 g。
ところで、 ltrace
もあります。試してみてください。
UPD。:さて、わかりました。Apacheが実際に何かを実行しているという考えがあるので、なぜ mod_status
出力— 拡張 1?
非常に簡単な方法は、htop
を使用することです。 CPU使用率の高いプロセスを並べ替えて使用できます
strace
プロセスのslsof
for the open files of a processesltrace
へ。そのオプションの少なくとも1つが負荷を生成するスクリプトを検出することを発見しました。もちろん、これを運用Webサーバーで使用してデバッグできます。
あなたは試すことができます:
コマンドは、そのPIDをトリガーするHTTPリクエストを行うことを条件に機能するはずです。
たぶん、たった1つの子プロセスでApacheを一時的に再構成したいですか?
そのApacheインスタンスのPIDは低く、それはすべての父親である可能性があります。それは確かに高いCPU使用率を説明します(それはそのままです、他のものは負荷に応じて生成され、リコールされます)。累積されたCPU時間の多くは、長時間実行されていることを意味するだけかもしれません。 strace(1)
からの出力がない場合は、システムコールが実行されなかったことを意味します。はい、それはタイトなループにある可能性がありますが、Apacheは本質的に「ネット上のI/Oであるため、有用なことは何もしていないと思います。いずれにしても、1つのCPUの100%が奇妙です。
これを試して:
1)日付/時刻、PHPスクリプト、およびgetmypid()
を使用したPIDでログを開始します
2)次に、top
を使用してサーバーを監視します
3)Apacheプロセスが高くなっていることを確認したら、同じ日付/時刻とPIDをログで検索します。問題のあるスクリプトを見つけることができるはずです。