先日行われた第二回 ライブドア テクニカルセミナーをustreamで見ました。pixivの中の人の話が聞けて面白かったです(資料と動画はこちら)。
そのときに出てきたのが、Apache HTTP ServerでKeepAliveTimeoutを2秒に設定しているという話です。MPMもpreforkでもworkerでもなくeventで運用しているとのことでした。eventならKeepAliveTimeoutを伸ばしてもいい気がするのですが、「安全のため」2秒にしているそうです。ちなみにftp.jaist.ac.jpのKeepAliveTimeoutも2秒です。
HTTPのキープアライブ(Keep-Alive)というのは1.0のころの呼び名で、1.1では持続的接続(persistent connection)と言います。HTTP 1.1ではデフォルトで持続的接続で、サーバと接続を確立したクライアントは同じ接続を使って何度もサーバとやり取りします。一つのページに画像などが複数が含まれている場合に、そのつど接続を確立しなくてよいのでページの表示が速くなります。ページが表示されてから同じサーバへのリンクを選択したときも、すでに確立している接続を使うので応答が速くなります。
クライアントは一定時間不要なら接続を閉じますが、Internet Explorerは1分、Firefoxは5分も待ちます。サーバはクライアントが接続を切るまで接続を維持する必要があります。しかし、接続の維持にはコストが掛かるので、そんなに長い間は維持できません。Apache HTTP Serverは、KeepAliveTimeoutで指定された秒数の間リクエストがなければ接続をサーバから閉じます。
KeepAliveTimeoutのデフォルトはバージョン2.0で15秒、バージョン2.2で5秒です。短くするほど無駄な接続を減らせますが、短くしすぎると必要なコネクションまで閉じてしまい、クライアントがコネクションを確立し直す場合が増えます。クライアントは応答が遅延し、サーバはコネクション確立のコストが増えて、どちらにとっても損失です。チューニングしていくと、この値は2秒に行き着くようです。
ftp.jaist.ac.jpは基本的に大きなファイルの転送しかしませんから、リクエストとレスポンスに対して接続の確立のコストは無視できます。したがって、KeepAliveをOffにして持続的接続を無効にするという選択肢もあります。しかし、アプリケーションやOSの自動更新で小さなファイルを多数転送することもあるので、持続的接続を有効にしています。Fedora Projectでは、ミラーサーバにKeepAliveTimeoutを2秒以上にするよう求めています。
MPMをpreforkやworkerではなくeventにすると、KeepAliveTimeoutにもっと寛容になれます。無駄な接続を閉じなければならないそもそもの理由は、preforkでは接続が一つのプロセスを、workerでは一つのスレッドを占有するからです。eventはworkerと似ていますが、一つのプロセスのすべての接続を一つのスレッドが監視します。ほかのスレッドは、接続がリクエストを受け付けてレスポンスを返す間しか使われません。
eventは大変効率的なMPMですが、まだ実験用なので期待通りに動かないかもしれないとドキュメントには書かれています。でも、あのpixivでちゃんと動いてるくらいですから、もう使っても平気なのかもしれませんね。
0 件のコメント:
コメントを投稿