web-dev-qa-db-ja.com

キープアライブまたはキープアライブではない

私の会社は、非常に短いウィンドウで潜在的に大きな訪問者の波を伴う新しいWebサイトを立ち上げています(推定では、2分のウィンドウで約14,000人の訪問者です)。

だから私は私たちの設定を見直しています、そして今の私の最大の問題はキープアライブを使用する単一ノードのHTTPフロントエンドです。フロントエンドはCentOS 5.4でlighttpd 1.4を実行しています。

いくつかの仮定:

  • ブラウザは通常6パラレルを開きますTCP接続を維持するために
  • タブが閉じていても、ブラウザはタイムアウトに達するまで接続を開いたままにします(FFで観察され、すべてのブラウザで当てはまるとは限りません)。
  • サーバー側では、各接続がカーネル内で最大150Kのメモリを消費します(私はconntrackを使用し、それを維持したいのですが、その見積もりは正しいですか?)
  • すべてのサーバーは東海岸でホストされています。ラスベガスのサーバーからのRTTは約80msです。
  • キープアライブのあるホームページは、〜25 TCP接続と1500パケットを使用します。キープアライブがない場合、この数は〜210 TCP接続および3200以上)に増加します。パケット。

したがって、6 * 14000 = 84,000 TCP接続。84,000* 150KB〜= 12GBのメモリ。ここに問題があります:1.フロントエンドで使用可能なメモリ容量がありません。 2. lighttpd 1.4は、管理する接続の量が少ないため、ヒット数やSAに悪影響を及ぼします。

しかし、反対側では、キープアライブを非アクティブにした場合の80ミリ秒のRTTが心配です。

CDNとセカンダリlighttpdを使用したセカンダリwwwレコードを使用して、これらの問題のいくつかを軽減します。しかし、議論はキープアライブ機能に関係しています。オフにしたいのですが、ページのオープン時間への影響が大きくなるのではないかと心配です(RTTが高く、パケット量が2倍になる)。

コンテンツの取得が完了すると、通常は単一のtcp接続に収まるサイトを閲覧するための多くのajaxリクエストがあります。しかし、ブラウザが他の接続を解放し、1つだけを開いたままにすることは確実ではありません。

キープアライブが多くのリソースを消費することについて、多くの議論があったことを私は知っています。私はそれに同意しますが、仮定と状況(ユーザーの半数のRTTが80ミリ秒から100ミリ秒)を考えると、非アクティブ化するのが賢明だと思いますか?

副次的な質問として:カーネルの接続サイズと接続サイズに関する情報をどこで見つけることができるか知っていますか? (printf size_of(sk_buff)以外)。

---編集:いくつかのテスト結果は、500k接続を受け入れるようにconntrackを構成し(メモリフットプリントが与えられた場合、200MBを超えてはなりません)、abテストを開始します。

ab -n 20000 -c 20000 -k http://website.com/banner.jpg

Tcpdumpで確認した内容から、abはGETを実行する前にすべての接続を確立します。つまり、これらの2万の接続によってどれだけのメモリが消費されるかがわかります。

スラブトップリターン

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
 40586  40586 100%    0.30K   3122       13     12488K ip_conntrack

そして上

 PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP CODE DATA COMMAND
 15   0  862m 786m  780 S 22.9  3.3   1:44.86  76m  172 786m lighttpd

ip_conntrackの場合は12MB、lighttpdの場合は786MBで問題ありません。その4倍を簡単に管理できます。

つまり、キープアライブ、つまりアイドルタイムアウトを5秒に設定します。

7
Julien Vehent

キープアライブタイムアウトをたとえば15秒に設定しないのはなぜですか?すべての接続を2分間保持する理由がわかりません。そして、私はこのリンクによると、ブラウザが2分間接続を維持するとは思わない: http://en.wikipedia.org/wiki/HTTP_persistent_connection#Use_in_web_browsers 、1分のタイムアウトはもっと多いようです現実的。

1
Alex

キープアライブタイムアウトを非常に低く(1秒)することをお勧めします。

クライアント側のパフォーマンスで基本的な作業を行った場合(JS/CSSの正しい順序、下部のJS、または非同期...)、キープアライブを非常に低く(1s)設定できます。これは、遅延があまり発生しないためです。 TCP接続の2つの再利用の間。

疑わしいことに、5秒と1秒(接続ビュー)でページをWebページテストすると、TCP接続の再利用が中断されるかどうかがわかります。

Apacheフロントエンドで0にしようとしましたが、それは間違いなく小さすぎますが、1は問題ありません。

0
Patrice