ss -tnp 会把每个连接和持有它的进程一起列出来,ss -ti 再补上每个套接字的字节计数。两者合起来,就能在不安装任何软件的前提下把流量归到进程头上——在你只是客人的服务器上、在容器里、在任何没有 root 装包的地方,这一点很重要。
1. 谁连上来了,又是谁的进程
$ clai 显示已建立的连接以及对应进程→ ss -tnp 'sport = :8099 or dport = :8099'State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ESTAB 0 4190912 127.0.0.1:8099 127.0.0.1:52080 users:(("python3",pid=1120102,fd=4))ESTAB 324447 0 127.0.0.1:52080 127.0.0.1:8099 users:(("curl",pid=1120130,fd=4))
Process 那一列直接给出名字和 pid。发送端 Send-Q 有四兆,意味着应用已经写进去、网络还没取走的数据——这是判断"就是这个套接字把管道塞满了"的可靠信号。
2. 一个套接字上过了多少字节
$ clai 显示这个连接上传输了多少字节→ ss -tin 'dport = :8099' | grep -oE 'bytes_sent:[0-9]+|bytes_received:[0-9]+'bytes_sent:85bytes_received:8579963
这才是值得记住的部分。-i 会附上 TCP 的内部统计,其中就有按套接字的字节计数。这就是不用 nethogs 的"按进程流量",因为上一条命令已经把套接字和 pid 绑起来了。
3. 网卡总量
$ clai 显示 lo 网卡的流量计数→ grep -E '^\s*lo:' /proc/net/dev | awk '{print "rx_bytes="$2, "tx_bytes="$10}'rx_bytes=581097986 tx_bytes=581097986
任何 Linux 系统上都有 /proc/net/dev,容器里也有。这些是自开机以来的累计值,单看毫无意义——意义在两次读数之差里。
4. 一秒钟的吞吐
$ clai 测一下 lo 上一秒钟的传输速率→ a=$(awk '/^ *lo:/{print $10}' /proc/net/dev); sleep 1; b=$(awk '/^ *lo:/{print $10}' /proc/net/dev); echo "$(( (b-a)/1024 )) KB/s"4764 KB/s
相隔一秒的两次读数——所有带宽计的原理不过如此。把 lo 换成 eth0 或 enp5s0 即可。
5. 按连接数排的进程
$ clai 显示哪些进程持有的连接最多→ ss -tnp | awk 'NR>1 {match($0,/"[^"]+"/); if (RSTART) print substr($0,RSTART+1,RLENGTH-2)}' | sort | uniq -c | sort -rn | head -5
连接数不等于流量,但作为第一刀切下去很有用:握着一百个套接字的进程一眼就能看出来。锁定嫌疑之后,再去看第 2 步里的字节计数。
6. 动态盯着看
$ clai 每秒刷新一次连接列表→ watch -n1 "ss -tnp state established"
ss 自己没有重复刷新模式,那就交给 watch。这是 iftop 的穷亲戚,好处是你登录的每台机器上都有。
Gotchas
- 连接数不是带宽。 一个套接字可以拉走好几个 GB,而一百条闲置的 keep-alive 连接什么都不动。连接用来找出嫌疑对象,
ss -ti的计数才是证据。 - 没有 root 时只能看到自己的进程。 别人的套接字那一列只有在
sudo下才会填上。别人的连接旁边是空的,意思是"不是你的进程",而不是"没有进程"。 - 网卡计数包含机器上的一切。
/proc/net/dev也会算上软件包更新、监控代理和邻居容器。要精确答案就去看套接字,而不是网卡。
Related questions
那什么时候值得装 nethogs? 当你需要长期、舒服地按进程盯流量时。一次性排查用 ss 完全够;盯上几个小时就是另一回事了。
怎么看容器的流量? 它的计数在自己的网络命名空间里:docker exec <名字> cat /proc/net/dev 显示的正是这个容器的流量。
怎么区分是链路被塞满还是应用慢? 速率不变而 Send-Q 一直涨,说明应用写入比网络排空更快。Send-Q 空着但吞吐很低,问题就在应用或对端。
See also
CliAI 能从一句普通的话里拼出这些 ss 过滤器,你不必把语法记在脑子里。一行安装。