Blogs

keep-aliveのことをちゃんと考える

keep-aliveについての簡単な解説

1つのWebページをブラウザが表示するにあたっては、メインのhtmlファイルに加えて、そのhtml上に記述された画像、css、javascript等のファイルをサーバーからダウンロードする必要があります。画像が多いページの場合、1個のhtmlに対して100も200も画像をダウンロードする必要があります。もしkeep-aliveを使用しないとそのすべてのリクエストについて、別々のTCP接続の開始・切断を行うことになってしまいます。keep-aliveを利用すると、通常一つのブラウザからのリクエストを一つのTCP接続で処理することができます。

TCP/IPのコネクションについては、以下のサイトにわかりやすく解説されています。

Apacheで、KeepAliveを有効とするか否かを決定するのが「KeepAlive」ディレクティブです。 KeepAliveの設定は「MaxKeepAliveRequests」ディレクティブと「KeepAliveTimeout」ディレクティブで指定します。

  • MaxKeepAliveRequests
    • 接続してから切断するまでに受け付けるリクエストの数
  • KeepAliveTimeout
    • 接続しているセッションからのリクエストが来なくなってから切断するまでの待ち時間

KeepAliveはそもそもONにすべきか、OFFにすべきか

通常はONにすべきというのがほとんどの意見だと思います。

でも「sanonosaシステム管理コラム集」のような意見もあるようです。

ほんとうのところはどうなんでしょうか?

上記の記事ではIISのようですし、設定値が記述されていないので なんとも言えません。

  • KeepAliveの MaxKeepAliveRequestsを必要以上に大きくしすぎること
  • KeepAliveの KeepAliveTimeoutを必要以上に大きくしすぎること

はTCPコネクションを無駄遣いしてしまうことは間違いありません。

そもそもKeepAliveをONにすることはTCPコネクションを無駄遣いしないようにしているのですから本末転倒ということになってしまいます。

ブラウザからの一連の接続が終了したら出来る限り素早くTCPコネクションを切断することが望ましいわけです。しかし、MaxKeepAliveRequestsやKeepAliveTimeoutの設定は固定値であり、接続毎に動的に変更することは出来ません。

※「リクエスト間隔を考慮したウェブサーバのkeep-alive 時間の自動設定」という論文が日本ソフトウェア科学会第22 回大会(2005 年度)論文集に記載されています。興味のある方は読んでみて下さい。

対象のサイトに対するリクエストの平均的な要求値を算出して、

  • MaxKeepAliveRequestsは、一回の(一連の)リクエストあたりの要求ファイル数より少し多く設定する
  • KeepAliveTimeoutは、一回の(一連の)リクエストあたり空き時間より少し長く設定する

のがやはり正解かなと思います。

例えばユーザがインターネットに接続する帯域が細いと一回の(一連の)リクエストあたり空き時間は長くなります。

実際のサイトの計測は、Web DeveloperのNETオプションを利用すれば簡単に算出できます。
※これは一回あたりの実測ができるだけで、平均となるとアクセスログからなんらかのスクリプトを作成して算出する必要がありますが。

仮に、一回の(一連の)リクエストがファイル数で50個、全部で1秒以内で終了するとします。

にも関わらず、

  • MaxKeepAliveRequests 100
  • KeepAliveTimeout 15

とされていたとすると、そのTCPコネクションは15秒の間、無駄になってしまう訳です。

2種類のリクエストが混在すること

我々が開発するような動的ページを中心としてサイトの場合、一回の(一連の)リクエストは通常

  • プログラムによる動的なhtmlの生成

数百ミリ秒~数秒を要する
通常は一連のリクエスト中の最初の一回

  • 上記のhtmlから参照される静的コンテンツ(css,javascript,画像等)

数ミリか数10ミリ秒以下の場合が多い
リクエスト数が多い(数10個以上)

の2種類から成り立ちます。

次回に続きます

kajiwarakeep-aliveのことをちゃんと考える