CPU使用率の高いApacheプロセスが実際に何をしているのかを調べますか?


18

現在、サーバーにいくつかの問題があり、断続的に、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- gdbからのバックトレース(bt)は、PHPが--enable-debugで設定されていない場合、それほど有用ではないようです-「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 ()

1
Apacheは「グレースフル」再起動をサポートしていますが、なぜそうしないのでしょうか?
poige

1
私が考えて、我々は以前にそれを試みたとき、それはそれは間違っているかもしれないが、それはしばらく前だった...優雅ため「スタック」apacheのプロセスの再起動ができませんでした。
BT643

別のトリックは、別のポートでapacheの別のインスタンスを実行し、新しい接続をリダイレクトすることです。
poige

回答:


9

さて、あなたが勇気を持っている場合:

gdb -p 20788

次にbt、例えば、スタックフレームを見るために発行します

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

UPD。:まあ、まあ、Apacheが実際に何かを実行しているという考えを持っているので、なぜmod_status出力を見ないのですか?拡張されたものですか?


GDBがインストールされていない:(私はすべての問題を引き起こすことなく、それをインストールすることができるかどうかを確認するために、明日仕事に戻るまで待つ必要があります。.. ltraceいずれかの任意の出力を表示しませんでした。
BT643

gdb btからの結果を最初の投稿に追加しただけです。
BT643

ああ、私は正しい方向を提案してくれてうれしいです。)
poige

@ BT643、UPDを参照してください。
poige

4
実現されたmod_statusはデフォルトですでに有効になっており、127.0.0.1からのアクセスに制限されていました。SSH経由でログインし、出力をファイルにパイプしてから、ファイルcurl domain.com/server-status > randomfile.htmlを表示しました。結局のところ、古い開発者のコ​​ードがループ(PHPファイル)で動けなくなることが判明しました!すべてがソートされました。助けてくれてありがとう:)
BT643

2

非常に簡単なアプローチはを使用することhtopです。CPU使用率の高いプロセスをソートしてから使用できます

  • 以下のためのstraceプロセス
  • l lsofプロセスの開いているファイルを表示するため
  • Lからltrace

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


1

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

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

0

そのPIDをトリガーするHTTP要求を作成すれば、コマンドは機能するはずです。

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


子プロセスが1つしかないということは、Apacheが単一の要求しか処理できないことを意味し、その単一の子がスタックしていると、Apacheは要求を処理できません。
ステファンLasiewski

数百人の同時ユーザーがいるライブサーバーであるため、これを行うことはできません(以前は明確ではなかったため、OPに追加しました)
BT643

0

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


PIDが低いからといって、必ずしも古いプロセスであるとは限りません。PIDには最大値があり、低いPIDを使用して新しいプロセスを作成できるようにラップアラウンドします。
オーストラリアの

0

これを試して:

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

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

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


これは興味深い解決策ですmod_statusが、その仕事が非常にうまくいくことを考えると、価値があるよりも多くのリソースを消費していることがわかります。
オーストラリアの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.