华为云服务器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系列操作系统处理方法

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

# sysctl net.netfilter.nf_conntrack_max

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

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

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

提高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

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

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

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

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

重启iptables。

# service iptables restart

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

执行以下命令,在/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

重启firewalld。

# systemctl restart firewalld

确认参数修改成功。

# sysctl -a |grep nf_conntrack_max

了解更多请参考Red Hat Customer Portal。

父主题: 操作系统类(Linux)

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家