ss命令:高并发下网络连接状态查看的唯一可靠选择 在高并发场景下,真正能扛住压力、稳定输出真实连接状态的工具,只有 ss。拿 5 万连接来测试:netstat 得卡上 15 秒,ss 只要 0.3 秒——而且它直接读取内核 socket 数据,不依赖 /proc/net 解析,结果自然更准。同样,s
Linux ss命令查看网络连接状态
时间:2026-07-03
浏览:100
文章目录
ss命令:高并发下网络连接状态查看的唯一可靠选择
在高并发场景下,真正能扛住压力、稳定输出真实连接状态的工具,只有 ss。拿 5 万连接来测试:netstat 得卡上 15 秒,ss 只要 0.3 秒——而且它直接读取内核 socket 数据,不依赖 /proc/net 解析,结果自然更准。同样,ss -tuln 这条命令必须同时带 -t(TCP)、-u(UDP)、-l(监听)、-n(数字格式),缺一个都会出事:漏掉 -t 或 -u 就看不到对应协议的监听端口;漏掉 -l 只能看到已建立连接;漏掉 -n 则可能因为 DNS 解析卡顿而挂住。查看已建立连接时,ss -tun 默认包含所有非监听状态(如 CLOSE_WAIT、TIME_WAIT),而 ss -tn state established 只筛选真正在通信的 ESTABLISHED 连接。加 -p 需要 sudo 权限才能显示其他用户的进程信息,输出形如 users:(("nginx",pid=1234,fd=6))。ss -s 提供全局连接健康度统计:estab 是活跃连接数,time-wait 后面的斜杠值非零说明哈希桶溢出、内核压力大,CLOSE-WAIT 多往往表示本地方应用没调 close()。状态过滤与语法严格耦合——比如 state listen 只对 -l 有效,dport/sport 过滤必须加引号和冒号,IPv6 地址含方括号需要特殊处理。

简单说,ss 不是“能看就行”的替代品,而是高并发下的唯一可靠选择——netstat 在 5 万连接时要卡 15 秒,它同样负载下只要 0.3 秒,并且直接从内核 socket 子系统读数据,不依赖 /proc/net 解析,结果更准。
查监听端口:为什么 ss -tuln 必须带这四个字母
漏掉任意一个都会导致关键信息丢失或命令变慢:
-t和-u要一起用,否则看不到 UDP 监听(比如 DNS、NTP);-l是“listening”的缩写,不加它就只显示已建立的连接,根本看不到谁在等连接;-n强制数字格式,避免 DNS 解析卡顿——尤其当/etc/hosts有异常或网络不通时,ss -tul可能挂住 10 秒以上;- 如果只关心 IPv4,末尾补
-4(如sudo ss -tulnp -4),否则双栈环境下 IPv6 地址(如[::]:22)会混在结果里干扰判断。
查已建立连接:ss -tun 和 ss -tn state established 不是一回事
ss -tun 默认包含所有非监听 TCP/UDP 连接,包括 CLOSE_WAIT、TIME_WAIT、FIN_WAIT1 等,适合排查连接泄漏;而 ss -tn state established 是显式过滤,只留真正通信中的连接,字段第 5 列 Peer Address:Port 就是客户端 IP 和端口。常见误操作:
- 用
ss -tln查客户端——那是监听列表,没连接时为空; - 用
grep :80替代内置过滤——会匹配到192.168.80.1这类 IP,也漏掉源端口为 80 的连接; - 正确写法:
ss -tn 'dport = :80'(别人连你 80),ss -tn 'sport = :80'(你主动用 80 当源端口)。
看进程归属:加 -p 为什么总提示 Permission denied
-p 本身不报错,但没权限时内核拒绝提供进程信息,ss 就静默跳过——看起来像没输出,实际是权限不足。必须用 sudo ss -tulnp 才能看到其他用户的进程名和 PID;输出中最后一列形如 users:(("nginx",pid=1234,fd=6)),其中 pid 是进程 ID,fd 是该 socket 对应的文件描述符编号。注意:某些发行版(如 Alpine)默认禁用 netlink 权限,即使加 sudo 也可能看不到进程,此时需检查内核配置或换用 lsof -i :端口 临时替代。
统计连接健康度:ss -s 里那些数字到底在说什么
ss -s 不列具体连接,只给全局快照,关键看这几项:
tcp行里的estab是当前活跃连接数,time-wait超过 2 万要警惕端口耗尽;timewait 23182/0中斜杠后那个数字是哈希桶溢出次数,非零说明内核连接表压力过大,可能丢包或新建连接失败;CLOSE-WAIT多,基本等于本地方应用没调close();FIN-WAIT-2高,大概率是对端没发 FIN,或者本端 close 后没等完就退出进程;
别用 wc -l 数行数代替 ss -s——它统计的是 socket 实例,不是文本行数,ss -tan | wc -l 在 TIME_WAIT 多时严重低估真实连接负载。
真正容易被忽略的,是状态语义和过滤语法的耦合性:比如 state connected 和 state established 等价,但 state listen 只对 -l 有效;dport 和 src 不能混用在同一条命令里而不加括号;还有,IPv6 地址带方括号,用 cut -d: -f1 提取 IP 会截断 [::1] 成空字符串——这些细节不踩一遍坑,很难真正用稳 ss。
实用工具推荐
绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
选择画质和输出格式,预览压缩前后的大小。