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

dai*_*isy 22 networking monitoring tcp

而不是做wc -l /proc/net/tcp,有没有更快的方法呢?

我只需要 tcp 连接的总数。

Ulr*_*gel 20

如果您只想获取号码而不需要任何详细信息,您可以从/proc/net/sockstat{,6}. 请记住,您必须结合这两个值才能获得绝对连接数。

如果您想从内核本身获取信息,您可以使用 NETLINK_INET_DIAG从内核获取信息,而无需从/proc


Joh*_*han 7

更快的方法?这种方式会在几分之一秒内产生答案,实际上在我的电脑上需要 0.009 秒!

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

alias tcpcount="wc -l /proc/net/tcp"
Run Code Online (Sandbox Code Playgroud)

您现在可以输入别名(例如tcpcount,我在示例中使用的别名)来获取此编号。

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

对于大量连接,以下可能会运行得更快一点(对于非常少量的连接,运行速度可能会稍慢一些):

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

或者可能 ...

awk 'END {print NR}' /proc/net/tcp
Run Code Online (Sandbox Code Playgroud)

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

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

  • 嗯,我认为没有比从 `/proc/net/tcp` 读取更快的方法了。你可以试试`netstat -n -t | wc -l`,但我的猜测是 netstat 也从 `/proc/net/tcp` 读取 (2认同)