运维排查神器:ss 命令
一、ss 是什么,为什么用它
ss(Socket Statistics)来自 iproute2 工具包,是 netstat 的替代者,用来查看与统计 socket 连接信息。
相比 netstat:
ss通过 netlink(TCP diag)直接向内核读取 socket 信息;netstat需要遍历/proc/net/下多个文件,连接数大时明显更慢;- 在高并发服务器上(数万连接),
ss几乎秒出,netstat可能卡几十秒。
简单记:能 ss 就别 netstat。
netstat在新发行版中已逐渐被废弃。
二、核心参数速查
| 参数 | 含义 | 助记 |
|---|---|---|
-t |
只看 TCP | tcp |
-u |
只看 UDP | udp |
-l |
只看监听(LISTEN)状态的 socket | listening |
-a |
显示所有状态的 socket(含监听) | all |
-n |
不解析端口/主机名,直接显示数字(更快) | numeric |
-p |
显示占用 socket 的进程信息(需 root) | process |
-s |
输出摘要统计 | summary |
-m |
显示 socket 内存占用 | memory |
-i |
显示 TCP 内部信息(RTT、拥塞窗口等) | internal |
-e |
扩展信息(uid、inode 等) | extended |
-o |
显示计时器信息 | timer |
-4 / -6 |
仅 IPv4 / IPv6 |
最常用的黄金组合:
ss -tlnp(TCP + 监听 + 数字 + 进程),一招查”谁在监听、是哪个进程”。
三、查端口(谁占用了某个端口)
1. 查看所有 TCP 监听端口
$ ss -tln
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:3306 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
2. 查看谁占用了 3306 端口(带进程)
$ ss -tlnp | grep :3306
LISTEN 0 128 0.0.0.0:3306 0.0.0.0:* users:(("mysqld",pid=1023,fd=28))
也可以用 ss 自带的过滤表达式,更精确:
$ ss -tlnp 'sport = :3306'
排错场景:服务起不来报
Address already in use,用这招秒查是哪个进程没释放端口。
3. 同时看 TCP 和 UDP 监听
$ ss -tulnp
四、查进程(端口 ↔ 进程互查)
1. 已建立连接里,某进程连了谁
$ ss -tnp | grep mysq
ESTAB 0 0 10.0.0.5:3306 10.0.0.8:51234 users:(("mysqld",pid=1023,fd=30))
2. 查看某个进程(按 PID)的所有连接
$ ss -tnp | grep 'pid=1023'
3. 查看本机对外建立了哪些连接
$ ss -tn
-p必须配合 root 权限才能看到完整进程名,否则非 root 用户只能看到自己进程。
五、排查网络(连接状态与统计)
1. 连接摘要(一眼看清全貌)
$ ss -s
Total: 1838 (kernel 3580)
TCP: 2388 (estab 66, closed 2269, orphaned 0, synrecv 0, timewait 2175/0), ports 0
Transport Total IP IPv6
* 3580 - -
RAW 1 0 1
UDP 2 1 1
TCP 119 71 48
FRAG 0 0 0
排查连不上的问题,先
ss -s看estab/timewait是否异常飙升。
2. 按状态过滤连接(ss 的杀手锏)
$ ss -tn state established # 已建立
$ ss -tn state time-wait # TIME_WAIT(高并发常见)
$ ss -tn state close-wait # CLOSE_WAIT(对端关了我没关,应用层 bug)
$ ss -tn state listening # 监听中
统计 TIME_WAIT 数量:
$ ss -tn state time-wait | wc -l
2175
排查思路:
TIME_WAIT暴涨多半是短连接过多,可考虑长连接复用或调内核参数;
CLOSE_WAIT堆积则是应用没主动 close,代码层排查。
3. 按地址 / 端口过滤连接
$ ss -tn dst 192.168.1.100 # 与指定 IP 的连接
$ ss -tn dport = :443 # 目标端口为 443 的连接
$ ss -tn sport = :80 # 本机源端口为 80 的连接
$ ss -tn '( dport = :443 or dport = :80 )' # 组合条件
4. 查看 TCP 内部细节(高级,定位性能问题)
$ ss -tni
输出会包含 RTT(往返时延)、cwnd(拥塞窗口)、重传等,定位”网络慢、丢包”很有用。
六、实战速查清单
| 排查目标 | 命令 |
|---|---|
| 查看监听端口 | ss -tlnp |
| 查谁占了某端口 | ss -tlnp \| grep :端口 |
| 查所有已建立连接 | ss -tn |
| 端口反查进程 | ss -tnp \| grep :端口 |
| 连接总览 | ss -s |
| 统计 TIME_WAIT | ss -tn state time-wait \| wc -l |
| 查与某 IP 的连接 | ss -tn dst IP |
| 查 TCP 性能细节 | ss -tni |
| 同时看 TCP+UDP 监听 | ss -tulnp |