为什么要在FreeBSD中更改net.inet.tcp.tcbhashsize?

Modified on: Sun, 28 Jul 2019 20:00:03 +0800

在几乎每个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堆栈,但其描述更多是关于使用它的潜在瓶颈。它似乎与将新TCP段匹配到其侦听套接字有关,但我不确定如何。

TCP控制块究竟用于什么?为什么要将其散列大小设置为4096或任何其他特定数字?

作者:,sh-beta

最佳答案

这更像是计算机科学问题。特别是如果你想深入了解哈希表big-O符号。

答案是:
如果您在服务器上处理许多TCP会话,您真的想在O(1)时间而不是O(n)中查找连接的tcp参数。 FreeBSD使用链接来解决哈希表冲突。因此,如果存在大量连接,则会发生大量冲突,因此代替O(1)哈希表查找,您需要进行具有O(n)复杂度的线性链查找。

您提到的参数 - tcbhashsize基本上是哈希表中的桶数。
在我们的服务器上,它设置为非常高的值,如16384甚至更高。通过该设置,我们每个服务器处理大约60,000个连接。

当前在x86_64上的哈希表中的每个条目对每个条目使用252字节(tcp_inpcb)+ 688字节(tcpcb)的内核内存(kmem大小为512G)自7.2+ IIRC以来的amd64)。可以通过vmstat -z查看。

关于TCP Control块的结构你可以阅读FreeBSD源:tcp_var.h或阅读TCP / IP Illustrated,Volume 2:Gary R. Wright,W。Richard Stevens的实施

作者:,SaveTheRbtz

相关问答

添加新评论