文档首页/ 弹性云服务器 ECS/ 故障排除/ 操作系统类(Linux)/ Web访问超时系统日志打印:nf_conntrack:table full, dropping packet
更新时间:2025-10-15 GMT+08:00
分享

Web访问超时系统日志打印:nf_conntrack:table full, dropping packet

问题现象

ECS实例中的应用偶尔出现丢包现象。服务端系统日志/var/log/messages打印kernel: nf_conntrack:table full, dropping packet。

图1 系统日志

约束与限制

本节操作涉及修改系统内核参数,在线修改内核参数会出现内核不稳定,建议修改后在合理的时间重启系统,请评估风险后操作。

根因分析

iptables的connection-tracking模块使用系统内存的一部分来跟踪表中的连接。“table full, dropping packet”表明连接跟踪表已满,不能为新连接创建新的条目,因为没有更多的空间。因此出现“dropping packet”问题。

解决方案是增加连接跟踪条目的数量或过滤不需要追踪的连接。

处理方法

方案一:调整优化nf_conntrack模块中的参数值

  1. 提高net.netfilter.nf_conntrack_max值,即nf_conntrack模块支持的最大连接数。

    以内存为64G,net.netfilter.nf_conntrack_max值调整为2097152为例:

    执行以下命令,使配置即时生效:
    sysctl -w net.netfilter.nf_conntrack_max=2097152
    执行以下命令确保重启后配置仍然生效:
    echo "net.netfilter.nf_conntrack_max = 2097152" >> /etc/sysctl.conf
    • net.netfilter.nf_conntrack_max不是越高越好,通常根据内存大小进行设置。
    • nf_conntrack_max计算公式(64位):

      CONNTRACK_MAX = RAMSIZE (inbytes)/16384/2

      例如您的机器是一个64GB 64bit的系统,那么最合适的值是

      CONNTRACK_MAX = 64*1024*1024*1024/16384/2 = 2097152

  2. 调整nf_conntrack_buckets,即nf_conntrack模块哈希表大小。

    如果conntrack表中的条目数量显著增加(例如以4倍的速度增加),则还应增加存储conntrack条目的哈希表的大小以提高效率。

    计算新的哈希值:在CentOS 6及以上版本,计算公式是hashsize = nf_conntrack_max/4

    执行以下操作,设置新的哈希大小:

    sysctl -w net.netfilter.nf_conntrack_buckets=524288

    执行以下命令确保重启后配置仍然生效:

    echo "net.netfilter.nf_conntrack_buckets=524288" >> /etc/sysctl.conf

    老版本的操作系统可能无法直接修改nf_conntrack_buckets,此时,可以通过调整模块选项hashsize实现。

    修改方法:

    在/etc/modprobe.d/nf_conntrack.conf中设置模块选项:

    echo "options nf_conntrack hashsize=524288" >> /etc/modprobe.d/nf_conntrack.conf

    重启系统后生效。

方案二:通过iptables过滤不需要追踪的连接

您可以在iptables规则中增加-j notrack参数 ,即过滤不需要追踪(track)的连接。该方式可以将不需要追踪的连接直接进行notrack处理,不会占用哈希表的空间,也不会引发报错。

iptables -t raw -A PREROUTING -p udp -j NOTRACK
iptables -t raw -A PREROUTING -p tcp --dport 22 -j NOTRACK

此处的命令表示不追踪UDP和22端口的TCP连接,仅供参考,以实际情况为准。

相关文档