用 ss 替代 netstat 查 tcp 连接:ss -s 看各状态总数,ss -tn | wc -l 统计 tcp 连接数,ss -tnlp 'sport == :8080' 查端口占用,ss -tn state established '( dport == :8080 )' | wc -l 查 estab 连接数,配合 syn-recv 和 listen 队列监控防雪崩。

怎么快速看当前所有 TCP 连接数
直接用 ss,别用过时的 netstat——它要遍历 /proc,慢且在新系统里常被删掉。ss 读取内核 socket 表,毫秒级响应,而且默认就装在大多数现代发行版里。
-
ss -s:一眼看到总计多少 ESTAB、TIME-WAIT、LISTEN 等状态连接(注意:这个总数不含 UDP) -
ss -tn | wc -l:只统计 TCP 连接行数(-t是 TCP,-n不解析域名/服务名,避免 DNS 查询拖慢) - 想排除本地回环?加
src != 127.0.0.1:比如ss -tn src != 127.0.0.1 | wc -l
怎么查某个端口被谁占着、连了多少人
比如发现 :8080 响应变慢,得立刻知道是不是连接堆积了。重点不是“谁在连”,而是“连得太多导致队列满”——这时候 ss -tnlp 比 lsof 更准更快。
-
ss -tnlp 'sport == :8080':精确匹配监听 8080 的进程(sport是 source port,即本机监听端口) - 看 ESTAB 连接数:用
ss -tn state established '( dport == :8080 )' | wc -l(注意是dport,因为对服务端来说,对方连过来的目标端口才是dport) - 如果输出为空但连接明显卡住,可能是连接卡在 SYN_RECV(半开),加
state syn-recv单独查
为什么 netstat -an | grep ESTAB | wc -l 结果不准
这不是命令写错了,是底层机制变了。Linux 4.1+ 内核默认开启 tcp_tw_reuse 和 tcp_fin_timeout 调优,大量连接会快速进入 TIME-WAIT,但 netstat 把它们全算进“活跃连接”;而 ss 默认不显示 TIME-WAIT,更贴近真实并发压力。
-
netstat统计的是“当前 socket 结构体数量”,包含大量已关闭但未彻底回收的连接 -
ss -s输出里的tcp行第一列是“total connected”,第二列才是ESTAB,别看错位置 - 某些容器环境(如 Docker with userland-proxy),
netstat可能根本看不到宿主机视角的连接映射
监控脚本里该用什么指标防雪崩
单纯看“总连接数”没意义。Web 服务扛不住,往往是因为 ESTAB + SYN_RECV 合计超过应用层连接池上限(比如 Nginx 的 worker_connections),或触发了内核 backlog 队列溢出。
- 关键指标组合:
ss -s | awk '/TCP:/ {print $2}'(ESTAB)、ss -s | awk '/SYN-RECV:/ {print $2}'(半开) - 检查 listen 队列是否打满:
ss -lnt | awk '$4 ~ /:/ {print $4,$5}',第三列是Recv-Q,持续 > 0 就说明 accept() 跟不上了 - 不要用
cat /proc/net/tcp解析——十六进制地址难读,状态码要查表,还容易漏掉 IPv6
真正卡住的时候,往往不是连接数爆了,而是某个后端服务响应慢,把连接池全占住又不释放。盯住 ESTAB 数的同时,一定得配合 curl -o /dev/null -s -w '%{http_code}\n' http://localhost:8080/health 这类探针。










