FreeBSDでnet.inet.tcp.tcbhashsizeを変更する理由


8

事実上すべてのFreeBSDネットワークチューニングドキュメントで私は見つけることができます:

# /boot/loader.conf
net.inet.tcp.tcbhashsize=4096

これは通常、「TCP制御ブロックハッシュテーブルのチューニング」や「これを適切な値に設定する」などの役に立たないステートメントとペアになります。man 4 tcpどちらもあまり役に立ちません:

tcbhashsize         Size of the TCP control-block hash table (read-only).
                    This may be tuned using the kernel option TCBHASHSIZE
                    or by setting net.inet.tcp.tcbhashsize in the
                    loader(8).

この不思議なことに触れた唯一のドキュメントは、FreeBSD IPとTCP Stackの最適化の Transport Layerの下にあるProtocol Control Block Lookupサブセクションですが、その説明はそれを使用する際の潜在的なボトルネックについての詳細です。新しいTCPセグメントをリスニングソケットに一致させることに関連しているようですが、方法はわかりません。

正確に何のために使用されるTCP制御ブロックですか?ハッシュサイズを4096または他の特定の数値に設定する理由は何ですか?


+1、非常に興味深い質問です。
ジャンヌピッカライネン2012年

私の知る限り、適切なソケットにパケットを配信するためのすべての情報は経由でinpcbのみ利用可能です。
SaveTheRbtz

回答:


3

コンピュータサイエンスの質問のようなものです。特に、ハッシュテーブルbig-O表記法を詳しく調べたい場合は。

答えは次のとおりです。
サーバーで多くのTCPセッションを処理している場合、接続のtcpパラメータをO(n)ではなくO(1)時間で検索する必要があります。FreeBSDはチェーンを使用してハッシュテーブルの衝突を解決します。したがって、接続が多い場合は衝突が多くなるため、O(1)ハッシュテーブルルックアップの代わりに、O(n)複雑さで線形チェーンルックアップを行う必要があります。

あなたが言及したパラメータ- tcbhashsize基本的にはハッシュテーブル内のバケットの数です。
私たちのサーバーでは、これ16384よりもかなり高い値に設定されています。この設定では、サーバーごとに約60,000の接続を処理しています。

現在x86_64上にあるハッシュテーブル内の各エントリは、エントリごとに252バイト(tcp_inpcb)+ 688バイト(tcpcb)のカーネルメモリを使用します(7.2+ IIRC以降、amd64ではkmemサイズは512Gです)。経由で表示できますvmstat -z

TCP制御ブロックの構造については、FreeBSDソースを読むことができます:tcp_var.hまたはTCP / IP Illustrated、Volume 2:Gary R. Wright、W。Richard Stevensによる実装


それはすべてぼやけていましたが、今ではこのあいまいなCヘッダーですべてがはっきりしています;)
gparent

ハッシュテーブルのバケット数を増やすと、それらのバケットでのルックアップのパフォーマンスが向上する理由がわかりますが、これが実際にこの値が何をしているのかわかりませんでした。これがバケットのテーブルである場合、TCPCBが実際にソケット情報が格納される場所であり、TCPセグメントを適切なレシーバーに一致させることができると思います。これを確認できますか?また、これらのサイトの目的の一部は情報を集約することであるため、「ソースを読む」または「本を読む」の回答はあまり役に立ちません。
sh-beta

どのようにして16384のチューニングに至ったのですか?どうして?そして、あなたはその値のために何を犠牲にしていますか(私はカーネルメモリを想定していますが、どれくらいですか?)?それが無料のパフォーマンスウィンだったとしたら、それがデフォルトだと思いたいです。確かにそれは何かがかかります。
sh-beta

私の意見では、この値は、このサーバーが処理しようとする同時接続数にいくらか近い値に設定する必要があります。PS。ソース/本を読まずに、ある分野の専門家になりたいですか?=)
SaveTheRbtz

1
@SaveTheRbtzテクノロジーを使用する場合は、質問をやめるか、コードの専門家になる必要があるため、ネットワークスタック内の個々の構造体と関数の正確な目的を説明できるようにする必要があるというこの考え方は嫌いです。StackExchangeの目的は知識を交換することです。私は一部の専門家で他の専門家ではありません。そのラインは、自分の時間をどこで過ごすかを慎重に選択しなければならない私の仕事によって決まります。しかし、だからといって、思いがけなくブログからブログにコピーされて貼り付けられたように見えるチューニング「アドバイス」を単に受け入れるだけで満足しているわけではありません。
sh-beta
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.