今天早上我收到了我的 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 但我不确定这是最好的选择。
我会为某些死亡设置内核吗?有没有更好的方法来处理大量网络连接?
提前致谢
就 而言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 -l
(ip_conntrack
在较旧的内核上)或者iptstate
应该告诉你这个信息。减少这些更改的超时时间/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_time_wait
。你可能也想改变/proc/sys/net/ipv4/tcp_fin_timeout
。
最后,如果你真的需要性能并且你买不起 RAM,你可以完全禁用防火墙并从服务器中放置一个专用防火墙。