前几天做服务器压力测试,本地10个线程不停的去向服务器建立连接,然后请求数据,然后连接再关闭,程序每运行几万次之后就会发现客户端程序没办法connect服务器,connect超时。
一开始怀疑是自己服务器的处理有问题,导致socket数过多没办法创建新的连接,现将系统中用户可以打开的最大文件数调成10w,继续进行压力测试,发现问题依然存在。
经过一些时间的检查之后,确定应该不是自己服务本身的问题,这时候想将iptables关闭试试,iptables里面是没有配置连接数限制的。
在关闭iptables时之后,发现问题确实没有了,不过还是不知道是什么原因导致的。不过已经可以确定是和iptables相关的了。
这时候看来一下iptables的日志(/var/log/message)中有很多:
Sep 3 14:34:07 xxx kernel: nf_conntrack: table full, dropping packet.
Sep 3 14:34:08 xxx kernel: nf_conntrack: table full, dropping packet.
Sep 3 14:34:15 xxx kernel: nf_conntrack: table full, dropping packet.
这种类似的日志,网上搜索到的解释是内核处理的连接数达到上限
[root@dns1 /]# echo 65535000 > /proc/sys/net/netfilter/nf_conntrack_max
[root@dns1 /]# echo 10800 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
修改上限之后,重启iptables,然后再次压力测试,发现可以正常工作了
有资深的运维人士认为这种方法存在缺陷,会导致系统消耗增加,治标不治本,建议直接关掉iptables,链接:http://jaseywang.me/2012/08/16/%E8%A7%A3%E5%86%B3-nf_conntrack-table-full-dropping-packet-%E7%9A%84%E5%87%A0%E7%A7%8D%E6%80%9D%E8%B7%AF/