ss是当前linux查看网络连接的首选工具,因它直接读取内核tcp_diag模块,毫秒级响应、支持双栈、字段对齐严格且适合脚本解析;而netstat需解析/proc/net/tcp等文本文件,万级连接时易卡顿超时、漏ipv6、输出不规整。

ss 是当前 Linux 查看所有网络连接的首选工具,netstat 已被标记为废弃,新系统(如 Ubuntu 22.04+、RHEL 8+)默认不带 netstat,且高并发下它会卡顿甚至超时——这不是“能不能用”的问题,而是“该不该用”的问题。
为什么 ss -tuln 比 netstat -tuln 更可靠
ss -tuln 直接读取内核 tcp_diag 模块,而 netstat -tuln 要逐行解析 /proc/net/tcp 等多个文件。这意味着:
- 万级连接时,
ss -tuln响应在毫秒级;netstat -tuln可能卡住数秒甚至因超时返回不全结果 -
ss默认输出列紧凑、字段对齐严格,适合脚本解析;netstat多一列Proto,且空格不固定,awk '{print $7}'这类操作容易错位 -
ss -tuln自动兼容 IPv4/IPv6 双栈;netstat -tuln在某些内核版本中会漏掉 IPv6 的LISTEN条目
查所有已建立的 TCP 连接,别用 grep ESTABLISHED
直接运行 ss -tn | grep ESTABLISHED 是常见错误:它依赖文本匹配,会漏掉 IPv6 连接(含方括号地址),也匹配不到状态字段不在默认输出列末尾的情况。
- 正确做法是显式使用
state关键字:ss -tn state established - 要包含 IPv6,加
-6;只看 IPv4,加-4;想一次覆盖全部,用ss -t -a | awk '$1 ~ /^(tcp|tcp6)$/ && $NF ~ /^ESTABLISHED$/{i++} END{print i+0}' - 注意大小写:
established小写才有效,ESTABLISHED不匹配
ss -tulnp 报 Permission denied 怎么办
这不是权限不足,而是 ss -p 需要读取 /proc/[pid]/fd/ 下的 socket 描述符,普通用户无权访问其他用户的 /proc 子目录。
- 最简解法:加
sudo,即sudo ss -tulnp - 某些发行版(如 Ubuntu 22.04+)默认禁用
ss的-p能力,此时可改用sudo ss -tuln先定位端口,再用sudo lsof -i :端口号补查进程(lsof输出含完整路径和用户) - 容器内执行时,
ss -tulnp永远只能看到本容器进程,别指望它显示宿主机上kube-proxy或nginx的监听
ss -s 统计里真正该盯住的三个数字
ss -s 一行输出里藏着服务健康度的关键信号,别只扫 total:
-
TCP: total 12456—— 总 TCP socket 数,接近 65535 说明端口快耗尽,需检查是否未复用或连接泄漏 -
estab 892—— 真实活跃连接数,若远低于total,说明大量连接卡在TIME-WAIT或CLOSE-WAIT,得查应用是否没正确close() -
memory: 0.50MB—— socket 内存占用,持续 >10MB 很可能有连接未释放,导致内存缓慢上涨
这些数字比“有没有 ESTABLISHED”更能反映系统是否在 quietly rotting。











