Apache で大量アクセスが来たとき負荷を上げない設定

Apache で同時接続数の設定(2.2 では MaxClients、2.4 では MaxRequestWorkers)より大量アクセスが来たとき負荷を上げないためのちょっとした工夫について書きます。

MaxClients をいくら下げてもサーバー負荷が下がらないじゃないか!とお困りの諸氏に …

それはとても簡単で、ListenBacklog を少なめ(例えば 1 とか)に設定します。

Apache のマニュアルには、こう書かれていますが・・・
———-
ListenBacklog
保留状態のコネクションのキューの最大長です。 一般的には調整する必要はありませんし、調整は望ましくありません。 しかし、TCP SYN フラッドアタックの状況下におかれる場合に、 増やした方が望ましいシステムもあります。 listen(2) システムコールのバックログパラメータを ご覧下さい。
———-
これを読むと、ListenBacklog は調整不要、するとしても大きくする方向で、と思ってしまいますよね。
でも違います。逆です。

Apache の挙動としては、アクセス数が MaxClients / MaxRequestWorkers を超えると、ListenBacklog の設定値の数(デフォルトは 511 )だけキューに溜められて処理待ちになります。その待ち行列が多いとサーバーの CPU負荷(Load Average)やディスクの IOWait の負荷が上がります。
そして重くなってそのうち何も処理できなくなってハング、みたいなことになります。

だったら ListenBacklog のキューに待ち行列を溜めないほうがサーバーのためです。

/etc/httpd/conf/httpd.conf

... 

# 接続待ちのキューを少なめに
ListenBacklog 1

...

追加する場所はどこでもいいですが Listen の上か下あたりが見やすいでしょう。

コメントを残す