在 Linux 服务器上可以使用,netstat -tan | grep ESTABLISHED| wc -l
但这在高负载服务器上不起作用watch -n1
。
如果服务器不是很繁忙或监控间隔足够大,这种方法效果很好。但是对于高负载的服务器,有什么可以推荐的替代方案吗?
答案1
使用/proc减少工作量
我喜欢访问内核变量直接通过/proc
。这种方式非常高效、快速且系统友好。
有一个伪文件(内核变量表),名为/proc/net/tcp
,内核存储 TCP 连接和监听列表。第 6 个字段称为st
为了状态可以包含0A
一个监听条目和01
一个已建立的连接。
数数TCP 已确立的连接:
通过使用grepgrep </proc/net/tcp -c '^ *[0-9]\+: [0-9A-F: ]\{27\} 01 '
通过使用awk
awk </proc/net/tcp 'BEGIN{t=0};{if ($4 == "01") {t++;}};END{print t}'
或者
awk </proc/net/tcp 'BEGIN{t=0};/^ *[0-9]+: [0-9A-F: ]{27} 01 /{t++};END{print t}'
通过使用sed
sed </proc/net/tcp '/^ *[0-9]\+: [0-9A-F: ]\{27\} 01 /p;d' | wc -l
执行时间处理时间
因为这个问题代表高负荷系统。我做了一个小实验:
方法答案(毫秒) grep Techno 2.48 awk 没有正则表达式 ($4=="01") 2.51 sed | wc 2.67 awk 与正则表达式 2.93 ss -neopt 状态已建立 | wc -l Suprjami 15.14 lsof -i tcp -s tcp:已建立 Tonioc 25055.00
好吧,Tonioc 的回答很慢,但他的冗长非常有趣。所以显然在高负载系统上不可用。
这个工作台让你看到,如果ss
是一个非常有用的专用工具,询问/proc
变量可能会快得多。
答案2
使用命令:
ss -neopt state established
这将仅显示处于ESTABLISHED
状态的 TCP 会话,不需要管道传输到其他命令,因此速度非常快。
ss
比以前更好,netstat
因为旧版本netstat
只是从受文件锁约束的 procfs 中读取。ss
实际上是在内核内部进行查询,由内核调度程序处理并始终返回准确的信息。
答案3
答案4
还有 lsof,它可以按协议和状态进行过滤:例如查找 TCP ESTABLISHED 连接:
~# lsof -i tcp -s tcp:ESTABLISHED
然后 | wc -l 进行计数。注意:没有尝试过大量连接时的成本。