3. CPU性能分析与容量评估

CPU 是 RHEL 系统上最容易被“感觉慢”背锅的部件,但真正定位瓶颈时,不能只看 top 里那个百分比。CPU 性能分析要回答三个层次的问题:CPU 到底忙在用户态、内核态还是等待 I/O;上下文切换和运行队列是否异常;以及当前负载下需要多少 vCPU 才能把压力降到可接受范围。本节围绕 top、mpstat、pidstat、perf 四个工具,给出从观察到估算的完整路径。

一、先分清 CPU 时间的去向

在 RHEL 中,top 顶部一行给出 us(用户态)、sy(内核态)、ni(调整过优先级的用户态)、id(空闲)、wa(等待 I/O)、hi(硬中断)、si(软中断)、st(被虚拟化层偷走的时间)等字段。判断瓶颈时,先看 id 是否长期低于 20%,再看 wa 是否偏高。如果 wa 高而 us 不高,问题往往在磁盘或网络 I/O,而不是 CPU 算力不足;如果 st 明显,说明宿主机超卖,需要从虚拟化层排查。

mpstat -P ALL 1 比 top 更适合看多核分布。它按 CPU 逐行输出,能暴露“单核跑满、其他核空闲”的情况。例如某台 8 vCPU 的 Web 服务器,mpstat 显示 CPU0 的 %usr 长期在 95% 以上,而 CPU1~7 只有 10% 左右,这说明应用存在单线程热点或中断集中,盲目加 vCPU 并不能解决问题,应先做中断亲和性或应用线程模型优化。

二、上下文切换与运行队列

上下文切换分为自愿切换(cswch/s)和非自愿切换(nvcswch/s)。自愿切换多,通常意味着进程在等 I/O 或锁;非自愿切换多,说明进程被时间片强制剥夺 CPU,往往伴随运行队列变长。pidstat -w 1 可以按进程查看这两个指标,pidstat -u 1 则给出每个进程的 %usr、%system、%CPU。

运行队列长度用 vmstat 1 的 r 列观察。经验上,r 持续大于逻辑 CPU 数的 1~2 倍,就说明 CPU 已经排队。例如 4 vCPU 的机器 r 长期在 8~12,说明平均有 2~3 倍的可运行任务在等 CPU,此时扩容或限流才有意义。

三、用 perf 定位热点函数

当确认 CPU 确实忙在用户态或内核态后,用 perf top 或 perf record 找热点。下面是一段示例命令,用于采集 10 秒的 CPU 周期事件并生成报告:

perf record -F 99 -a -g -- sleep 10
perf report --stdio | head -40

输出中会按符号聚合,显示哪个函数、哪个库占用最多采样。若热点集中在某个业务函数,属于应用优化;若集中在 spin_lock、memcpy、schedule 等内核符号,则要检查锁竞争、内存拷贝或调度压力。注意 perf 采样是统计性的,样本量足够时结论才可靠。

四、估算所需 vCPU 数量

容量估算不能只看“当前 CPU 使用率”,而要把峰值、增长和冗余一起考虑。一个可操作的估算方法是:先取业务高峰期的平均 CPU 使用率,再乘以峰值系数,最后除以单核可承受的目标利用率。公式可写为:

所需 vCPU = 高峰平均使用率 × 峰值系数 ÷ 目标单核利用率

假设某应用在 8 vCPU 上高峰平均使用率为 55%,峰值系数取 1.5,目标单核利用率取 70%,则所需 vCPU ≈ 0.55 × 8 × 1.5 ÷ 0.70 ≈ 9.4,向上取整为 10 vCPU。如果当前运行队列 r 已经持续超过 CPU 数,说明这个估算还应再留一档余量。反之,如果 wa 高而 us 低,加 vCPU 不会改善响应时间,应先解决 I/O。

估算时建议同时记录三个基线:业务低峰、日常高峰、大促峰值。只有日常高峰和峰值都覆盖,容量结论才站得住。

五、把观察串成判断链

下面这张图把本节的关键判断关系集中呈现:从 top 的总览出发,分流到 mpstat 的核间分布、pidstat 的进程级切换、perf 的热点函数,最终落到“加 vCPU、优化应用、还是先处理 I/O”的决策上。

CPU 性能分析与 vCPU 估算判断链 top 总览 us / sy / wa / st / id mpstat -P ALL 1 核间分布 / 单核热点 中断是否集中 pidstat -w / -u 1 自愿/非自愿切换 进程级 CPU 占用 perf top / record 热点函数 / 调用栈 用户态 vs 内核态 判断瓶颈类型 wa 高?st 高?r 持续大于 CPU 数? 先处理 I/O 或超卖 wa 高 → 磁盘/网络 st 高 → 宿主机超卖 优化应用或加 vCPU us 高 → 热点函数优化 r 长 → 扩容/限流 估算 vCPU 数量 高峰使用率 × 峰值系数 ÷ 目标单核利用率

把这条链走完,CPU 容量评估就不再是“看百分比拍脑袋”。实际工作中建议固定一个采样窗口,例如连续采集 5 分钟,记录 mpstat 的 %usr、%sys、%wa、%idle,vmstat 的 r 和 cs,以及 pidstat 中排名前几的进程。把这些数据与业务高峰时间对齐,再套用上面的估算公式,得到的 vCPU 数量才有依据。最后提醒一点:扩容后要复测同一组指标,确认运行队列下降、%idle 回升,否则说明瓶颈并不在 CPU 数量上。