今天早上我收到了这是我的 dmesg 日志:
[3184815.656881] nf_conntrack: table full, dropping packet.
[3184821.442351] net_ratelimit: 282 callbacks suppressed
仅供参考,这是当前的最大值:
cat /proc/sys/net/netfilter/nf_conntrack_max
65536
因此,我可以推断服务器正在丢弃 TCP 连接,因为它无法跟踪所有连接。我知道我可以在 sysctl.conf 中设置一个新的最大数字,或者将其回显到 /proc/sys/net/netfilter/nf_conntrack_max,但我不确定这是否是最好的做法。
我是不是要设置一个注定要死机的内核?有没有更好的方法来处理大量的网络连接?
提前致谢
答案1
就 而言nf_conntrack_max
,您仅受可用内核内存量的限制。内核内存不可交换,因此它是实际的 RAM。
TLDR:在现代系统上,我将其设置为 128k,似乎没有任何不良影响。
但是,您可能希望调整的另一个可调参数是/proc/sys/net/netfilter/nf_conntrack_buckets
。每次检查数据包时,都会将其散列到其中一个hashsize
存储桶中(基于源/目标 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,您可以完全禁用防火墙并在服务器中放置专用防火墙。
答案2
您真的需要连接跟踪吗?查看您的防火墙规则,看看您是否可以不使用它。如果您只有一个简单的 Web 服务器,那么您几乎肯定不需要使用连接跟踪。
一般来说,如果您要处理大量流量,您希望防火墙尽可能少地处理。禁用连接跟踪将是一个不错的开始。(查看数据包并说“这会去往端口 80 吗?如果不是,则丢弃它。”然后说“这会去往端口 80 吗?我之前是否看到过来自相同 IP/端口/TCP 会话 # 的此连接?”要容易得多。