现象为:同样的程序,分别部署在6台刀片上。有且仅有一台出现大量链接持续不断开,导致服务程序打开文件数达上限,拒绝服务。ping提示如下
[root@a1-02-a-bce-c-b32 ~]# ping 10.10.100.44 PING 10.10.100.44 (10.10.100.44) 56(84) bytes of data. 64 bytes from 10.10.100.44: icmp_seq=1 ttl=64 time=0.144 ms 64 bytes from 10.10.100.44: icmp_seq=2 ttl=64 time=0.101 ms ping: sendmsg: Operation not permitted 64 bytes from 10.10.100.44: icmp_seq=4 ttl=64 time=0.112 ms 64 bytes from 10.10.100.44: icmp_seq=5 ttl=64 time=0.108 ms 64 bytes from 10.10.100.44: icmp_seq=6 ttl=64 time=0.133 ms --- 10.10.100.44 ping statistics --- 6 packets transmitted, 5 received, 16% packet loss, time 5000ms rtt min/avg/max/mdev = 0.101/0.119/0.144/0.020 ms
经过学习研究后发现原来系统中有个IP_conntrack连接跟踪数据库(conntrack database),代表NAT机器跟踪连接的数目,连接跟踪表能容纳多少记录是被一个变量控制的,它可由内核中的ip-sysctl函数设置。每一个跟踪连接表会占用350字节的内核存储空间,时间一长就会把默认的空间填满,导致log中有如下提示
Feb 1 17:02:16 a1-02-a-bce-c-b32 kernel: printk: 366 messages suppressed.
Feb 1 17:02:16 a1-02-a-bce-c-b32 kernel: ip_conntrack: table full, dropping packet.
用人话说就是“表满了,存不下了,包扔了。”
貌似是超频繁的短链接导致的问题吧?
解决方法为:
1.修改ip_conntract_max,增大表空间
echo “81920” > /proc/sys/net/ipv4/ip_conntrack_max(临时)
或
/etc/sysctl.conf添加net.ipv4.ip_conntract_max =81920(长久)
2.减小无效的已建立的链接的超时时间,默认5天,可以改成6小时自动清理
echo 21600 >/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
0 条评论。