
の出力を見ると、top
断続的に1つまたは2つのApacheプロセスがCPUを大量に消費していることがわかります(50%から90%の間)。
CPU 使用率の急上昇は、約 10 秒ごとに非常に急速に発生し、すぐに消えます。
他にも2%~4%を消費するApacheプロセスがいくつか実行されています。
これらのプロセスの原因となっている仮想ホスト/Web サイトを追跡するために、さまざまな方法を調べました。ただし、これらのプロセスはすぐに発生して消えてしまうため、信頼できる方法を見つけることができません。
lsof
試してみましたserver-status
が、プロセスが長く続かないため、プロセス ID が再利用され、問題の原因となっている仮想ホストに結び付けることができません。
たとえば、lsof
問題のプロセス ID で実行すると、過去数秒間にそのプロセス ID を共有した 12 個の異なる仮想ホスト ログ ファイルが一覧表示されます。問題のある仮想ホストが 1 つあると確信していますが、どれが問題なのかわかりません。
MySQL のスロー クエリ ログも確認しましたが、興味深いことは何も見つかりませんでした。
答え1
私の推奨事項: ログに応答時間を追加します。
スパイクの原因となっているリクエストが他のリクエストよりも処理に時間がかかるという保証はないため、これは完璧ではありませんが、その可能性は高く、調査の出発点となります。
これを実行するには、%Dパラメータを含む新しいLogFormatとCustomLogを定義する必要があります。Apachemod_log_config ドキュメント。
おそらく少し低レベルすぎるが、負荷の性質を知るのに役立つもう1つのオプションは、Apacheの親プロセスをstraceし、子プロセスを追跡するには-f、呼び出しごとのCPU時間を表示するには-cを使用することです。例:strace -f -c -p <apache parent pid>
最も時間がかかっているシステム コールがわかれば、それらを直接追跡できます。たとえば、サーバーが write() の実行に多くの時間を費やしているとしたら、 を実行してstrace -f -e trace=write -p <apache parent pid>
、それらの呼び出しをより詳細に調べることができます。