我的 Web 服务器非常繁忙,我想进行一些分析来查看存在哪些类型的流量。即所有连接的总数、等待时间数、已建立的连接、udp 和 tcp 连接。
首先,我制作了一个简单的图表 - 通过以下方式仅显示连接总数 /proc/sys/net/netfilter/nf_conntrack_count
:
$ cat /proc/sys/net/netfilter/nf_conntrack_count 1994
图表中所有内容都很好地呈现了出来,所以我在其中引入了更多细节。现在/proc/net/nf_conntrack
使用类似的命令进行处理并放置到适当的监控中:
$ grep -c tcp /proc/net/nf_conntrack 1273 $ grep -c udp /proc/net/nf_conntrack 49
每分钟运行一次 nf_conntrack 分析。最初一切都显示正常,所以我把它放了一天。
第二天,我注意到总连接数 ( ) 大幅下降并出现反弹,/proc/sys/net/netfilter/nf_conntrack_count
这对于每隔几分钟就会发生一次的 Web 服务器来说是不正常的。经过多次测试和故障排除,我终于找到了问题背后的原因。
我已经进入终端watch -n0 "cat /proc/sys/net/netfilter/nf_conntrack_count"
(检查近乎实时的连接数),然后在第二步我只做了cat /proc/net/nf_conntrack
,并且一旦按下回车键nf_conntrack_count
大幅下降从 1993 降到 1411,然后在 2-3 秒内恢复到“正常”值。尝试了cp
、、grep
等conntrack -L -p tcp
,每次运行命令时都会出现这种下降。
基本上,每次读数都是/proc/net/nf_conntrack
巨大的、暂时的下降/proc/sys/net/netfilter/nf_conntrack_count
,监控有时会选择较低的值并将其表示在图表中。
此外,我注意到和的结果有很大的差异cat nf_conntrack
。conntrack -L
此外,nf_conntrack 中的行数与 nf_conntrack_count 不同。内核是v4.19.5。通过这两个间隔三秒部署的命令,一切都变得清晰可见:
[07:30:14] root@web1(~)$ wc -l /proc/net/nf_conntrack; \
cat /proc/sys/net/netfilter/nf_conntrack_count
1236 /proc/net/nf_conntrack
1575
[07:30:18] root@web1(~)$ cat /proc/sys/net/netfilter/nf_conntrack_count;\
wc -l /proc/net/nf_conntrack
2009
1191 /proc/net/nf_conntrack
我的问题是这里到底发生了什么,为什么会发生这种情况(丢失),为什么列出的文件之间存在差异,以及如何防止这种丢失?
答案1
我尝试在运行 CentOS 7.4.1708 和内核 3.10.0-693.21.1.el7.x86_64 的生产服务器上进行相同的测试grep -c tcp /proc/net/nf_conntrack
,watch -n0 "cat /proc/sys/net/netfilter/nf_conntrack_count"
但无法确认是否存在与您遇到的相同的问题。
尝试至少发送您的内核版本,也许运行相同版本服务器的人也可以对其进行测试。
一种可能的情况是,您在使用 grep 时达到了某些系统内存或 CPU 限制,并且对 nf_conntrack 有影响。您可以尝试运行 ie。nice -n19 grep -c tcp /proc/net/nf_conntrack
并使用 ulimits 或 cgroups 来限制 RAM。另一个想法是尝试结合您的问题定义在 Google 上搜索内核版本或 nf_conntrack 版本。这可能是一些错误,但可能性不大。
答案2
总的来说,我认为这取决于您的内核版本和您正在跟踪的连接数。如果我没记错的话,内核需要获取一些锁才能生成 /proc/net/nf_conntrack,这可能是您看到下降的原因。
更好的方法是使用conntrack
能够获取信息netlink
且不会遭受同一组问题的实用程序。