cat /proc/sys/net/netfilter/nf_conntrack_count cat /proc/sys/net/netfilter/nf_conntrack_max sudo sysctl -w net.netfilter.nf_conntrack_max=262144 dmesg -T | grep -i conntrack | tail -20
dmesg 不停打印 nf_conntrack: table full dropping packet,新连接间歇性超时,ss 里连接数看着并不多,重启网络后几分钟又复发,一开始还以为是防火墙。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,conntrack 表的上限按内存自动推算,短连接多或者走 NAT 时表项涨得很快,超限后数据包被内核直接丢掉,表现出来就是随机连不上,先看比例。
「conntrack 表满」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
处理上按这个顺序:读 conntrack 的 count 与 max 比值确认是否真的到顶 别只看绝对值 比例更有意义;统计连接来源地址找出短连接最多的那批服务 先定位再改参数;调大 max 并同步调整 hashsize 避免频繁重哈希 只改一个容易白改。
改完只确认一件事:count 稳定低于 max 的七成 dmesg 不再出现丢包提示 高峰期再观察一轮 再压一次。
