web-dev-qa-db-ja.com

膨大な数のhttpdプロセスを生成するApache

シンプルなWebサーバーセットアップ(Apache/2.2.15、PHP/5.3.3、MySQL/5.1.66)でCentOS 6.7マシン(16 GB vRAM、8 vCPU)を実行しており、適度な数のオンラインショップをホストしています。ページインプレッション(1日あたり約2,000〜4,000)。

サーバーは、構成を変更する必要なしに、過去3年間スムーズに稼働しました。さて、先週から-どういうわけか一晩-Apache/HTTPは、短い時間(約30分)後に繰り返しアクセスできなくなります。いくつかのパラメーターを確認したところ、実行中のhttpdプロセスがたくさんあることがわかりました。 ps axf | grep httpd | wcは次のようなものを示しています:

387    2344   18354

一方、負荷はそれほど刺激的ではありません。 topは次のようになります:

enter image description here

非常に少数のhttpdプロセスが時々リリースされますが、総数はほぼ常に増加し続けます。 service httpd reloadを実行すると、プロセスの数は0に戻り、次の数分から数時間で再び増加し始めます。しばらくすると、Apacheのログに次のように表示されます。

[error] server reached MaxClients setting, consider raising the MaxClients setting

私はこれを行い、さらに別の構成パラメーターを調整しましたが、役に立ちませんでした。 MaxClientsServerLimitがどのような値に設定されていても、Apacheはこれらの制限まで新しいhttpdプロセスを生成するために停止しません。この後、Webサイトにアクセスできなくなります。

AWStatsによると、ページヒットの増加はありませんでした。さらに、PHPアプリケーションには変更が1つもありません。30分後にすべての要求をブロックする内訳を除いて、Webサイトは通常どおり高速に実行されます。ダーティで一時的な回避策として、Cronはリロードを続けますApache半時間。

プレフォーク/ワーカーの設定は、過去3年間で次のとおりです。

<IfModule prefork.c>
StartServers       4
MinSpareServers    5
MaxSpareServers   10
ServerLimit      128 
MaxClients       128 
MaxRequestsPerChild  600
</IfModule>

<IfModule worker.c>
StartServers         2
MaxClients         150
MinSpareThreads     25
MaxSpareThreads     75 
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>

私はそれらを次のように育てました:

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   10
ServerLimit       640
MaxClients       640
MaxRequestsPerChild  1000
</IfModule>

<IfModule worker.c>
StartServers         4
MaxClients         300
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>

この変更後、Apache/HTTPは約1時間後に使用できなくなりました。

これはどのようにして突然起こるのでしょうか。また、この奇妙な動作がどこから発生したのかをさらに調査するためにどのようなオプションが必要ですか。

3
proximus

まず、preforkパラメータを増やすと、状況が悪化するだけです。したがって、以前の構成を復元します。

Preforkの問題や設定ミスを排除するには、無効にしてみてください。状況は大きく変わりますか?もしそうなら、あなたはあなたの問題を見つけます。

そうでない場合、問題は外部要因に関連しています。たとえば、一部のボット/スクリプトがWebサイトをターゲットにしており、(相対的なhttpdプロセスで)多くの接続を開いています。この場合、Apacheログファイルからそれを確認できるはずです。

これが十分でない場合は、mod_statusモジュールを有効にして詳細な統計を表示できます。次に、apachectl fullstatusを発行して、これらの統計にアクセスします。詳細は here および here を参照してください。

2
shodanshok