ESTABLISHED 连接数最反映真实负载,即当前活跃的 TCP 通道数,可用 ss -nt | grep ESTABLISHED | wc -l 获取;避免统计 TIME_WAIT 或未加状态过滤的端口连接,ss 比 netstat 更高效准确。

直接看 ESTABLISHED 连接数最反映真实负载
连接数不是“有多少请求进来”,而是“此刻有多少条活的 TCP 通道”。真正影响服务性能的是 ESTABLISHED 状态的连接,比如正在传输 HTTP 响应、WebSocket 持久通信、数据库长连接等。用 netstat -na | grep ESTABLISHED | wc -l 或更推荐的 ss -nt | grep ESTABLISHED | wc -l 即可得到这个关键数字。
- 别统计
TIME_WAIT:它只是四次挥手后的残留状态,通常很快释放,大量存在不等于压力大(除非端口耗尽) - 避免只看端口过滤却不加状态判断:例如
netstat -nat | grep :80 | wc -l会把SYN_RECV、CLOSE_WAIT、TIME_WAIT全算进去,结果虚高且误导 -
ss比netstat更快更准,尤其在连接数上万时,netstat可能卡顿甚至超时——因为它是从 /proc/net/ 下逐个读取文件,而ss直接调用内核接口
查哪个 IP 连得最多?小心 IPv6 和地址截断问题
排查异常流量或攻击源时,常需要按客户端 IP 统计连接数。标准命令是:ss -nt | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -20。
- IPv6 地址会被
cut -d: -f1截成前缀(如2001:db8::→2001),导致统计失效;正确做法是用awk -F'[: ]+' '{print $6}'或直接用ss -nto | awk '{print $6}'提取完整远程地址 -
ss -nt默认不显示监听中但未建立的连接(如LISTEN),这反而是好事——你要的是“已连上”的 IP,不是“可能连上来”的 - 如果看到某个 IP 占比极高但连接数不高(比如 50 个连接占总量 80%),优先检查该 IP 是否是 CDN 回源、健康检查探针或 NAT 网关出口,而非直接拉黑
系统没装 netstat 怎么办?别急着 apt install
CentOS 8+/Ubuntu 20.04+ 默认不带 netstat,报错 command not found 很常见。但安装 net-tools 包不是必须选项,反而可能引入兼容性隐患。
- 优先用
ss:它属于iproute2套件,现代发行版默认预装,功能覆盖 95% 的netstat场景 - 真要兼容旧脚本?CentOS 系用
yum install -y net-tools,Ubuntu/Debian 用apt install -y net-tools,但注意:某些容器镜像(如 distroless)根本没法装 - 极简环境(如 busybox 容器)连
ss都没有?可直接读/proc/net/tcp:用awk '$4 == "01" {++c} END{print c+0}' /proc/net/tcp(01是十六进制的ESTABLISHED状态码)
连接数突增却查不到对应进程?盯紧 inode 和 lsof
有时 ss 或 netstat 显示连接很多,但 ps aux | grep 找不到对应服务进程,常见于短连接风暴、子进程继承 socket、或程序崩溃后连接未及时回收。
- 用
ss -tunlp查监听端口和所属进程(需 root 权限),其中lsof -iTCP -sTCP:ESTABLISHED -n -P能列出每个 ESTABLISHED 连接的 PID 和命令名,比ss更直观 -
lsof输出里若出现(deleted)或 PID 为-,说明进程已退出但 socket 尚未关闭,此时要结合cat /proc/[pid]/fd/看残留 fd - 连接数飙高但 CPU/内存平稳?大概率是连接堆积在内核协议栈(如 SYN queue 满了),这时要看
netstat -s | grep -i "listen overflows"或ss -s中的synrecv计数
真正难的不是“怎么数”,而是数出来之后怎么区分:是业务增长、配置错误、还是攻击试探。同一行命令,在 Nginx 反向代理后看到的 IP 是真实用户还是上游负载均衡器,决定了你下一步该调参数、加限流,还是联系运维查网络层。










