今天通过zabbix监控发现,有一台服务器出现网络不稳定,zabbix图像断流,随之,登录服务器经过排查,发现/var/log/messages中出现大量kernel nf_conntrack: table full, dropping packet 。
解决方法如下。
对ip_conntrack的两个参数进行设置即可,不过在centos上,需要这样设置: centos5
1 2 3 4 5 |
vi /etc/sysctl .conf
|
如果在执行sysctl -p 时提示错误 unknown key,那么表示内核版本比较高,参数名称已经改为 centos6
1 2 |
net.netfilter.nf_conntrack_max = 655350
|
至于为什么会有这样的设置,这个设置的作用是什么,就要从NAT说起了。NAT(Network Address Translation,网络地址转换)是将IP数据报报头的IP地址转化成另外一个IP地址的过程,主要用来实现局域网内的机器访问公共网络(俗称外网)的功能。公共IP地址是指在因特网上全球唯一的IP地址,RFC 1918协议还为局域网预留出了三个IP不会在公网上进行分配的地址块:
- 10.0.0.0~10.255.255.255
- 172.16.0.0~172.31.255.255
- 192.168.0.0~192.168.255.255
这些IP地址就可以用来分配给局域网上的各种设备,这些设备在访问外网时,就需要通过一台NAT服务器进行路由转换,通常情况下,路由器就兼备了这样一个功能。除了路由器,也可以配置linux服务器实现NAT功能。ip_conntrack就是linux NAT的一个跟踪连接条目的模块,ip_conntrack模块会使用一个哈希表记录 tcp 通讯协议的 established connection记录,当这个哈希表满了的时候,便会导致nf_conntrack: table full, dropping packet错误。
关于如何优化conntrack模块,有一篇文章对此进行了解释,Netfilter conntrack performance tweaking, v0.8,为了访问方便,我这里也留一个备份地址 netfilter_conntrack_perf-0.8.txt。
查看目前 ip_conntrack 配置的值
1 2 |
> cat /proc/sys/net/ipv4/ip_conntrack_max
|
查看目前 ip_conntrack buffer 的使用状况
1 2 3 |
> cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count
|
其中各个数字的含义为:
1 2 3 4 |
38358 the number of currently active objects
|
查出目前 ip_conntrack 记录最多的前十名 IP
1 2 3 4 5 6 7 8 9 10 11 12 |
> cat /proc/net/ip_conntrack | cut -d ‘ ‘ -f 10 | cut -d ‘=‘ -f 2 | sort | uniq -c | sort -nr | head -n 10
|