在几乎每个FreeBSDnetworking调优文档中,我都可以find:
# /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).
我能find的唯一一个涉及这个神秘事物的文档是传输层下优化FreeBSD IP和TCP堆栈中的协议控制块查找小节,但其描述更多地是关于使用它的潜在瓶颈。 它似乎绑定到匹配新的TCP段到他们的侦听套接字,但我不知道如何。
什么是TCP控制块用于? 你为什么要设置其散列大小为4096或任何其他特定的数字?
这更像是计算机科学问题。 特别是如果你想挖掘哈希表和大O符号。
答案是:
如果你正在处理很多TCP会话,你真的想在O(1)时间而不是O(n)中查找连接的tcp参数。 FreeBSD使用链接来解决散列表冲突。 所以如果有很多的连接会有很多的冲突,所以,而不是O(1)哈希表查找,你需要做一个O(n)复杂的线性链查找。
你提到的参数 – tcbhashsize
基本上是哈希表中桶的数量。
在我们的服务器上,它被设置为非常高的值,如16384
甚至更高。 有了这个设置,我们每个服务器处理大约60,000个连接。
哈希表中的每个条目当前在x86_64上,对于每个条目(自7.2 + IIRC以来,amme64中的kmem大小是512G)使用252个字节( tcp_inpcb
)+ 688个字节( tcpcb
)的内核内存。 可以通过vmstat -z
查看。
关于TCP控制块的结构,你可以阅读FreeBSD源码: tcp_var.h或者读TCP / IP图解,第2卷:由Gary R. Wright,W. Richard Stevens