0%

nf_conntrack:table full,dropping packet报错

nf_conntrack: table full, dropping packet报错

最近项目时不时地连接mysql数据库报错

1
2
3
4
5
{pool-21-thread-1} SQL Error: 0, SQLState: 08S01
{pool-21-thread-1} Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server
java.net.UnknownHostException

同样的阿里云数据库,其他的服务器连接都不会报错,而且看云数据库的监控,负载是没有问题的。说明大概率不是云数据库的问题。

而该项目比其他服务器里的项目不同的是,访问量比较高,猜测会不会是外网带宽问题,尝试将mysql连接改成内网,这样走内网,观察两天发现,虽然减少了,但还是存在。

猜想是不是tcp连接太多导致的,后发现/var/log/messages日志中报错nf_conntrack: table full, dropping packet

调整方案

1
2
3
4
5
6
#修改 /etc/sysctl.conf配置

# 将哈希表项最大值参数修改为655350
net.netfilter.nf_conntrack_max = 655350
# 修改超时参数值为1200,默认超时时间是432000秒
net.netfilter.nf_conntrack_tcp_timeout_established = 1200

修改完成后执行 sysctl -p命令使配置生效。

观察几天发现不再出现报错了。

这个问题的原因是

ip_conntrack是Linux系统内NAT的一个跟踪连接条目的模块,ip_conntrack模块会使用一个哈希表记录TCP协议established connection记录。当这个哈希表满之后,新连接的数据包会被丢弃掉,就会出现nf_conntrack: table full, dropping packet错误。

Linux系统会开辟一个空间,用于维护每一个TCP链接,这个空间的大小与nf_conntrack_bucketsnf_conntrack_max参数相关,后者的默认值是前者的4倍,所以一般建议调大nf_conntrack_max参数值。

造成的现象

会导致出现部分时候ping目标实例时出现ping丢包或ping不通

欢迎关注我的其它发布渠道