こんばんわ。misneyです。
今回はApacheのKeepAliveについて書こうと思います。
前もって書いておきますが、私の妄想的なapache(prefork)の動きを書きます。
色々と間違った点があると思うので、鵜呑みにしないでくださいね。
KeepAliveというのは、HTTP1.1がどうのこうの・・・ということで、ステートレスがアレっていう設定です。
日本語で書くと、一度に多くの情報が得られちゃうよってな機能だと思います。
私が思うKeepAlive現在のWebページでは、色々なHTTPセッションを必要とするわけです。
・画像
・Javascript
・Flash
・動画/音楽
・CSS
1つのHTMLに100以上のファイルが存在するような場合もあり、その数だけHTTPセッションが張られるなんてことになります。
そこで「1回で全部やっちゃえばいいじゃーん」っと登場したのがKeepAliveだと思います。きっと。
何が一回かというと、こんなのです。
1. apache君「なんかリクエストが来たよ。どいつに任せようかな?」
2. apache君「よーし。ここはいっちょプロセス番号10000君に任せよう。」
3. プロセス番号10000君「はーい。このpathにある画像を送っちゃいます。」
4. プロセス番号10000君「はい。送りました。これで僕の仕事はおーわり。」
これが一回です。
KeepAliveはこの次に「まだ次があるからちょっと待っとけ!」ってな動きをするんだと思います。(妄想ですが。)
KeepAliveがあると、1と2の動作をしないで済むんだと思うんですよね。
厳密には他にも「プロセス足りないからまた作るかー」とか「こいつ働きすぎたから休憩させよう。」とか色々働くわけです。apacheさんが。
そして、TCPセッションも1回で済んでしまう。
色々とお得な機能なんです。
ですが、KeepAliveには欠点もあります。
それは、apacheさんが「まっとけ」と待たせているプロセスさん、待ってる間は何もしないんです。
俺がapacheさんなら「仕事しながら待っとけ」と言う所です。
つまり、プロセスは待っている間他のリクエストを受け付けることが出来ないんですね。
その結果、プロセス数がmax値まで行ってしまったり、無駄なメモリを使ったりするという状態になる可能性があります。
KeepAliveの利点・Webページの表示が速くなる
・オーバーヘッドを軽減する
KeepAliveの欠点・必ず設定したTimeout分無駄なプロセス時間を使用する
こんな感じです。
つまり、URLに対するオーバーヘッドの軽減の方がTimeout分の無駄なプロセス時間よりも大きければサーバーコストを削減することが出来るってな仕組みだと思います。
KeepAliveの個人的な感想KeepAliveについて書かれているページを見ると、サーバーコストを前提に書かれているところが多いのです。サーバー管理者さんが良く書かれているからなのかな?って思うのですが。
実際にはKeepAliveの恩恵はその表示スピードの早さにあると僕は思ってます。
最近のWebページでは、一つのURLで非常に多くの画像やCSSファイルを必要としたりしています。
これをKeepAlive Off で表示すると、結構重いと思うのです。
体感出来るほどにKeepAlive Onの方が断然早い。
なので、ある程度のサーバーコストがかかったとしても、KeepAliveをOnにするだけの価値はあるんじゃないかなーって思うんですよね。
もちろんコンテンツの状態によってはOffにした方がいい場合もあると思います。
理想の設定は?さて、利点と欠点があるので理想の設定は一つではないと思うのですが、一般的にはどんな設定がいいんでしょうね。
私は今のところ、以下のような設定がいいんじゃないかなーって思います。
KeepAlive On
MaxKeepAliveRequests 一番多く使われているセッション数
KeepAliveTimeout 1
こんなの。
KeepAliveTimeoutの値ですが、0.5とか入力したいところですが、1が最小値。ちょっと書き換えればいいだけだとは思いますが。
KeepAliveTimeoutについては、面白い論文があります。
リクエスト間隔を考慮したウェブサーバのkeep-alive時間の自動設定こんな実験してみたいなーと思いつつ。
妄想で色々設定している自分が恥ずかしくなったり。
実測テストさて、上記の設定で KeepAlive On の時と Offの時の表示スピードを測ってみます。
一度に表示される画像の数が62個あるページを、FirefoxのプラグインFirebugで計測したものです。
KeepAlive Off表示スピード: 1200~1500/msec
KeepAlive On表示スピード: 200~680/msec
こんな結果になりました。
大体2~6倍ほど早くなるってな結果ですね。
最後に瞬間のアクセス数が多いとTimeout 1ってのは致命的な数字になってしまう場合もあると思います。
この設定も、状況に応じて色々な方法があると思います。
また、KeepAliveについては人それぞれ持論があったり、考え方があると思うので、色々調べてみると良いんじゃないかなって思います。
[1回]