最近,我们的一台服务器(Debian Squeeze)在高负载期间变得无响应,出现了问题。查看内核日志,我认为原因是这样的:
kernel: nf_conntrack: table full, dropping packet
据我了解,这是 conntrack 模块,它对连接进行一些状态跟踪,报告用于存储连接详细信息的表已满。
根据我所做的研究,似乎有两种方法可以缓解这种情况:
增加表的大小。
从系统中完全删除该模块。
但是,本机上既不存在/proc/sys/net/ipv4/ip_conntrack_max
也不/proc/sys/net/ipv4/netfilter/ip_conntrack_max
存在( 下没有ipv4
目录net
)。
如果我这样做,lsmod
我不会得到任何结果。
所以,我有点困惑 - 也许有人可以帮我澄清一下情况?
- 是否安装了conntrack?如果有的话,设置在哪里?为什么它没有出现在 lsmod 中?
- 如果未安装 conntrack,什么会发出表已满消息?
谢谢
答案1
我在运行 Ubuntu 18.04 的服务器上遇到了同样的问题。即使该nf_conntrack
模块在启动时未加载,但随后在流量高峰期间,消息也会被丢弃 ( nf_conntrack: table full, dropping packet
)。
我不知道禁用该功能的方法,但我最终显式加载了该模块,因此我可以覆盖表大小。
首先,确保nf_conntrack
立即加载它,将其包含在/etc/modules
:
nf_conntrack
然后通过覆盖以下中的默认值来增加其表大小,否则这将取决于服务器的内存大小/etc/sysctl.conf
:
net.netfilter.nf_conntrack_max=262144
net.nf_conntrack_max=262144
核实:
$ cat /proc/sys/net/netfilter/nf_conntrack_max
262144
如前所述,它在 Ubuntu 18.04 上进行了测试,但我希望它也能在 Debian 上运行。
对于一些进一步的背景,为什么nf_conntrack
可能会稍后加载,即使启动后不存在,这个相关答案iptables
有一个示例,其中模块在调用时自动加载。显式添加它可以/etc/modules
消除这种复杂性。