Linux 性能排查
Linux 性能排查用资源指标定位请求耗时。本文负责负载、CPU、内存、I/O 和等待分析。
1. 面试核心
先记住这几条,再读正文- 平均负载。 Linux load average 统计 R 与 D 状态任务的平均数量。卡 · load average 指标
- CPU 时间分类。
top的 us、sy 和 si 分别表示用户态、内核态和软中断时间。卡 · 三类场景的排查路径 - I/O 观测。
iostat按设备统计,pidstat -d按任务观察 I/O。卡 · 三类场景的排查路径 - 资源压力。 PSI 量化任务因 CPU、内存和 I/O 资源受阻的时间。卡 · PSI 与容器限流
- 容器限流。 CPU 配额限流可在宿主空闲时增加容器延迟。卡 · PSI 与容器限流
2. load average 指标
uptime 和 top 显示 1、5、15 分钟平均负载。Linux 按指数衰减计算 R 与 D 状态的任务数量。任务包含线程。
R 包括正在运行和等待 CPU 的任务。D 是不可中断睡眠,常见于存储和内核资源等待。D 的贡献会让负载高于 CPU 繁忙程度。
| 现象 | 后续判断 |
|---|---|
| 负载高、CPU 忙、r 队列长 | 检查计算和 CPU 竞争 |
| 负载高、CPU 空闲、D 多 | 检查不可中断等待 |
| 1 分钟值高于 15 分钟值 | 近期负载高于较长时间尺度 |
| 负载低、单核持续忙 | 检查单线程瓶颈 |
负载与 CPU 核数只能辅助比较。负载等于核数并不证明 CPU 刚好用满。应同时查看任务状态、每核用量和实际配额。
3. 常用工具与关键字段
| 工具 | 关键证据 |
|---|---|
top、mpstat -P ALL 1 | 总体与每核 CPU;us、sy、si、wa、st |
vmstat 1 | r 可运行任务、b 阻塞任务、si/so 交换、cs 切换 |
free -h | available 与 swap 用量 |
iostat -x 1 | await、aqu-sz、吞吐与 util |
pidstat -u -d -w 1 | 任务的 CPU、I/O 和切换 |
iotop | 任务 I/O 活动 |
perf top -p <pid> | 热点函数采样 |
dmesg | OOM、设备错误等内核记录 |
vmstat 和 iostat 首次报告包含启动以来的统计。诊断当前变化时,应观察后续间隔输出。
iostat 的 await 包含排队和服务时间。util 表示统计周期内设备处理 I/O 的时间占比。SSD 和 RAID 可并行处理多个请求。util 接近 100% 仍需结合延迟与吞吐判断。
wa 是 CPU 空闲且有待完成 I/O 时的统计。它不能单独定位设备或进程。st 表示虚拟 CPU 等待宿主调度的时间。虚拟机与容器的资源约束应分别核对。
4. 三类场景的排查路径
4.1 CPU 热点
- 对比故障时间、流量和发布记录。
- 用 top 找高占用进程,再用每核统计检查分布。
- 用
top -Hp <pid>或 pidstat 找线程。 - 用户态热点用 perf 或语言工具定位。
- 内核态热点结合调用、中断与上下文切换分析。
sy 高时可用 strace -c -p <pid> 统计系统调用。采样和跟踪本身有开销,应控制范围。si 高时核对网络包量和软中断分布。
4.2 内存压力
- 查看 available,并观察
vmstat 1的 si/so。 - 按进程核对 RSS、缓存和工作集变化。
- 查看 OOM 日志与 cgroup 内存事件。
- 结合 GC、回收和 I/O 指标确认因果关系。
swap 已用量表示已有页面驻留交换空间。持续换入换出才说明当前存在交换活动。内存压力也可在未启用 swap 时发生。泄漏判断需看对象或内存持续保留的证据。
4.3 低 CPU 与高延迟
机器平均 CPU 低时,先看单核与容器配额。单线程瓶颈会被多核平均值稀释。CPU 限流也会增加等待。
随后分解请求耗时。设备 await 上升时,关联进程 I/O 和 PSI。线程池、连接池或锁等待需查看队列与线程栈。依赖延迟则通过追踪和下游指标核对。
等待线程本身是正常状态。需要把堆栈与故障请求、队列增长关联。链路关联方法见 可观测性。
5. PSI 与容器限流
启用 PSI 的内核提供 /proc/pressure/ 接口。cpu、memory、io 文件分别反映资源压力。avg10、avg60、avg300 是不同窗口的受阻时间比例。total 是累计受阻时间,单位微秒。
some 表示至少一个任务因该资源受阻。full 表示所有非空闲任务同时受阻。系统级 CPU full 未定义,输出保持为零。CPU 诊断应重点结合 some、运行队列和配额。
cgroup v2 还提供组级 pressure 文件。容器延迟升高时,检查本组及父组的资源限制。cpu.stat 中 throttled 计数持续增加,说明发生配额限流。机制见 容器原理。
PSI 描述压力造成的等待,利用率描述资源忙碌。两者结合请求延迟,才能判断压力是否影响业务。
6 · 面试题卡片
本页题目与参考回答
6.1 top 显示的 load average 三个数字是什么含义?怎样判断 CPU 处于高负载?负载高可能有哪些原因?
考察重点
- 负载统计的是 R 和 D 状态的进程数,不是使用率。
- 与核数比较的判断方法;区分 CPU 忙和 I/O 等待。
相关内容:load average 指标、常用工具与关键字段。
参考回答
三个数对应 1、5、15 分钟平均负载。
Linux 统计 R 和 D 状态任务,包含线程。因此,load average 与 CPU 使用率是不同指标。
高负载需区分 CPU 排队和不可中断等待。CPU 忙且 r 长时,检查计算与调度竞争。CPU 空闲但 D 多时,检查 I/O 和内核等待。还需核对单核热点、亲和性与容器配额。
6.2 发现某台机器 CPU 使用率很高、系统很卡,你怎样排查?
考察重点
- 从机器到进程、线程、代码的定位链路。
- 区分用户态与内核态;内存不足引起的交换与 OOM。
参考回答
先确认时间和范围,再定位进程、线程与热点。
top 找进程,mpstat 检查每核分布。top -Hp <pid> 或 pidstat 找高占用线程。perf 或语言工具用于定位代码。
us 高重点看计算、序列化和 GC。sy 高结合系统调用、切换和中断分析。内存也高时,检查 available、换页速率及 OOM。采集现场需控制开销,再按业务条件止血。
6.3 一台 Linux 服务器 CPU 占用不高,但接口访问很慢,你会怎样排查?
考察重点
- 识别单核热点、配额与各种等待。
iostat与iotop的分工;按层次排除。
参考回答
先排除平均值掩盖的单核热点和容器限流。
再按请求耗时检查 I/O、锁、池队列及下游。
iostat 看设备延迟和队列,pidstat 或 iotop 关联任务。vmstat 的 si/so 判断交换活动。free 展示内存容量,无法单独证明没有交换。
线程栈应与故障请求和队列变化关联。追踪可定位慢依赖。最终用延迟恢复和队列回落验证处理效果。
6.4 宿主 CPU 很空闲,容器为什么仍会慢?PSI 能补充什么证据?
考察重点:配额、局部热点与受阻时间。
相关内容:PSI 与容器限流。
参考回答
容器仍会受到自身和父级 CPU 配额约束。
配额用尽后,任务等待后续周期。用 cpu.stat 检查限流计数,再核对单核热点。PSI 表示因资源不足而受阻的时间。组级 PSI 与请求延迟可帮助判断限流影响。