一、性能指标

1、CPU使用率

CPU使用率描述了非空闲时间占比总CPU时间的百分比,根据CPU上运行任务的不同,又被分为用户CPU,系统CPU,等待I/OCPU,软中断和硬中断等。

1.用户CPU使用率,包括用户态CPU使用率(user)和低优先级用户态CPU使用率(nice),表示CPU在用户态运行的时间百分比。用户CPU使用
  率高,通常说明有应用程序比较繁忙。
2.系统CPU使用率,表示CPU在内核态运行的时间百分比(不包括中断)。系统CPU使用率高,说明内核比较繁忙。
3.等待I/O的CPU使用率,通常也被称为iowait,表示等待I/O的时间百分比。iowait高,通常说明系统与硬件设备的I/O交互时间比较长。
4.软中断和硬中断的CPU使用率,分别表示内核调用软中断处理程序、硬中断处理程序的时间百分比。他们的使用率高,通常说明系统发生了
 大量的中断。
5.虚拟化环境中会用到的窃取CPU使用率(steal)和客户CPU使用率(guest),分别表示被其他虚拟机占用的CPU时间百分比,和运行客户虚
  拟机的CPU时间百分比。

2、CPU平均负载

平均负载(Load Average),也就是系统的平均活跃进程数。他反应了系统的整体负载情况,主要包括三个数值,分别指过去1分钟,过去5分钟和过去15分钟的平均负载。

理想情况下,平均负载等于逻辑CPU个数,这表示每个CPU都恰好被充分利用。如果平均负载大于逻辑CPU个数,表示负载比较重了。

3、CPU缓存的命中率

CPU 在访问内存的时候,免不了要等待内存的响应。为了协调这两者巨大的性能差距,CPU 缓存(通常是多级缓存)就出现了

Linux性能优化实战学习笔记七-如何迅速分析出CPU的瓶颈在哪里?_cpu瓶颈

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

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

Linux性能优化实战学习笔记七-如何迅速分析出CPU的瓶颈在哪里?_性能指标_02

4、性能指标思维导图

Linux性能优化实战学习笔记七-如何迅速分析出CPU的瓶颈在哪里?_平均负载_03

二、性能工具

1、平均负载的案例。我们先用uptime,查看了系统的平均负载;而在平均负载升高后,又用了mpstat和pidstat,分别观察了每个CPU和每个进程CPU的使用情况,进而找出了导致平均负载升高的进程。

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

3、进程CPU使用率升高的案例。先用top,查看了系统和进程的CPU使用情况,发现CPU使用率升高的进程是php-fpm;再用perf top,观察php-fpm的调用链,最终找出CPU升高的根源。

4、系统的CPU使用率升高的案例。先用top观察到了系统CPU升高,但通过top和pidstat,却找不到高CPU使用率的进程。于是,我们重新查看top的输出,又从CPU使用率不高但出于Running状态的进程入手,找到了可疑之处,最终通过perf record和perf report,发现原来是短时进程在捣鬼。

5、不可中断进程和僵尸进程案例。先用top观察到了iowait升高的问题,并发现了大量的不可中断进程和僵尸进程;接着我们用dstat发现这是由磁盘读导致的,于是又通过pidstat找出了相关的进程。用perf分析进程调用链,才发现根源在于磁盘直接I/O。

1、根据指标找工具

Linux性能优化实战学习笔记七-如何迅速分析出CPU的瓶颈在哪里?_性能指标_04

2、根据工具找指标

Linux性能优化实战学习笔记七-如何迅速分析出CPU的瓶颈在哪里?_性能工具_05

三、把性能指标和工具联系起来

Linux性能优化实战学习笔记七-如何迅速分析出CPU的瓶颈在哪里?_cpu瓶颈_06

四、如何迅速分析CPU瓶颈

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

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

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

观察是否是某个进程导致的问题。

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

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

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

2、如果是不可中断进程数增多了,那么就需要做 I/O 的分析,也就是用 dstat 或 sar 等工具,进一步分析 I/O...

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

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

当发现 top 输出的软中断 CPU 使用率升高时,可以查看/proc/softirqs 文件中各种类型软中断的变化情况,确定到底是哪种软中断出的问题

比如,发现是网络接收中断导的问题,那就可以继续用网络分析工具 sar 和 tcpdum来分析