获取 TCP 建立的连接数

Vin*_*nti 8 linux monitoring netstat tcp

在 Linux 服务器上可以使用,netstat -tan | grep ESTABLISHED| wc -l但在带有watch -n1.

如果服务器不是很忙或者监控间隔足够大,这种方法可以正常工作。但是可以推荐什么作为高负载服务器的替代方案?

sup*_*ami 7

使用命令:

ss -neopt state established
Run Code Online (Sandbox Code Playgroud)

这将只显示处于ESTABLISHED状态的TCP 会话,不需要其他命令的管道,因此速度非常快。

ssnetstat因为旧的netstat只是从受文件锁定影响的 procfs 读取要好。ss实际上在内核内部进行查询,由内核调度程序处理并始终返回准确的信息。


tec*_*hno 4

使用/proc减少工作量

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

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

统计TCP 建立的连接:

通过使用
grep </proc/net/tcp -c '^ *[0-9]\+: [0-9A-F: ]\{27\} 01 '
Run Code Online (Sandbox Code Playgroud) 通过使用
awk  </proc/net/tcp 'BEGIN{t=0};{if ($4 == "01") {t++;}};END{print t}'
Run Code Online (Sandbox Code Playgroud)

或者

awk  </proc/net/tcp 'BEGIN{t=0};/^ *[0-9]+: [0-9A-F: ]{27} 01 /{t++};END{print t}'
Run Code Online (Sandbox Code Playgroud) 通过使用
sed  </proc/net/tcp '/^ *[0-9]\+: [0-9A-F: ]\{27\} 01 /p;d' | wc -l
Run Code Online (Sandbox Code Playgroud)

执行时间处理时间

因为这个问题代表高工作负载系统。我做了一个小板凳:

方法以毫秒为单位回答

grep 技术 2.48
awk 无正则表达式 ($4=="01") 2.51
sed | 厕所 2.67
awk 与正则表达式 2.93

ss -neopt 状态建立 | wc -l 苏普贾米 15.14
lsof -i tcp -s tcp:已建立 Tonioc 25055.00

好吧,托尼奥克的回答很慢,但他的冗长很有趣。因此显然不适用于高工作负载系统。

这个工作台让您看到,如果ss是一个非常有用的专用工具,那么询问/proc变量可能会快得多。