获取TCPbuild立连接的数量

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

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

使用命令:

 ss -neopt state established 

这将只显示在ESTABLISHED状态下的TCP会话,不需要其他命令pipe道,所以它超快。

ssnetstat更好,因为旧的netstat只是读取受文件locking的procfs。 ss实际上在内核调度程序处理的内核中进行查询,总是返回准确的信息。

还请检查: 527875 。

netstat + grep对于一些连接来说是一个很好而简单的select,但是如果你有大量的连接,我会推荐在nixCraft中使用ss

例如: 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 

ss是一个很好的工具。 对于踢你也可以只是:

 [kbrandt@ny-kbrandt01: ~] cat /proc/net/snmp | grep Tcp | awk '{print $10}' CurrEstab 3 

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

 ~# lsof -i tcp -s tcp:ESTABLISHED 

那么| wc -l来算。 注意:没有尝试大量连接的成本。

使用/ proc来减less工作量

我喜欢通过/proc直接访问内核variables 。 这是非常有效的,快速和系统友好。

有一个名为/proc/net/tcp的伪文件(内核variables表),其中有TCP连接和侦听的内核存储列表。 名为st的第6个字段可以包含0A的监听条目, 01代表已build立的连接。

计数TCP build立的连接:

通过使用grep

 grep </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没有正则expression式($ 4 ==“01”)2.51
 sed |  wc 2.67
 awk与正则expression式2.93

 ss -neopt状态成立|  wc -l Suprjami 15.14
 lsof -i tcp -s tcp:ESTABLISHED Tonioc 25055.00

Ok Tonioc的回答非常缓慢,但是由于他的详细程度,他的回答非常有趣。 所以显然不适用于高工作量的系统。

这个工作台让你看到,如果ss是一个非常有用的专用工具,那么询问/procvariables可能会更快。