web-dev-qa-db-ja.com

「合計1000の子」の後のApacheパフォーマンスの問題ApacheはHTTP要求に応答しなくなりました。 MaxClientsの問題ではありませんか?

先週、「問題」がどこにあるのかを突き止めようとしていたので、誰かが私を正しい方向に向けてくれることを願っています。Apacheユーザーのメーリングリストに投稿しようとしましたが、ここでバウンスしたいと思いました。同じように。

CentOS5.8でApache2.2.3mod_phpを実行します。

同時に、トラフィックが多い毎日、ApacheがHTTPリクエストに応答しなくなるという問題が発生しています。

標準のMaxClientsに到達する問題のように聞こえましたが、そうではないようです。

また、この時間中にマシンにログインすると、負荷の平均は1未満になり、まだ十分なRAMが利用可能です。

/ var/log/httpd/error_logを確認すると、次のパターンに気づきました。

_[Mon Apr 30 07:00:34 2012] [info] server seems busy, (you may need to increaseStartServers, or Min/MaxSpareServers), spawning 32 children, there are 0 idle, and 905 total children
[Mon Apr 30 07:00:35 2012] [info] server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers), spawning 32 children, there are 0 idle, and 937 total children
[Mon Apr 30 07:00:36 2012] [info] server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers), spawning 32 children, there are 0 idle, and 969 total children
[Mon Apr 30 07:00:37 2012] [info] server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers), spawning 32 children, there are 35 idle, and 1001 total children

[Mon Apr 30 07:00:42 2012] [debug] mpm_common.c(663): (70007)The timeout specified has expired: connect to listener on [::]:80 <br>
[Mon Apr 30 07:00:49 2012] [debug] mpm_common.c(663): (70007)The timeout specified has expired: connect to listener on [::]:80 <br>
[Mon Apr 30 07:00:56 2012] [debug] mpm_common.c(663): (70007)The timeout specified has expired: connect to listener on [::]:80 <br>
[Mon Apr 30 07:01:03 2012] [debug] mpm_common.c(663): (70007)The timeout specified has expired: connect to listener on [::]:80 <br>
_

_1000 total children_の直後に1日に数回、Apacheが応答を停止し、再び動作するために再起動する必要があります。

数週間前からerror_logを確認しましたが、同じパターンです。サーバーは合計1000の子にヒットし、すぐに[debug] mpm_common.c(663): (70007)The timeout specified has expired: connect to listener on [::]:80エラーメッセージを吐き出し、応答を停止します。

それでも、サーバーの負荷は非常に低いです...単純なindex.htmlファイルを要求しようとしても、タイムアウトします。

設定の関連セクションは次のとおりです。

_Timeout 45
KeepAlive On
MaxKeepAliveRequests 10000
KeepAliveTimeout 3

<IfModule prefork.c>
StartServers      80
MinSpareServers   50
MaxSpareServers  120
ServerLimit     3500
MaxClients      3500
MaxRequestsPerChild  2000
</IfModule>
_

Apacheがさらにリクエストの処理を停止する前に、Apacheが到達できる子のマジックナンバーが1000である理由を知っている人はいますか?

または、_(70007)The timeout specified has expired: connect to listener on [::]:80_メッセージを理解する方法は?

「指定されたタイムアウト」とは何ですか?

Max Open Filesを再確認しました。以前は1024でしたが、現在は16384で、同じ問題が発生しています。

4
Jerome

ロングショットですが、こんな問題がありました。それがどのようなエラーメッセージであったかを正確に覚えていませんが、問題の理由は常にバグが多いPHPプログラムが再帰的なリクエストを作成しました(つまり、プログラムがURLをリクエストし、それが次に同じURLを要求するなど)。これは、たとえばErrorDocument設定に関連して見たもので、エラーを処理するはずのドキュメントにバグがあるか存在せず、エラーが発生しました。

これがaccess.logの問題である可能性があるかどうかを簡単に確認できます。サーバーのIPアドレスからのリクエストが非常に短時間で大量に発生するはずです。これは、MaxClients設定に達するまで、またはシステムのリソースがなくなるまで機能します。唯一の修正は、問題のPHPプログラムを修正することです。

1
Oliver

ApacheのKeepAliveがオンになっているかどうか、およびKeepAliveTimeoutの値を確認してください。実際には3秒を超えてはなりません。その間、クライアントに割り当てられた特定のプロセス/スレッドを保持します。

次に、1000のhttpdのconf dirをgrepして、その番号がどこかに設定されているかどうかを確認します。

grep -r '1000' /etc/httpd/conf
grep -r '1000' /etc/httpd/conf.d

それとは別に、phpコードが(間違って)それを処理している各プロセス/スレッドを無期限に存続させており、それらが不足している場合があります。

0
rightstuff
Timeout 45 

このタイムアウトを参照していると思います。何かが接続を開いてから何もしていない(つまり、クライアントが接続を開いた後に何も送信していないか、クライアントにデータを書き込んだ後にスクリプトが接続を閉じていない)可能性があり、Apacheは待機しますあきらめる45秒前。次に、接続を閉じます。これを下げると、Apacheは不発接続の試行をより早くタイムアウトしますが、より良い解決策は、そもそもなぜこれが発生するのかを判断することです。

http://httpd.Apache.org/docs/2.1/mod/core.html#timeout

たぶん、一般的なパフォーマンスの問題についてもこのページをチェックしてください。

http://httpd.Apache.org/docs/current/misc/perf-tuning.html

0
webtoe