web-dev-qa-db-ja.com

CPU使用率が高いApacheプロセスが実際に何をしているのか調べてください。

現在、サーバーにいくつかの問題があり、断続的に、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 ()
19
BT643

まあ、あなたが勇気を感じている場合のために:

gdb -p 20788

次に、btを発行して、スタックフレームを表示します。 g。

ところで、 ltrace もあります。試してみてください。

UPD。:さて、わかりました。Apacheが実際に何かを実行しているという考えがあるので、なぜ mod_status 出力— 拡張 1?

9
poige

非常に簡単な方法は、htopを使用することです。 CPU使用率の高いプロセスを並べ替えて使用できます

  • straceプロセスのs
  • l for lsof for the open files of a processes
  • Lからltraceへ。

そのオプションの少なくとも1つが負荷を生成するスクリプトを検出することを発見しました。もちろん、これを運用Webサーバーで使用してデバッグできます。

2
abuzze

あなたは試すことができます:

  • iotop(システムのI/Oを表示)
  • netstat -t(接続を表示)
  • Apacheログファイルを見て、サーバーが最後に何をしたかを調べてください
  • apacheプロセスにいくつかのRLimitを設定します。これらの制限に達すると、プロセスが強制終了され、いくつかの詳細情報が提供されます
2
Kai Bojens

コマンドは、そのPIDをトリガーするHTTPリクエストを行うことを条件に機能するはずです。

たぶん、たった1つの子プロセスでApacheを一時的に再構成したいですか?

0
Harry Slaughter

そのApacheインスタンスのPIDは低く、それはすべての父親である可能性があります。それは確かに高いCPU使用率を説明します(それはそのままです、他のものは負荷に応じて生成され、リコールされます)。累積されたCPU時間の多くは、長時間実行されていることを意味するだけかもしれません。 strace(1)からの出力がない場合は、システムコールが実行されなかったことを意味します。はい、それはタイトなループにある可能性がありますが、Apacheは本質的に「ネット上のI/Oであるため、有用なことは何もしていないと思います。いずれにしても、1つのCPUの100%が奇妙です。

0
vonbrand

これを試して:

1)日付/時刻、PHPスクリプト、およびgetmypid()を使用したPIDでログを開始します

2)次に、topを使用してサーバーを監視します

3)Apacheプロセスが高くなっていることを確認したら、同じ日付/時刻とPIDをログで検索します。問題のあるスクリプトを見つけることができるはずです。

0
phoenix