上一篇: Extman字符验证码改为数字验证码
Linux NAT ip_conntrack: table full
[ 2011/07/02 18:05 | by selboo ]
Web服务器用了一段时间,随意间使用dmesg命令后竟然发现了一些奇怪的内核日志,如下:
ip_conntrack: table full, dropping packet.
后来才知道, Linux TCP 的 ip_conntrack 模块会记录 tcp 通讯协议的 established connection 记录, 而且默认 timeout 时间长达五天 (432,000 秒), 由于Web站点使用memcached因此怀疑一些TCP链接从来就没有释放过,所以导致这种问题。
解决方法 (1): 加大 ip_conntrack_max 值
查出原本的 ip_conntrack_max 值:
指令: cat /proc/sys/net/ipv4/ip_conntrack_max
写入理想的数值 (每一个 ip_conntrack buffer 会占用 292 Bytes)
指令: echo "数值" > /proc/sys/net/ipv4/ip_conntrack_max
例如: echo "81920" > /proc/sys/net/ipv4/ip_conntrack_max
这个效果是暂时的, 如果要每次开机都使用新的数值, 需将上述指令写入 /etc/rc.d/rc.local
或是在 /etc/sysctl.conf 加入: net.ipv4.ip_conntrack_max = 数值
或使用指令: sysctl -w net.ipv4.ip_conntrack_max=数值
解决方法 (2): 降低 ip_conntrack timeout 时间
重设 ip_conntrack_tcp_timeout_established (原值: 432000, 单位: 秒)
指令: echo "数值" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
例如: echo "600" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
开机自动设置的作法同方法(1).
其他相关指令:
查看目前 ip_conntrack buffer 使用状况
指令: grep conn /proc/slabinfo
结果实例: ip_conntrack 3024 4090 384 409 409 1 (各值说明如下)
ip_conntrack | the cache name |
3024 | the number of currently active objects |
4090 | the total number of available objects |
384 | the size of each object in bytes |
409 | the number of pages with at least one active object |
409 | the total number of allocated pages |
1 | the number of pages per slab are given |
man slabinfo 可查询详细说明.
查出目前 ip_conntrack 记录最多的前五名 IP
指令: cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 5
结果实例:
2816 | 192.168.1.100 |
14 | 163.30.85.129 |
6 | 220.132.142.175 |
6 | 127.0.0.1 |
4 | 218.187.5.223 |
最后编辑: selboo 编辑于2011/08/21 01:36