を使用して、Apache 2.2サーバー(Ubuntu Server 10.04、8x2GHz、12Gb RAM)でPHP Webアプリケーションを実行しprefork
ます。Apacheは毎日約10万から20万のリクエストを受け取り、そのうち約100から200がタイムアウト制限に達するため(1000に1つ程度)、他のほとんどすべてのリクエストはタイムアウト以下で処理されます。
これが起こる理由を知るにはどうすればよいですか?または、すべてのリクエストの一部がタイムアウトするのは正常ですか?
これは私がこれまでにやったことです:
ご覧のように、タイムアウト制限とより合理的な要求の間にある要求はほとんどありません。現在、タイムアウト制限は50秒に設定されていますが、以前は300に設定されていましたが、タイムアウトが発生してから他のリクエストとのギャップが大きくなるという状況は変わりませんでした。
タイムアウトするAJAX
リクエストはすべてリクエストですが、その大部分はリクエストであるため、おそらく偶然でしょう。Apacheの戻りコードは200
ですが、タイムアウトの制限に明らかに達しました。それらは広範囲の異なるIPからのものです。
タイムアウトするリクエストを見てきましたが、1秒もかからずに同じリクエストを処理する場合、特別なことは何もありません。
さまざまなリソースを調べて、原因を見つけることはできるが、運はないかどうかを確認しようとしました。常に十分な空きメモリがあり(最小は約3GB空き)、負荷は1.4に達することがあり、CPU使用率は40%になりますが、負荷とCPU使用率が低い場合にタイムアウトの多くが発生します。ディスクの書き込み/読み取りは、日中ほぼ一定です。MySQLスロークエリログにはエントリがありません(1秒を超えるものをログに記録するように設定されています)。
青はCPU使用率で、ピークは40%、マルーンは負荷が1.4の負荷です。そのため、CPU使用率/負荷が低い場合でもタイムアウトが発生することがわかります(10秒のスパイクはCPU使用率によく対応しますが、別の問題であり、それらの原因を突き止めることを期待しています)。
Apacheエラーログにエラーはなく、200を超えるアクティブなApacheプロセスに到達するのを見たことはありません。
サーバー設定:
Timeout 50
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2
<IfModule mpm_prefork_module>
ServerLimit 350
StartServers 20
MinSpareServers 75
MaxSpareServers 150
MaxClients 320
MaxRequestsPerChild 5000
</IfModule>
更新:
Ubuntu 12.04.1にアップデートしました。念のため、変更はありません。mod_reqtimeoutに設定を追加しました:
RequestReadTimeout header=20-40,minrate=500
RequestReadTimeout body=10,minrate=500
現在、ほとんどすべてのタイムアウトは10秒で発生し、1つまたは2つは20秒で発生します。ほとんどの場合、受信に問題のあるリクエストボディを取得しているということです。要求の本文は、数百バイトを超えてはなりません。1秒ごとにネットワークトラフィックを監視しましたが、1Mbit / sを超えることはなく、サーバーが1Gbit / sの回線上にあるように思えるので、rxerrsまたはrxdorpsが表示されません。 HopelessN00bについて投稿しました。ユーザー接続が悪い場合がありますか?
1時間ごとのスパイクの場合(上のグラフでは1時間を33分経過しているが、現在は12分経過している)、私は定期的に実行されているものがあるかどうかを確認しようとしました( cronsなど)が見つかりませんでした。PHPガベージコレクションは1時間に2回実行されますが、スパイク時ではなく、それを無効にしてみましたが、違いはありません。
dstatを--top-cpuおよびtopとともに使用して、スパイク発生時のプロセスを確認しました。表示されるのは、apacheが数秒間一生懸命に動作することだけですが、他のプロセスは重要なCPUを使用していません。
スパイクの拡大グラフを作成しました:
私には、Apacheが数秒間停止し、停止中に着信したリクエストを処理するために懸命に働くように見えます。そのような停止の原因は何ですか、それとも誤解していますか?