深入解析 “nf_conntrack: table full, dropping packet” 报错及解决方案
在高并发网络场景中,Linux 服务器有时会出现 nf_conntrack: table full, dropping packet 错误,导致应用连接失败(如 MySQL 通信链路中断)。本文将从原理、参数、解决方案三个维度详细解析该问题,帮助彻底解决此类网络故障。
问题本质:连接跟踪表耗尽
1. nf_conntrack 模块的作用
nf_conntrack 是 Linux 内核中的连接跟踪模块,主要用于:
- 跟踪网络连接的状态(如 TCP 连接的建立、关闭、超时等);
- 在 NAT(网络地址转换)场景下,记录源 / 目标 IP、端口等信息,确保数据包能正确转发;
- 为防火墙(如
iptables)提供连接状态信息(如--state ESTABLISHED规则)。
该模块通过哈希表存储连接信息,每条记录包含连接的源地址、目标地址、端口、协议、状态等关键信息。
2. 报错原因:哈希表容量不足
当系统中的网络连接数量超过 nf_conntrack_max(哈希表最大条目数)时,哈希表会被填满,新的连接无法被跟踪,内核会丢弃新连接的数据包,从而触发 nf_conntrack: table full, dropping packet 错误。
在高并发场景下(如用户提到的 “访问量较高的项目”),默认参数极易触发该问题:
- 默认
nf_conntrack_max通常为 65535(受系统内存限制,小内存机器可能更低); - 默认
nf_conntrack_tcp_timeout_established(已建立连接的超时时间)为 432000 秒(5 天),意味着即使连接已闲置,仍会在哈希表中保留 5 天,长期占用条目。