xiufeigo™
Home
Linux 性能瓶颈排查
套路分析系统 CPU 瓶颈

一、CPU 性能指标

1)CPU 使用率

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 时间百分比

2)平均负载(Load Average)

平均负载指系统的平均活跃进程数,它反应了系统的整体负载情况,包括三个数值:过去 1 分钟、过去 5 分钟、过去 15 分钟的平均负载。

3)进程上下文切换

  • 无法获取资源而导致的自愿上下文切换

  • 被系统强制调度导致的非自愿上下文切换

上下文切换,本身是保证 Linux 正常运行的一项核心功能。但过多的上下文切换,会将原本正常运行进程的 CPU 时间,消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行的时间,成为性能瓶颈

4)CPU 缓存命中率

由于 CPU 发展速度远快于内存发展,CPU 的处理速度就远比内存的访问速度快很多。这样,CPU 在访问内存的时候,免不了要等待内存的响应。为了协调这两者巨大的性能差距,CPU 缓存(通常是多级环境)就出现了。

如上图所示,CPU 缓存的速度介于 CPU 和内存之间,缓存的是热点的内存数据。根据不断增长的热点数据,这些缓存按照大小不同分为 L1、L2、L3 等三级缓存,其中 L1 和 L2 常用在单核中,L3 则用在多核中

从 L1 到 L3,三级缓存的大小依次增大,相应的性能依次降低(当然比内存还是好很多)。而他们的命中率,衡量的是 CPU 缓存的复用情况,命中率越高,则性能越好


二、性能工具

掌握了 CPU 的性能指标,我们还需要知道,怎么去获取这些指标,也就是工具的使用。

  • 平均负载:先使用了uptime,查看了系统的平均负载;在确认平均负载升高后,又使用了mpstatpidstat 分别观察每个 CPU 和每个进程 CPU 的使用情况,进而找出导致平均负载升高的过程。

  • 上下文切换:先使用 vmstat 查看了系统搞得上下文切换次数和中断次数;然后通过 pidstat观察了进程的自愿上下文切换和非自愿上下文切换情况,最后通过pidstat,观察了线程的上下文切换情况,找出上下文切换次数增多的根源。

  • 进程 CPU 使用率升高:先使用了top,查看了系统和进程的 CPU 使用情况,再使用perf top 观察 CPU 异常进程的函数调用链,最终找到导致 CPU 升高的根源。

  • 系统 CPU 使用率升高:先使用top 观察到了系统 CPU 升高,但通过toppidstat 无法找到对应进程,最终通过execsnoop 实时监控进程调用的外部命令找到了捣蛋的对应短时进程。

  • 不可中断进程和僵尸进程:先使用top 观测到iowait 升高,并发现大量的不可中断进程以及僵尸进程,接着使用dstat+pidstat+strace+perf相结合抓到了不可中断进程的源头

  • 软中断:通过top 观察到系统软中断 CPU 使用率升高,从/proc/softirqs 找到了几种变化速率较快的软中断,最后通过与 sar 相结合找到了对应的捣蛋进程。


三、性能指标与工具相结合

1)从 CPU 指标出发,通过指标选择工具

性能指标工具说明
平均负载uptimeuptime 最简单
toptop 提供了更全的指标

系统整体 CPU 使用率vmstat这几个工具只能动态查看
mpstat
top
sarsar 可以记录历史数据
/proc/stat/proc/stat 是其他性能工具的数据来源

进程 CPU 使用率toptopps 可以按照 CPU 使用率给进程排序
ps
pidstatpidstat 只显示实际用了 CPU 的进程
htophtopatop 以不同颜色显示更为直观
atop

系统上下文切换vmstat除了上下文切换次数,还提供运行状态和不可中断状态进程的数量

进程上下文切换pidstat注意需要加上-w 参数

软中断toptop 提供软中断 CPU 使用率
/proc/softirqs/proc/softirqsmpstat 提供了各种软中断再每个 CPU 上运行的次数
mpstat

硬中断vmstatvmstat提供总的中断次数
/proc/interrupts/proc/interrupts 提供各种中断再每个 CPU 上运行的累计次数

网络dstatdstatsar 提供总的网络接收和发送情况
sar
tcpdumptcpdump 动态抓取正在进行的网络通讯

I/Odstatdstatsar 都提供了 I/O 的整体情况
sar

CPU 个数/proc/cpuinfolscpu结果更为直观
lscpu

事件剖析perfperf 可以用来分析 CPU 的缓存以及内核调用链

execsnoopexecsnoop 用来监控短时进程

2)从工具出发,了解工具能提供什么指标

性能工具CPU 性能指标
uptime平均负载
top平均负载、运行队列、整体的 CPU 使用率以及每个进程的状态和 CPU 使用率
htoptop 增强版,以不同颜色区分不同类型的进程,更直观
atopCPU、内存、磁盘和网络等各种资源的全面监控
vmstat系统整体的 CPU 使用率、上下文切换次数、中断次数,还包括处于运行和不可中断状态的进程数量
mpstat每个 CPU 的使用率、中断上下文切换次数
pidstat进程和线程的 CPU 使用率、中断上下文切换次数
/proc/softirqs软中断类型和在每个 CPU 上的累计中断次数
/proc/interrupts硬中断类型和在每个 CPU 上的累计中断次数
ps每个进程的状态和 CPU 使用率
pstree进程的父子关系
dstat系统整体的 CPU 使用率
sar系统整体的 CPU 使用率,包括可配置的历史数据
strace进程的系统调用
perfCPU 性能事件剖析,如调用链分析、CPU 缓存、CPU 调度等
execsnoop监控短时进程

四、如何迅速分析 CPU 的性能瓶颈

虽然 CPU 的性能指标较多,但既然都是描述系统的 CPU 性能,它们就不会是完全孤立的,很多指标之间都有一定的关联。想弄清楚性能指标的关联性,就要通晓每种性能的工作原理。这也是为什么我们在学习每个性能指标的时候,都要穿插学习相关的系统原理。

举个例子,用户 CPU 使用率高,我们应该去排查进程的用户态而不是内核态。因为用户 CPU 使用率反映的就是用户态的 CPU 使用情况,而内核态的 CPU 使用情况只会反映到系统 CPU 使用率上。

所以,为了缩小排查范围,通常会先运行几个支持指标较多的工具,如 topvmstatpidstat 。为什么是这三个工具呢?仔细看看下面这张图,你就清楚了。

通过这张图你可以发现,这三个命令,几乎包含了所有重要的 CPU 性能指标,比如:

  • top 的输出可以得到各种 CPU 使用率以及僵尸进程和平均负载等信息。

  • vmstat 的输出可以得到上下文切换次数、中断次数、运行状态和不可中断状态的进程数。

  • pidstat 的输出可以得到进程的用户 CPU 使用率、系统 CPU 使用率、以及自愿上下文切换和非自愿上下文切换情况。

另外,这三个工具输出的很多指标是相互关联的,所以,我也用虚线表示了它们的关联关系,举几个例子你可能会更容易理解。

例 1:

pidstat 输出的进程用户 CPU 使用率升高,会导致 top 输出的用户 CPU 使用率升高。所以,当发现 top 输出的用户 CPU 使用率有问题时,可以跟 pidstat 的输出做对比,观察是否是某个进程导致的问题

而找出导致性能问题的进程后,就要用进程分析工具来分析进程的行为,比如使用 strace 分析系统调用情况,以及使用 perf 分析调用链中各级函数的执行情况。

例 2:

top 输出的平均负载升高,可以跟 vmstat 输出的运行状态和不可中断状态的进程数做对比,观察是哪种进程导致的负载升高。

如果是不可中断进程数增多了,那么就需要做 I/O 的分析,也就是用 dstatsar 等工具,进一步分析 I/O 的情况。

如果是运行状态进程数增多了,那就需要回到 toppidstat,找出这些处于运行状态的到底是什么进程,然后再用进程分析工具,做进一步分析

例 3:

当发现 top 输出的软中断 CPU 使用率升高时,可以查看 /proc/softirqs 文件中各种类型软中断的变化情况,确定到底是哪种软中断出的问题。比如,发现是网络接收中断导致的问题,那就可以继续用网络分析工具 sartcpdump 来分析。


小结:

结不了一点,因为这篇就是之前所有文章的小结哈哈哈~~~

粤ICP备2022009857号-1