获取系统上的当前TCP连接计数


22

除了做之外wc -l /proc/net/tcp,还有没有更快的方法呢?

我只需要TCP连接总数即可。


5
也许可以尝试ss -s
Ulrich Dangel 2013年

@UlrichDangel很酷,通过阅读sockstat可以更快。您实际上可以将其放在答案区域中;-)
雏菊

Answers:


20

如果您只是想获取数字并且不需要任何详细信息,则可以从中读取数据/proc/net/sockstat{,6}。请记住,必须将两个值组合起来才能获得连接的绝对计数。

如果要从内核本身获取信息,可以使用 NETLINK_INET_DIAG从内核获取信息,而不必从内核中读取信息。/proc


1
我很好奇,看到在一个具有许多连接的系统上进行的测试,将我的解决方案与上述建议的解决方案的性能进行了比较,该解决方案需要额外的算术和过滤才能得出最终答案,而答案仅仅是一个数字!
Johan 2013年

7

更快的方法?这样一秒钟之内就能得到答案,实际上在我的计算机上花费了0.009秒!

您是否正在寻找一种需要更少打字的方式?在这种情况下,请设置别名,例如

alias tcpcount="wc -l /proc/net/tcp"

现在,您只需输入别名即可,例如 tcpcount我在示例中使用即可获取此号码。

输入该行或将其添加到您的.bashrc中,以便在每次登录时定义别名。

对于大量连接,以下命令可能会运行得更快(对于很少数量的连接,运行速度可能会稍慢):

#!/bin/bash
/usr/bin/tail -1 /proc/net/tcp | (IFS=:
read COUNT DISCARD
echo $COUNT
)

或许 ...

awk 'END {print NR}' /proc/net/tcp

这两个解决方案均假定“ wc”对于仅计算行数不是非常理想。我的测试表明这个假设是正确的。

第一个工作的前提是tail命令确实擅长丢弃不需要的数据,以至于它足以创建一个额外的子shell并在环境变量上做额外的工作。它利用了/ proc / net / tcp中的行已经编号的事实,从而消除了对行进行计数的需要。最终解决方案假定awk的数量足以抵消由于加载较大的程序而不是创建多个进程而造成的任何不利影响。awk解决方案的另一个好处是,它很好地适合于简单的单行别名定义(这带来了其他好处,因为没有调用脚本,因此没有派生额外的shell进程,从而提供了额外的毫秒级优势。)


1
我有40k +的连接,耗时超过3秒
雏菊,

2
嗯,我认为没有比从中读取更快的方法了/proc/net/tcp。您可以尝试netstat -n -t | wc -l,但我的猜测是netstat的内容也来自/proc/net/tcp
Kotte

netstat比在我的系统上读取/ proc / net / tcp慢3倍以上,但是连接数很少,因此如果连接数很大,可能会减轻一些启动开销。netstat所可以很容易地获得在不同状态下的连接数....
约翰·

1
在具有16 GB RAM的服务器上,现在需要大约一分钟以上的时间来进行netstat -nt大约180.000个连接。我认为没有理由为什么它应该这么慢...(阅读/proc/net/tcp也很慢)
Marki555 2014年

1
在连接数为180k的计算机上进行的一些害羞测试表明,该awk方法比慢得多wctail似乎与wc
Felix Frank

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.