2013年4月13日土曜日

Apache の KeepAliveTimeout の設定

Apache を利用している Web システムが、突然レスポンスが返ってこなくなる、あるいは異常に遅い、こんなトラブルに遭遇した経験はないでしょうか?


・サーバが死んでいるわけではない。
・サーバ負荷が高いわけでもない。
・ブラウザでアクセスしたときは、レスポンスがなかなか返ってこない。

このようなレスポンス遅延の症状が出たとき、考えられる原因はいくつかあるのですが、可能性が高い原因として Apache の KeepAliveTimeout の設定があります。

KeepAliveTimeout は、1つのクライアント(ブラウザ)が、コネクションを占有できる時間を設定します。通常ブラウザが Web ページにアクセスしたときは、HTML ページをロードした後、そこから参照される CSS や画像等のファイルを次々と読み込むことになります。このとき、最初の HTML ページをロードする際に使用していたコネクションを解放せず、その後のファイルの読み込みにもそのコネクションを利用したほうがはるかに効率的です(なぜならネットワーク処理において、コネクションの確立が一番コストのかかる処理だからです)。このため、KeepAliveTimeout の設定は、1ページの読み込みにかかる時間+α程度の時間を設定するのが定石です。

ところが、Apache の KeepAliveTimeout のデフォルトの設定は、バージョン2.0で15秒、バージョン2.2で5秒です。特に古い Apache の設定を引き継いで、15秒に設定しているようなサイトは要注意です。

KeepAliveTimeout が長いということは、ブラウザがページ読み込み後も、無駄にコネクションを占有しているということです。そして当然コネクション数は無限ではありません。コネクション数はMaxClients で設定されますが、デフォルトでは 256 程度です。

もし KeepAliveTimeout が 15 秒で、MaxClients が 256 、その環境に同時に 300 人が接続してきたとします。この場合、まず 256人だけが最初に処理されます。しかし残りの 44 人は、サーバのリソースに余裕があったとしても、15秒間待たされることになります。

レスポンス遅延の原因は他にもいろいろあるのですが、それままたの機会に。。。


0 コメント:

コメントを投稿