今天早上我收到这是我的dmesg日志:
[3184815.656881] nf_conntrack: table full, dropping packet. [3184821.442351] net_ratelimit: 282 callbacks suppressed
FWIW,这里是当前的最大值:
cat /proc/sys/net/netfilter/nf_conntrack_max 65536
所以,我可以收集服务器正在丢弃TCP连接,因为它不能跟踪所有的。 我知道我可以在sysctl.conf中设置一个新的最大数字,或者将它回显到/ proc / sys / net / netfilter / nf_conntrack_max,但我不确定这是最好的select。
我会为了一定的死亡而设置内核吗? 有没有更好的方法来处理大量的networking连接?
提前致谢
就nf_conntrack_max ,您只受可用内核内存量的限制。 内核内存不可交换,所以它是实际的内存。
TLDR:在现代系统上,我把它设置为128k,看起来没有不良影响。
另一个你可能希望调整的可调参数是/proc/sys/net/netfilter/nf_conntrack_buckets 。 每次检查一个数据包时,都会将其散列成一个哈希hashsize桶(基于src / dst IP和端口)。 每个桶包含一个链接列表,然后必须search特定的连接。 增加桶的数量应该(直到某个点)减less链表中需要遍历的节点的数量,并因此提高性能。 折中的是,你有更多的空桶的概率越高。 一个空的桶需要内核内存。 这就是为什么你不设置hashsize = nf_conntrack_max 。 我找不到任何有关设置散列大小的build议,只是声明“正常情况下ip_conntrack_max等于8 *散列大小”。
另外要注意的是,当你的连接是短命的(例如,一个web服务器)时,你可能在TIME_WAIT状态下有很多连接,conntrack散列中有相应的条目。 cat /proc/net/nf_conntrack | grep TIME | wc -l cat /proc/net/nf_conntrack | grep TIME | wc -l (旧的内核上的ip_conntrack )或iptstate应该告诉你这个信息。 减less这些更改的超时/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_time_wait 。 你可能也想改变/proc/sys/net/ipv4/tcp_fin_timeout 。
最后,如果你真的需要性能,而且你无法负担内存,你可以完全禁用防火墙,并从服务器中放置一个专用的防火墙。
你真的需要连接跟踪吗? 看看你的防火墙规则,看看你是否设法不使用它。 如果你刚刚有一个简单的Web服务器,你几乎肯定不需要使用连接跟踪。
一般来说,如果你处理大量的stream量,你希望防火墙必须尽可能less。 禁用连接跟踪将是一个很好的开始。 (查看一个数据包比较容易,然后说'这个端口是80端口吗?如果不是这样的话,就把它丢掉',然后'这个端口是80端口吗?我看到这个连接是来自同一个IP /端口/ TCP Session#之前?