CPU 瓶颈识别

CPU 瓶颈识别:观察用户态与系统态占比、上下文切换、运行队列长度;用 top、pidstat 与 perf 采样(火焰图)确认热点在业务逻辑、框架还是序列化。

软件测试速查开发更新于 2026-10-13

CPU 瓶颈识别

CPU 瓶颈识别:观察用户态与系统态占比、上下文切换、运行队列长度;用 top、pidstat 与 perf 采样(火焰图)确认热点位于业务逻辑、框架还是序列化。容器场景注意 cgroup 限额:容器被限流时,宿主视图可能仍显示有余量。

基本信息

观察指标用户态与系统态占比、上下文切换、运行队列
常用命令top -H、pidstat、perf(采样需权限)
热点归类业务逻辑、框架、序列化、锁等待
容器注意核对 cgroup 限额与限流指标
压测联动结合压测时间轴看 CPU 曲线
对策顺序先确认瓶颈位置,再谈扩容或优化
采样进阶perf record 生成火焰图(需权限)
负载均匀性核对多核与多实例分布是否均衡

常用命令

常用命令
top -H -p <pid>        # 线程级 CPU 视图
pidstat -w -p <pid> 1  # 上下文切换与等待
perf top -p <pid>      # 采样热点(需要权限)
# 容器内再看 cgroup throttling 指标

信号与含义

信号可能含义动作
用户态偏高计算密集或序列化开销优化算法与序列化
系统态偏高内核调用、网络与 IO 开销查系统调用与中断
上下文切换高锁竞争或线程过多调整线程模型
负载不均调度或亲和性问题核对分配策略
限流抖动cgroup 限额触发调整限额或扩容

典型使用场景

  • 压测排查:吞吐上不去时先看 CPU 是否先饱和。
  • 火焰图定位:确认热点函数后针对性优化。
  • 线程模型评估:上下文切换异常升高提示锁竞争或线程过多。
  • 容器评估:核对限额与限流导致的伪余量。
  • 回归对比:优化前后 CPU 曲线对比验证收益。
  • 容量评估:以 CPU 饱和度推算单实例承载上限。
  • 多实例对比:同一服务多实例曲线对比,找异常节点。
CPU 未打满不等于无瓶颈:等待型受限(IO、锁)同样拖住吞吐。
混用容器内外的利用率口径,扩容结论会出错。
火焰图先看宽度再看深度:宽帧优先优化,收益更大。

易错点

  • CPU 未打满就认为无瓶颈,忽略等待型受限(IO、锁)。
  • 混用容器内外的利用率口径,扩容结论错误。
  • 采样不结合压测时间轴,热点与负载阶段对不上。
  • 忽略系统态占比,内核开销问题被漏掉。
  • 只看瞬时峰值不看趋势,误判长期容量。

数据来源与参考

  • Brendan Gregg:火焰图与 perf 使用说明(brendangregg.com)
  • man 手册:top、pidstat
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌