运维排查神器:ss 命令

运维排查神器:ss 命令

一、ss 是什么,为什么用它

ss(Socket Statistics)来自 iproute2 工具包,是 netstat 的替代者,用来查看与统计 socket 连接信息

相比 netstat

  • ss 通过 netlink(TCP diag)直接向内核读取 socket 信息;
  • netstat 需要遍历 /proc/net/ 下多个文件,连接数大时明显更慢;
  • 在高并发服务器上(数万连接),ss 几乎秒出,netstat 可能卡几十秒。

简单记:能 ss 就别 netstatnetstat 在新发行版中已逐渐被废弃。

二、核心参数速查

参数 含义 助记
-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 -sestab / 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
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇