web-dev-qa-db-ja.com

高CPUのApacheプロセスを特定の仮想ホストまで追跡する方法

topの出力を見ると、断続的に1つまたは2つのApacheプロセスが大量のCPUを消費していることがわかります(50%から90%の間のどこか)

CPU使用率の急上昇は、10秒程度ごとに非常に速く行き来します。

2%から4%の間のどこかを消費する他のさまざまなApacheプロセスが実行されています

私は、どの仮想ホスト/ウェブサイトがこれらのプロセスを担当しているかを追跡するためのさまざまな方法をすべて調査しました。しかし、彼らはすぐに行き来するので、私はこれを行うための信頼できる方法を見つけることができません。

lsofを試し、server-statusの出力も確認しましたが、プロセスが長続きしないため、プロセスIDが再利用され、仮想ホストに関連付けることができません。問題の原因です。

たとえば、問題のプロセスIDでlsofを実行すると、過去数秒間にそのプロセスIDを共有した12の異なる仮想ホストログファイルが一覧表示されます。障害のある仮想ホストが1つあると確信していますが、どれが原因かわかりません。

MySQLの低速クエリログも確認しましたが、これでは何もわかりません。

4
MrCarrot

私の推奨事項:ログに応答時間を追加します。

スパイクの原因となるリクエストの処理に他のリクエストよりも時間がかかるという保証はないため、完全ではありませんが、可能性が高く、調査の開始点になります。

これを行うには、%Dパラメーターを含む新しいLogFormatとCustomLogを定義する必要があります。 Apache mod_log_configドキュメント を参照してください。

おそらく少し低レベルですが、負荷の性質を理解できる可能性がある別のオプションは、Apacheの親プロセスを-fでトレースして子を追跡し、-cで呼び出しごとのCPU時間を表示することです。 、例えばstrace -f -c -p <Apache parent pid>

最も時間がかかっているシステムコールがわかったら、それらを直接追跡できます。たとえば、サーバーがwrite()の実行に多くの時間を費やしている場合、strace -f -e trace=write -p <Apache parent pid>を実行して、それらの呼び出しをより詳細に調べることができます。

2
Alex Forbes