私の会社は、非常に短いウィンドウで潜在的に大きな訪問者の波を伴う新しいWebサイトを立ち上げています(推定では、2分のウィンドウで約14,000人の訪問者です)。
だから私は私たちの設定を見直しています、そして今の私の最大の問題はキープアライブを使用する単一ノードのHTTPフロントエンドです。フロントエンドはCentOS 5.4でlighttpd 1.4を実行しています。
いくつかの仮定:
したがって、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秒に設定します。
キープアライブタイムアウトをたとえば15秒に設定しないのはなぜですか?すべての接続を2分間保持する理由がわかりません。そして、私はこのリンクによると、ブラウザが2分間接続を維持するとは思わない: http://en.wikipedia.org/wiki/HTTP_persistent_connection#Use_in_web_browsers 、1分のタイムアウトはもっと多いようです現実的。
キープアライブタイムアウトを非常に低く(1秒)することをお勧めします。
クライアント側のパフォーマンスで基本的な作業を行った場合(JS/CSSの正しい順序、下部のJS、または非同期...)、キープアライブを非常に低く(1s)設定できます。これは、遅延があまり発生しないためです。 TCP接続の2つの再利用の間。
疑わしいことに、5秒と1秒(接続ビュー)でページをWebページテストすると、TCP接続の再利用が中断されるかどうかがわかります。
Apacheフロントエンドで0にしようとしましたが、それは間違いなく小さすぎますが、1は問題ありません。