ss是专为高并发设计的网络工具,通过netlink直读内核socket,5万连接仅需0.3秒;查监听必须用-tuln组合:-t和-u共存才覆盖TCP/UDP,-l显示LISTEN状态,-n避免DNS解析卡顿,加-4可过滤IPv6干扰。

ss 是专为高并发场景设计的网络连接查看工具,它不走 /proc/net 文件解析的老路,而是通过 netlink 直接读取内核 socket 子系统,5 万连接下仅需约 0.3 秒,而 netstat 同样负载要卡 15 秒以上。用对参数,才能真正发挥它的性能优势。
查监听端口:必须用 -tuln 四连组合
漏掉任意一个字母,结果就不可靠:
- -t 和 -u 要一起用:只加 -t 看不到 DNS(53)、NTP(123)等 UDP 服务;只加 -u 则漏掉 SSH、HTTP 等 TCP 服务
- -l 不可省:没有它,ss 默认只显示已建立连接(ESTABLISHED),根本看不到谁在“守门”
- -n 是提速关键:不加时,若 /etc/hosts 异常或 DNS 不通,ss 可能卡住 10 秒以上;加了就直接显示 IP 和数字端口
- 如只需 IPv4,末尾补 -4(如
sudo ss -tulnp -4),避免 [::]:22 这类 IPv6 地址干扰判断
查已建立连接:区分“全量非监听”和“真正在通信”
两种常见需求,对应不同写法:
-
ss -tun:列出所有非监听态的 TCP/UDP 连接,含 CLOSE_WAIT、TIME_WAIT、FIN_WAIT1 等——适合排查连接泄漏、资源未释放 -
ss -tn state established:只保留 ESTABLISHED 状态,第 5 列 Peer Address:Port 就是真实客户端地址+端口——适合看当前活跃会话 - 别用
ss -tln | grep :80查客户端:那是监听列表,没连接时为空;也别用grep :80替代内置过滤,会误匹配 192.168.80.1 或漏掉 sport=80 的 outbound 连接 - 正确过滤写法:
ss -tn 'dport = :80'(别人连你 80),ss -tn 'sport = :80'(你主动用 80 当源端口)
查进程归属:-p 必须配 sudo,否则静默跳过
普通用户执行 ss -tulnp 不报错,但看不到 users:(("nginx",pid=1234,fd=6)) 这类信息——不是命令失败,是内核权限拦截后静默忽略。
- 必须用
sudo ss -tulnp才能完整显示进程名与 PID - 输出中 fd=6 表示该进程用的是第 6 号文件描述符,可用于进一步追踪(如
ls -l /proc/1234/fd/6) - 若只关心某个端口被谁占,
sudo ss -tulnp | grep ':8080'最直接;注意 :8080 出现在倒数第二列(Local Address:Port),别当成 PID 列
看全局健康度:用 ss -s 快速识别内核压力
这个统计不耗时,却能暴露深层问题:
-
ss -s输出里 estab 是当前活跃连接数,是业务水位核心指标 -
time-wait 后斜杠值(如
time-wait 23182/0)非零,说明哈希桶溢出,内核 socket 处理能力已达瓶颈 - CLOSE-WAIT 数量持续偏高,大概率是本地方应用调用了 close() 但没彻底 shutdown,导致连接卡在半关闭状态
- 若 total 值远大于 estab(比如 total=3691、estab=3163),说明大量连接处于 TIME-WAIT 或 FIN-WAIT 等中间态,需结合业务模型评估是否合理


















