大流量下重启 CentOS6 上的 iptables 应注意 nf_conntrack table full
03 Jun 2013最近公司搞了一次活动,流量和并发暴增,导致外网不能到达内网的前端服务器nginx,刚开始认为是nginx本身处理并发的能力,
索性把nginx的参数都优化了一边并重启nginx,发现外网还是不能访问,使用tcpdump等调试工具都无法找出原因,连总出口的
防火墙都看了一边,session 数正常,后来想起内网的iptables 是不是被启动了,看了一下/var/log/messages 出现
kernel: nf_conntrack: table full, dropping packet.
报错,索性使用 sudo /etc/init.d/iptables stop 停止 iptables, 但发现还是不行,最后在/var/log/messages 发现
nf_conntrack version 0.5.0 (16384 buckets, 65536 max)
这才意识到是nf_conntrack模块的原因
在root用户下,/etc/init.d/iptables stop 可以解决
因为 iptables 启动脚本 里有 nf_conntrack 模块卸载功能
for mod in ${NF_MODULES_COMMON[*]}; do
rmmod_r $mod >/dev/null
done
而且在启动 iptables 的时候 默认是加载 nf_conntrack 模块的
所以在大流量下重启 CentOS6 上的 iptables 时应使用以下命令来调整nf_conntrack的最大值
/etc/init.d/iptables restart
sysctl -w "net.netfilter.nf_conntrack_max=655350"
sysctl -w "net.netfilter.nf_conntrack_tcp_timeout_established=600"