Centos 5.5 扩展网络连接数的哲学

bry*_*mcd 1 networking centos

今天早上我收到了我的 dmesg 日志:

[3184815.656881] nf_conntrack: table full, dropping packet.
[3184821.442351] net_ratelimit: 282 callbacks suppressed
Run Code Online (Sandbox Code Playgroud)

FWIW,这是当前的最大值:

cat /proc/sys/net/netfilter/nf_conntrack_max 
65536
Run Code Online (Sandbox Code Playgroud)

因此,我可以推测服务器正在丢弃 TCP 连接,因为它无法跟踪所有连接。我知道我可以在 sysctl.conf 中设置一个新的最大数字或将其回显到 /proc/sys/net/netfilter/nf_conntrack_max 但我不确定这是最好的选择。

我会为某些死亡设置内核吗?有没有更好的方法来处理大量网络连接?

提前致谢

Mar*_*ner 5

就 而言nf_conntrack_max,您仅受可用内核内存量的限制。内核内存不可交换,因此它是实际的 RAM。

TLDR:在现代系统上,我将其设置为 128k,似乎没有任何不良影响。

但是,您可能希望调整的另一个可调参数是/proc/sys/net/netfilter/nf_conntrack_buckets. 每次检查数据包时,它都会散列到其中一个hashsize桶中(基于 src/dst IP 和端口)。每个存储桶包含一个链接列表,然后必须搜索特定连接。增加桶的数量应该(直到某个点)减少链表中需要遍历的节点数量,从而提高性能。权衡是您拥有的桶越多,空桶的概率就越高。空桶占用内核内存。这就是为什么你不设置hashsize= nf_conntrack_max。除了“在正常情况下 ip_conntrack_max 等于 8 * hashsize”的声明之外,我找不到关于设置 hashsize 的任何建议。

另一件要注意的事情是,当您的连接是短暂的(例如,Web 服务器)时,您可能有许多处于 TIME_WAIT 状态的连接,并且在 conntrack 散列中具有相应的条目。cat /proc/net/nf_conntrack | grep TIME | wc -lip_conntrack在较旧的内核上)或者iptstate应该告诉你这个信息。减少这些更改的超时时间/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_time_wait。你可能也想改变/proc/sys/net/ipv4/tcp_fin_timeout

最后,如果你真的需要性能并且你买不起 RAM,你可以完全禁用防火墙并从服务器中放置一个专用防火墙。