Web访问超时系统日志打印:nf_conntrack:table full, dropping packet
问题现象
ECS实例中的应用偶尔出现丢包现象。服务端系统日志/var/log/messages打印kernel: nf_conntrack:table full, dropping packet。
约束与限制
本节操作涉及修改系统内核参数,在线修改内核参数会出现内核不稳定,建议修改后在合理的时间重启系统,请评估风险后操作。
根因分析
iptables的connection-tracking模块使用系统内存的一部分来跟踪表中的连接。“table full, dropping packet”表明连接跟踪表已满,不能为新连接创建新的条目,因为没有更多的空间。因此出现“dropping packet”问题。
解决方案是增加连接跟踪条目的数量或过滤不需要追踪的连接。
处理方法
方案一:调整优化nf_conntrack模块中的参数值
- 提高net.netfilter.nf_conntrack_max值,即nf_conntrack模块支持的最大连接数。
以内存为64G,net.netfilter.nf_conntrack_max值调整为2097152为例:
执行以下命令,使配置即时生效:sysctl -w net.netfilter.nf_conntrack_max=2097152
- 调整nf_conntrack_buckets,即nf_conntrack模块哈希表大小。
如果conntrack表中的条目数量显著增加(例如以4倍的速度增加),则还应增加存储conntrack条目的哈希表的大小以提高效率。
计算新的哈希值:在CentOS 6及以上版本,计算公式是hashsize = nf_conntrack_max/4
执行以下操作,设置新的哈希大小:
sysctl -w net.netfilter.nf_conntrack_buckets=524288
执行以下命令确保重启后配置仍然生效:
echo "net.netfilter.nf_conntrack_buckets=524288" >> /etc/sysctl.conf
老版本的操作系统可能无法直接修改nf_conntrack_buckets,此时,可以通过调整模块选项hashsize实现。
修改方法:
在/etc/modprobe.d/nf_conntrack.conf中设置模块选项:
echo "options nf_conntrack hashsize=524288" >> /etc/modprobe.d/nf_conntrack.conf
重启系统后生效。
方案二:通过iptables过滤不需要追踪的连接
您可以在iptables规则中增加-j notrack参数 ,即过滤不需要追踪(track)的连接。该方式可以将不需要追踪的连接直接进行notrack处理,不会占用哈希表的空间,也不会引发报错。
iptables -t raw -A PREROUTING -p udp -j NOTRACK iptables -t raw -A PREROUTING -p tcp --dport 22 -j NOTRACK
此处的命令表示不追踪UDP和22端口的TCP连接,仅供参考,以实际情况为准。