nf_conntrack: table full, dropping packet报错
最近项目时不时地连接mysql数据库报错
1 | {pool-21-thread-1} SQL Error: 0, SQLState: 08S01 |
同样的阿里云数据库,其他的服务器连接都不会报错,而且看云数据库的监控,负载是没有问题的。说明大概率不是云数据库的问题。
而该项目比其他服务器里的项目不同的是,访问量比较高,猜测会不会是外网带宽问题,尝试将mysql连接改成内网,这样走内网,观察两天发现,虽然减少了,但还是存在。
猜想是不是tcp连接太多导致的,后发现/var/log/messages日志中报错nf_conntrack: table full, dropping packet
调整方案
1 | #修改 /etc/sysctl.conf配置 |
修改完成后执行 sysctl -p
命令使配置生效。
观察几天发现不再出现报错了。
这个问题的原因是
ip_conntrack是Linux系统内NAT的一个跟踪连接条目的模块,ip_conntrack模块会使用一个哈希表记录TCP协议established connection
记录。当这个哈希表满之后,新连接的数据包会被丢弃掉,就会出现nf_conntrack: table full, dropping packet
错误。
Linux系统会开辟一个空间,用于维护每一个TCP链接,这个空间的大小与nf_conntrack_buckets
、nf_conntrack_max
参数相关,后者的默认值是前者的4倍,所以一般建议调大nf_conntrack_max
参数值。
造成的现象
会导致出现部分时候ping目标实例时出现ping丢包或ping不通