KeepAliveの設定について

先日サーバ上で何気なくnetstatコマンドを打ってみると、自分のマシンから80番ポートに対して6コネクション確立しているのに気づいた。どうやらFirefoxが1サーバに対して最大6コネクション確立するように設定されてるらしい。リクエストをパラレルで実行することでダウンロードに必要な時間を短縮しているのだろう。

ここで、1ユーザに6コネクション要求される状況でWebサーバにKeepAliveを設定する意味があるのか疑問に思った。

まず、1ページあたりのファイル数が6以下の場合、各コネクション毎に1度のリクエストでページ構成要素のダウンロードが完了してしまうので、KeepAliveは意味がないだろう。ファイル数が12の場合でも、1コネクションあたり2ファイルしか送信されないので御利益は小さい。

1ページあたりのファイル数が多い場合やAjaxで断続的に多数のリクエストを投げる場合、KeepAliveは有効だが、そうでないなら要らないだろう(ただし最近のブラウザからアクセスされる場合、古いブラウザは別、以前のFirefoxは最大2コネクションまでだったらしい)。

また、1回のページアクセスで1ユーザあたり平均6コネクション確立されると仮定すると、ApacheのMaxClientsが500の場合、同時にアクセスできるのは83ユーザまでとなる。そしてKeepAliveTimeoutが15秒となっていると、毎秒5ユーザを越えるアクセスで接続数がMaxClientsに達してしまい、アクセスしずらい状況になってしまう。

KeepAliveTimeoutが15秒というのは長すぎる。最近はほとんどのユーザがブロードバンド接続なので1ページの表示に15秒もかからない。ページを構成するリソースの数が多い場合は、KeepAliveTimeoutを全リソースのダウンロードに要する平均時間まで短くすると良いだろう。平均2秒以内で完了するならば、KeepAliveTimeoutは2でいい。これならば1ユーザが6コネクション確立してきても毎秒42ユーザまで接続できる。

何にも考えずにオンオフすればいいというものではない。サイトのページの作りやアクセス状況に合わせて設定する必要がある。