获取 TCP 已建立连接数

获取 TCP 已建立连接数

在 Linux 服务器上可以使用,netstat -tan | grep ESTABLISHED| wc -l但这在高负载服务器上不起作用watch -n1

如果服务器不是很繁忙或监控间隔足够大,这种方法效果很好。但是对于高负载的服务器,有什么可以推荐的替代方案吗?

答案1

使用/proc减少工作量

我喜欢访问内核变量直接通过/proc。这种方式非常高效、快速且系统友好。

有一个伪文件(内核变量表),名为/proc/net/tcp,内核存储 TCP 连接和监听列表。第 6 个字段称为st为了状态可以包含0A一个监听条目和01一个已建立的连接。

数数TCP 已确立的连接:

通过使用
grep </proc/net/tcp -c '^ *[0-9]\+: [0-9A-F: ]\{27\} 01 '
通过使用
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  </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

另请检查:527875

netstat + grep对于少量连接来说,这是一个很好的、简单的选项,但是如果你有大量的连接,我建议你ss按照nixCraft

例如:ss -s

Total: 78 (kernel 79)
TCP:   31 (estab 27, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 16

Transport Total     IP        IPv6
*     79        -         -        
RAW   0         0         0        
UDP   4         2         2        
TCP   31        2         29       
INET      35        4         31       
FRAG      0         0         0  

答案4

还有 lsof,它可以按协议和状态进行过滤:例如查找 TCP ESTABLISHED 连接:

~# lsof -i tcp -s tcp:ESTABLISHED

然后 | wc -l 进行计数。注意:没有尝试过大量连接时的成本。

相关内容