Linux 性能排查
面试实战题:线上 CPU 高、负载高、变慢了,怎么查。主线:指标怎么看、工具怎么用、思路怎么走。
核心指标与工具
| 工具 | 看什么 | 关键字段 |
|---|---|---|
| top / htop | CPU、内存、进程 | %CPU、RES、load average |
| vmstat | 系统整体:CPU/内存/IO | r(运行队列)、si/so(换页)、us/sy |
| iostat | 磁盘 | %util、await、IOPS |
| free | 内存 | available(别只看 free) |
| sar | 历史数据 | 回溯故障 |
| pidstat | 单进程 | 线程级 CPU |
| perf / strace | 热点/系统调用 | 定位到函数 |
load average 怎么读
- load average(1/5/15 分钟)≈ 运行队列长度(运行 + 不可中断睡眠)
- 判断标准:和核数比。4 核机器 load 4 表示刚好满载,8 表示严重过载
- 不是越低越好,也不是 load 高就一定有问题:要看 CPU 还是 IO 导致的
排查方法论
load 高的排查分支: 先分类再定位
排查顺序:
- top 看全局:CPU 高不高、load 多少、哪个进程占
- vmstat 看分类:us(用户)/ sy(内核)/ wa(IO 等待)/ si-so(换页),先分类再定位
- 定位进程:top →
pidstat -p <pid>(线程级)→ 确认是业务还是系统 - 深挖:perf 看函数热点、strace 看系统调用、jstack 看线程栈(Java)
常见问题速查
| 现象 | 方向 |
|---|---|
| us 高 | 业务计算密集:代码热点、死循环、正则回溯 |
| sy 高 | 上下文切换频繁:线程过多、锁竞争、中断风暴 |
| wa 高 | 磁盘瓶颈:慢 SQL、日志刷盘、swap |
| si/so 高 | 内存不足换页:加内存、查泄漏 |
| load 高但 CPU 低 | 不可中断睡眠(D 状态):磁盘 IO 阻塞 |
| 单核打满其他空闲 | 单线程热点:看代码串行点、GIL 场景(见 Python 篇) |
面试追问
- load average 怎么判断? 和核数比:load/核数 ≈ 满载线。要看是 CPU 忙还是 IO 等
- 排查 CPU 高的步骤? top 找进程 → pidstat 看线程 → perf/线程栈定位热点。先分类(us/sy)再定位
- wa 高说明什么? 磁盘 IO 是瓶颈:查慢查询、日志、swap。CPU 在等 IO
- si/so 是什么? 内存换页:内存不足的硬信号。先查内存泄漏再考虑加内存
- load 高但 CPU 低? 进程在 D 状态(不可中断睡眠):等磁盘 IO。看 iostat 确认