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、锁)同样拖住吞吐。
混用容器内外的利用率口径,扩容结论会出错。
火焰图先看宽度再看深度:宽帧优先优化,收益更大。