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

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

问题现象

客户端访问web时出现time out。 服务端系统日志/var/log/messages打印kernel: nf_conntrack:table full, dropping packet。

图1 系统日志

适用场景

本节操作适用于CentOS系统,且系统开启了主机防火墙,其他Linux系统可能存在差异。

约束与限制

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

根因分析

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

解决方案是增加连接跟踪条目的数量。

CentOS 6系列操作系统处理方法

  1. 执行以下命令,查看nf_conntrack_max参数。

    # sysctl net.netfilter.nf_conntrack_max

  1. 检查当前正在跟踪的连接数。

    # cat /proc/sys/net/netfilter/nf_conntrack_count

    如果该值达到nf_conntrack_max值则会出现包被丢弃的现象。

  2. 提高net.netfilter.nf_conntrack_max值(以内存为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

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

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

  4. 执行以下命令,设置新的哈希大小。

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

  5. 重启iptables。

    # service iptables restart

CentOS 7系列操作系统处理方法

  1. 执行以下命令,在/etc/modprobe.d/firewalld-sysctls.conf中设置conntrack条目的哈希值。

    在CentOS 6及以上版本,计算公式是hashsize = conntrack_max/4

    # echo "options nf_conntrack expect_hashsize=131072 hashsize=131072" >> /etc/modprobe.d/firewalld-sysctls.conf

  1. 重启firewalld。

    # systemctl restart firewalld

  1. 确认参数修改成功。

    # sysctl -a |grep nf_conntrack_max

了解更多请参考Red Hat Customer Portal