我们先了解了一些常见的CPU性能问题,利用其对CPU性能分析有了初步的认识

我们今天就利用不同维度下的不同工具,不同指标,进行一个总结

首先对于CPU的性能指标,我们进行一下总结

首先是CPU的使用率,在其中分为了 用户CPU 系统CPU 等待IO CPU 软中断 硬中断等

用户CPU使用率,使用率高的话,说明有应用程序比较繁忙

系统CPU,表示CPU在内核态的运行时间百分比,系统CPU高的话,说明内核繁忙

iowait的CPU使用率,说明等待IO的时间百分比高,iowait高,说明硬件使用时间长

软中断和硬中断的CPU使用率,分别表示内核调用软中断,硬中断的使用时间占比,其占用率高,说明遭到了大量的中断

除此之外,还有虚拟化环境的窃取CPU使用率 steal / 客户CPU使用率 guest ,分别表示被其他虚拟机占用的CPU时间百分比,运行客户虚拟机的CPU时间百分比

然后是平均负载,说明了整体的负载情况,常见指令uptime,显示过去1分钟,5分钟,15分钟的平均负载

理想情况下,平均负载等于逻辑CPU个数,如果负载大于CPU个数,说明负载比较重了

还有就是进程上下文切换

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

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

上下文切换,本身就是保证Linux正常运行的一项核心功能,但是过多的上下文切换,会导致原本运行进程的CPU时间,消耗在寄存器,内核栈,虚拟机内存这些数据的保存和恢复上

最后就是CPU缓存的命中率,CPU的速度必然高于内存,所以CPU为了和内存平衡性能,于是发展出了缓存,总体的架构如下

图片

上面表示的,CPU缓存的速度和大小分为了L1 L2 L3三级,L1 L2 在单核,L3 在多核

缓存依次增大,性能比多降低,但是命中率,说明的是L1 + L2 + L3的命中率

关于CPU的性能指标,总体总结如下:

图片

性能工具的总结

掌握了CPU的性能指标,我们再看一下工具的使用

常见的平均负载案例,我们看了uptime,系统的平均负载,平均负载升高了之后,使用mpstat和pidstat,观察了每个CPU和每个进程CPU的使用情况,最后找到了平均负载升高的进程,就是压测工具stress

然后是上下文切换的案例,使用了vmstat,查看了系统上下文切换的次数和中断次数,最后通过pidstat,观察了自愿的上下文切换和非自愿的上下文切换情况,最后通过pidstat,找到了线程上下文切换的情况,找到了上下文切换的祸源,就是基准压测工具 sysbench

然后是进程CPU的升高案例,首先是top查看系统和进程的CPU使用情况,发现CPU的使用率升高的进程是php-fpm 然后是perf top,观察 php-fpm的调用链

系统CPU升高的案例,top观察了系统CPU升高,然后是pidstat尝试查找高CPU的进程,接下来审视了top的输出,从CPU使用不高,但是处在Running状态的进程入手,找到了可疑之处,通过perf record 和 perf report,找到详情

然后是关于不可中断进程和僵尸进程的案例,使用top看到了iowait升高,说明这是有不可中断线程,使用dstat查看是磁盘读导致的,然后是pidstat找到了进程,使用perf发现调用链源于磁盘直接io

最后关于软中断,通过top观察到,系统的软中断CPU使用率升高,查看/proc/softirqs找到了变化速率较快的软中断,通过sar命令,发现是网络小包的问题,最后用tcpdump,找到网络帧的类型和来源,确定是一个SYN FLOOD的攻击导致的

那么这些工具和性能指标如何挂钩的呢?

我们从不同维度来看,首先是性能指标的角度

需要确认,如果想要查看某个指标的话,要清楚哪些工具可以做到,确认的图看下面

图片

然后从工具触发,我们需要看不同工具支持查看哪些指标,具体的操作细节不说,到时候man命令就可以使用了

图片

那么有了工具和对应指标,在实战中如何去分析呢?

我们如何快速的定位系统的瓶颈,然后去优化呢?

这需要我们去通晓知道每种性能指标的工作原理,比如用户CPU使用率高,那就是去查看用户态CPU使用情况

对于上面的指标和原理的对应建立了,我们就可以快速缩小排查的范围

我们可以先运行几个指标较多的工具来进行查看

比如top vmstat pidstat查看指标

图片

我们列了top vmstat pidstat提供的重要CPU指标,使用虚线进行了标记

我们可以通过top看到CPU的使用率和僵尸进程以及平均负载的信息

然后从 vmstat的输出得到上下文切换,中断次数,运行状态,不可中断状态的进程数

pidstat可以得到用户CPU使用率,系统CPU使用率,自愿上下文切换和非自愿上下文切换情况

而且,可以利用不同工具,交叉分析

pidstat输出的进程用户CPU使用率升高,会导致top输出的用户使用率升高,这就可以交叉比对

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

不可中断进程数增加了,需要做IO的分析,也就是dstat和sar等工具,进行分析IO的情况

如果是运行状态的进程数增加了利用top和pidstat,查看是哪些进程,然后进行分析

如果使用top查看软中断CPU使用率增加的话,可以查看/proc/softirqs文件中各种软中断的变化情况,确定是那种软中断出了问题,比如是网络接收导致的中断,可以使用sar或者tcpdump分析

这个我们回忆了常见的CPU观测工具,总结了快速分析CPU性能的思路

对于CPU的性能指标很多,对应的性能分析工具也很多,但是大多都有关联性

对于strace和perf的使用,我们可以使用strace分析内核态cpu使用率,使用perf分析用户态使用率

发表评论

邮箱地址不会被公开。 必填项已用*标注