CPU 使用率描述了非空闲时间占总 CPU 时间的百分比,根据 CPU 上运行任务的不同,又被分为用户 CPU、系统 CPU、等待 I/O CPU、软中断和硬中断等
用户 CPU 使用率:包括用户态 CPU 使用率(user)和低优先级用户态 CPU 使用率(nice),表示 CPU 在用户态运行的时间百分比。用户 CPU 使用率高,通常说明有应用程序繁忙
系统 CPU 使用率:表示 CPU 在内核态运行的时间百分比(不包括中断)。系统 CPU 使用率高,说明内核比较繁忙
等待 I/O 的 CPU 使用率:通常被称为 iowait,表示等待 I/O 的时间百分比。iowait 高,通常说明系统与硬件设备的 I/O 交互时间比较长
软中断和硬中断的 CPU 使用率:分别表示内核调用软中断处理程序、硬中断处理程序的时间百分比。它们的使用率高,通常说明系统发生了大量的中断。
窃取 CPU 使用率:steal 指代被其他虚拟机占用的 CPU 时间百分比
客户 CPU 使用率:guest 指代运行客户虚拟机的 CPU 时间百分比
平均负载指系统的平均活跃进程数,它反应了系统的整体负载情况,包括三个数值:过去 1 分钟、过去 5 分钟、过去 15 分钟的平均负载。
无法获取资源而导致的自愿上下文切换
被系统强制调度导致的非自愿上下文切换
上下文切换,本身是保证 Linux 正常运行的一项核心功能。但过多的上下文切换,会将原本正常运行进程的 CPU 时间,消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行的时间,成为性能瓶颈
由于 CPU 发展速度远快于内存发展,CPU 的处理速度就远比内存的访问速度快很多。这样,CPU 在访问内存的时候,免不了要等待内存的响应。为了协调这两者巨大的性能差距,CPU 缓存(通常是多级环境)就出现了。

如上图所示,CPU 缓存的速度介于 CPU 和内存之间,缓存的是热点的内存数据。根据不断增长的热点数据,这些缓存按照大小不同分为 L1、L2、L3 等三级缓存,其中 L1 和 L2 常用在单核中,L3 则用在多核中。
从 L1 到 L3,三级缓存的大小依次增大,相应的性能依次降低(当然比内存还是好很多)。而他们的命中率,衡量的是 CPU 缓存的复用情况,命中率越高,则性能越好
掌握了 CPU 的性能指标,我们还需要知道,怎么去获取这些指标,也就是工具的使用。
平均负载:先使用了uptime,查看了系统的平均负载;在确认平均负载升高后,又使用了mpstat 和pidstat 分别观察每个 CPU 和每个进程 CPU 的使用情况,进而找出导致平均负载升高的过程。
上下文切换:先使用 vmstat 查看了系统搞得上下文切换次数和中断次数;然后通过 pidstat观察了进程的自愿上下文切换和非自愿上下文切换情况,最后通过pidstat,观察了线程的上下文切换情况,找出上下文切换次数增多的根源。
进程 CPU 使用率升高:先使用了top,查看了系统和进程的 CPU 使用情况,再使用perf top 观察 CPU 异常进程的函数调用链,最终找到导致 CPU 升高的根源。
系统 CPU 使用率升高:先使用top 观察到了系统 CPU 升高,但通过top 和pidstat 无法找到对应进程,最终通过execsnoop 实时监控进程调用的外部命令找到了捣蛋的对应短时进程。
不可中断进程和僵尸进程:先使用top 观测到iowait 升高,并发现大量的不可中断进程以及僵尸进程,接着使用dstat+pidstat+strace+perf相结合抓到了不可中断进程的源头
软中断:通过top 观察到系统软中断 CPU 使用率升高,从/proc/softirqs 找到了几种变化速率较快的软中断,最后通过与 sar 相结合找到了对应的捣蛋进程。
| 性能指标 | 工具 | 说明 |
|---|---|---|
| 平均负载 | uptime | uptime 最简单 |
| top | top 提供了更全的指标 | |
| 系统整体 CPU 使用率 | vmstat | 这几个工具只能动态查看 |
| mpstat | ||
| top | ||
| sar | sar 可以记录历史数据 | |
| /proc/stat | /proc/stat 是其他性能工具的数据来源 | |
| 进程 CPU 使用率 | top | top 和ps 可以按照 CPU 使用率给进程排序 |
| ps | ||
| pidstat | pidstat 只显示实际用了 CPU 的进程 | |
| htop | htop 和atop 以不同颜色显示更为直观 | |
| atop | ||
| 系统上下文切换 | vmstat | 除了上下文切换次数,还提供运行状态和不可中断状态进程的数量 |
| 进程上下文切换 | pidstat | 注意需要加上-w 参数 |
| 软中断 | top | top 提供软中断 CPU 使用率 |
| /proc/softirqs | /proc/softirqs 和mpstat 提供了各种软中断再每个 CPU 上运行的次数 | |
| mpstat | ||
| 硬中断 | vmstat | vmstat提供总的中断次数 |
| /proc/interrupts | /proc/interrupts 提供各种中断再每个 CPU 上运行的累计次数 | |
| 网络 | dstat | dstat 和sar 提供总的网络接收和发送情况 |
| sar | ||
| tcpdump | tcpdump 动态抓取正在进行的网络通讯 | |
| I/O | dstat | dstat 和sar 都提供了 I/O 的整体情况 |
| sar | ||
| CPU 个数 | /proc/cpuinfo | lscpu结果更为直观 |
| lscpu | ||
| 事件剖析 | perf | perf 可以用来分析 CPU 的缓存以及内核调用链 |
| execsnoop | execsnoop 用来监控短时进程 | |
| 性能工具 | CPU 性能指标 |
|---|---|
| uptime | 平均负载 |
| top | 平均负载、运行队列、整体的 CPU 使用率以及每个进程的状态和 CPU 使用率 |
| htop | top 增强版,以不同颜色区分不同类型的进程,更直观 |
| atop | CPU、内存、磁盘和网络等各种资源的全面监控 |
| vmstat | 系统整体的 CPU 使用率、上下文切换次数、中断次数,还包括处于运行和不可中断状态的进程数量 |
| mpstat | 每个 CPU 的使用率、中断上下文切换次数 |
| pidstat | 进程和线程的 CPU 使用率、中断上下文切换次数 |
| /proc/softirqs | 软中断类型和在每个 CPU 上的累计中断次数 |
| /proc/interrupts | 硬中断类型和在每个 CPU 上的累计中断次数 |
| ps | 每个进程的状态和 CPU 使用率 |
| pstree | 进程的父子关系 |
| dstat | 系统整体的 CPU 使用率 |
| sar | 系统整体的 CPU 使用率,包括可配置的历史数据 |
| strace | 进程的系统调用 |
| perf | CPU 性能事件剖析,如调用链分析、CPU 缓存、CPU 调度等 |
| execsnoop | 监控短时进程 |
虽然 CPU 的性能指标较多,但既然都是描述系统的 CPU 性能,它们就不会是完全孤立的,很多指标之间都有一定的关联。想弄清楚性能指标的关联性,就要通晓每种性能的工作原理。这也是为什么我们在学习每个性能指标的时候,都要穿插学习相关的系统原理。
举个例子,用户 CPU 使用率高,我们应该去排查进程的用户态而不是内核态。因为用户 CPU 使用率反映的就是用户态的 CPU 使用情况,而内核态的 CPU 使用情况只会反映到系统 CPU 使用率上。
所以,为了缩小排查范围,通常会先运行几个支持指标较多的工具,如 top、vmstat 和 pidstat 。为什么是这三个工具呢?仔细看看下面这张图,你就清楚了。

通过这张图你可以发现,这三个命令,几乎包含了所有重要的 CPU 性能指标,比如:
从 top 的输出可以得到各种 CPU 使用率以及僵尸进程和平均负载等信息。
从 vmstat 的输出可以得到上下文切换次数、中断次数、运行状态和不可中断状态的进程数。
从 pidstat 的输出可以得到进程的用户 CPU 使用率、系统 CPU 使用率、以及自愿上下文切换和非自愿上下文切换情况。
另外,这三个工具输出的很多指标是相互关联的,所以,我也用虚线表示了它们的关联关系,举几个例子你可能会更容易理解。
pidstat 输出的进程用户 CPU 使用率升高,会导致 top 输出的用户 CPU 使用率升高。所以,当发现 top 输出的用户 CPU 使用率有问题时,可以跟 pidstat 的输出做对比,观察是否是某个进程导致的问题。
而找出导致性能问题的进程后,就要用进程分析工具来分析进程的行为,比如使用 strace 分析系统调用情况,以及使用 perf 分析调用链中各级函数的执行情况。
top 输出的平均负载升高,可以跟 vmstat 输出的运行状态和不可中断状态的进程数做对比,观察是哪种进程导致的负载升高。
如果是不可中断进程数增多了,那么就需要做 I/O 的分析,也就是用 dstat 或 sar 等工具,进一步分析 I/O 的情况。
如果是运行状态进程数增多了,那就需要回到 top 和 pidstat,找出这些处于运行状态的到底是什么进程,然后再用进程分析工具,做进一步分析。
当发现 top 输出的软中断 CPU 使用率升高时,可以查看 /proc/softirqs 文件中各种类型软中断的变化情况,确定到底是哪种软中断出的问题。比如,发现是网络接收中断导致的问题,那就可以继续用网络分析工具 sar 和 tcpdump 来分析。
结不了一点,因为这篇就是之前所有文章的小结哈哈哈~~~