本文涉及案例来自于学习极客时间专栏《Linux性能优化实战》精心整理而来,案例分析不到位的请各位多多指正
在前面的几篇案例分析文章中,我们通过多个案例、从不同角度、使用不同的性能工具分析了CPU性能问题,今天我们就来总结下,怎么能又快又准的定位到问题。要回答好这个问题, 我们就需要明白影响CPU的指标有哪些?又有哪些工具可以获取到指标数据,这些数据的合理值是什么? 让我们一起把这几个问题搞明白。
CPU性能指标

1.CPU使用率:
- 用户CPU (us): 用户态运行的时间百分比,使用率越高,说明有 应用程序比较繁忙
- 系统CPU (sy): 内核态运行的时间百分比,使用率越高,说明 内核越繁忙
- 等待CPU (wa): 通常也称为 iowait,表示等待 I/O 的时间百分比,使用率高,说明系统与硬件设备的 I/O交互时间比较长
- 软中断CPU (si): 处理软中断时间百分比, 大量的中断 也会导致CPU的使用率升高。比如前面分析的 大量的小网络包导致频繁的硬中断和软中断,想要了解的,可以回看上篇Linux系统下CPU性能问题分析案例(下)
- 硬中断CPU (hi): 处理硬中断时间百分比。硬中断是硬件触发,执行速度很快,使用率高的话,大部分是 硬件故障 导致
- 空闲CPU (id): 代表空闲时间百分比。 越高反而说明压力越小
- 低优先级 (ni): 低优先级用户态CPU时间百分比,nice可取值范围是-20到19,数值越大,优先级反而越低,默认值是0。
- steal (st): 代表当系统运行在虚拟机中的时候, 虚拟机占用的CPU时间
- guest: 代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的CPU时间
2.上下文切换
- 上下文切换分为 进程上下文切换、线程上下文切换。线程上下文切换的代价是远远高于线程上下文切换的 ,因为涉及到虚拟内存、栈、全局变量等资源的加载,而线程的虚拟内存是共享的,就会快很多
- 上下文切换中自愿上下文切换、非自愿上下文切换是我们关注的重点
3.平均负载
- 概念:系统处于可运行状态和不可中断状态的 平均进程数 ,也就是平均活跃进程数。这里提到的进程状态也是我们关注的重点。比如僵尸进程、不可中断进程
- 每个进程都可以得到cpu时间片是最完美的,所以 平均负载高于CPU核心 数就说明存在过载的情况了
4.CPU缓存
- 这取决于CPU型号的具体指标。越大越说明CPU的性能表现越出色
观测工具
我们知道了CPU的核心性能指标,如果能理解每个指标对应的工具的特性,一定更高效、更灵活,下面是我整理的性能指标对应的查询工具表格,方便我们去观测这些指标。

分析CPU性能问题思路
分析CPU性能问题时,可以采用从 全局到局部 的方法,先从整体去看CPU的使用情况,缩小排查范围,在性能工具选择上, 使用支持指标较多的工具 ,这样可以一次看到更多的指标,可以通过以下步骤快速定位
- 使用 top 命令可以得到检查CPU的总体情况。top命令可以看到的指标是比较多的,也很直观
- 使用 vmstat 可以得到上下文切换次数、中断次数、运行状态和不可中断状态的进程数
- 使用 pidstat 可以得到进程的用户CPU使用率、系统 CPU 使用率、以及自愿上下文切换和非自愿上下文切换情况
通过上面的一些列检查,我们大致可以把问题缩小到具体的进程或者线程级别,在通过相关的分析工具进一步分析,找到影响性能的罪魁祸首就水到渠成了。
欢迎一起交流、一起讨论。 无论是编码的乐趣还是系统的构建,让我们共同在这个科技的大舞台上创造奇迹。