シンプルな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
は次のようになります:
非常に少数のhttpdプロセスが時々リリースされますが、総数はほぼ常に増加し続けます。 service httpd reload
を実行すると、プロセスの数は0に戻り、次の数分から数時間で再び増加し始めます。しばらくすると、Apacheのログに次のように表示されます。
[error] server reached MaxClients setting, consider raising the MaxClients setting
私はこれを行い、さらに別の構成パラメーターを調整しましたが、役に立ちませんでした。 MaxClients
とServerLimit
がどのような値に設定されていても、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時間後に使用できなくなりました。
これはどのようにして突然起こるのでしょうか。また、この奇妙な動作がどこから発生したのかをさらに調査するためにどのようなオプションが必要ですか。
まず、preforkパラメータを増やすと、状況が悪化するだけです。したがって、以前の構成を復元します。
Preforkの問題や設定ミスを排除するには、無効にしてみてください。状況は大きく変わりますか?もしそうなら、あなたはあなたの問題を見つけます。
そうでない場合、問題は外部要因に関連しています。たとえば、一部のボット/スクリプトがWebサイトをターゲットにしており、(相対的なhttpdプロセスで)多くの接続を開いています。この場合、Apacheログファイルからそれを確認できるはずです。
これが十分でない場合は、mod_status
モジュールを有効にして詳細な統計を表示できます。次に、apachectl fullstatus
を発行して、これらの統計にアクセスします。詳細は here および here を参照してください。