跳到主要内容
约 6 分钟4 张卡

Linux 性能排查

Linux 性能排查用资源指标定位请求耗时。本文负责负载、CPU、内存、I/O 和等待分析。

1. 面试核心​

先记住这几条,再读正文

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 1r 可运行任务、b 阻塞任务、si/so 交换、cs 切换
free -havailable 与 swap 用量
iostat -x 1await、aqu-sz、吞吐与 util
pidstat -u -d -w 1任务的 CPU、I/O 和切换
iotop任务 I/O 活动
perf top -p <pid>热点函数采样
dmesgOOM、设备错误等内核记录

vmstat 和 iostat 首次报告包含启动以来的统计。诊断当前变化时,应观察后续间隔输出。

iostat 的 await 包含排队和服务时间。util 表示统计周期内设备处理 I/O 的时间占比。SSD 和 RAID 可并行处理多个请求。util 接近 100% 仍需结合延迟与吞吐判断。

wa 是 CPU 空闲且有待完成 I/O 时的统计。它不能单独定位设备或进程。st 表示虚拟 CPU 等待宿主调度的时间。虚拟机与容器的资源约束应分别核对。

4. 三类场景的排查路径​

4.1 CPU 热点​

  1. 对比故障时间、流量和发布记录。
  2. 用 top 找高占用进程,再用每核统计检查分布。
  3. 用 top -Hp <pid> 或 pidstat 找线程。
  4. 用户态热点用 perf 或语言工具定位。
  5. 内核态热点结合调用、中断与上下文切换分析。

sy 高时可用 strace -c -p <pid> 统计系统调用。采样和跟踪本身有开销,应控制范围。si 高时核对网络包量和软中断分布。

4.2 内存压力​

  1. 查看 available,并观察 vmstat 1 的 si/so。
  2. 按进程核对 RSS、缓存和工作集变化。
  3. 查看 OOM 日志与 cgroup 内存事件。
  4. 结合 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。

相关内容:三类场景的排查路径、CPU 使用率。

参考回答

先确认时间和范围,再定位进程、线程与热点。

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 与请求延迟可帮助判断限流影响。

7. 参考资料​