性能瓶颈--CPU(使用率)

CPU使用率是最长见的CPU性能指标

CPU使用率

当使用top命令的时候,就会看到很多的CPU指标。

$ top
top - 19:16:40 up 21:00,  4 users,  load average: 0.00, 0.01, 0.05
Tasks: 178 total,   1 running, 177 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  3.0 sy,  0.0 ni, 97.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3861512 total,  2438584 free,   197496 used,  1225432 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  3331204 avail Mem 

这里介绍下命令输出的第三行。

  • user (缩写:us) ,表示用户态CPU时间,不包括nice时间,但包括了guest时间。
  • nice (缩写:ni),表示低优先级用户态的CPU时间,也就是进程的nice值为 1-19之间的CPU时间,nice的取之范围是 -20 -- 19,数值越大,优先级反而越大。
  • system(缩写:sys),表示内核态CPU。
  • idle(缩写:id),表示空闲时间,但是不包括等待I/O的时间(iowait)。
  • iowait(缩写:wa),表示等待I/O的时间。
  • irq(缩写:hi),表示处理硬中断的CPU时间。
  • softriq(缩写:si),表示处理软中断的CPU时间。
  • steal(缩写:st),表示当系统运行虚拟机的时候,被其他虚拟机占用的CPU时间。
  • guest(缩写:guest),表示通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的时间。
  • guest_nice(缩写:gnice),表示以底优先级运行虚拟机的时间。
    CPU的使用率计算方式不一样,事实上不同的性能工具都是通过取一段时间(比如3秒)的两次值,作差后,才计算出CPU使用率,这也是为什么不同的CPU性能工具的结果不太一样。

分析CPU使用率为什么高

可以直接定位的cpu使用率高的进程。

通过top,ps,pidstat 工具可以快速的找到CPU使用率高的进程,但是想知道占用CPU的到底是代码里的哪个函数呢。找到它,才能更高效的针对性优化。

perf

perf 是以性能事件采样为基础,不仅可以分析系统的各种事件和内核性能,还可以用来分析制定的应用程序的性能问题。
使用perf分析CPU性能问题。

  • perf top
    他能够实时显示占用CPU时钟最多的函数或者指令,因此可以查找热点函数。
$ perf top
Samples: 833  of event 'cpu-clock', Event count (approx.): 97742399
Overhead  Shared Object       Symbol
   7.28%  perf                [.] 0x00000000001f78a4
   4.72%  [kernel]            [k] vsnprintf
   4.32%  [kernel]            [k] module_get_kallsym
   3.65%  [kernel]            [k] _raw_spin_unlock_irqrestore
...

第一行为采样数(Samples)、事件类型(event)和事件总数(Event Count)。
第二行的数据格式。

  1. OverHead 是该符号的性能事件在所有的采样中的比例,用百分比表示。
  2. Shared 是该函数或者指令所在的动态共享对象(Dynamic Shared Object),如内核,进程名,动态链接库,内核模块等。
  3. Object 是动态共享对象的类型。[.] 表示用户空间的可执行程序、或者动态链接库,而[k]表示的内核空间。
  4. Symbol 是符号名,也是就函数名,当函数名未知时,用16进制的地址来表示。
  • perf record 和 perf report
    perf top 虽然展示了系统的性能信息,但是缺点是不能保存下来进行分析。而perf record 就可以提供保存数据的功能,保存后的数据可以使用perf report解析并且展示。
实际案例

使用ab压测工具对phpweb站点进行压测。

ab -c 30 -n 10000 http://localhost:10000/
...
Total transferred:      1720000 bytes
HTML transferred:       90000 bytes
Requests per second:    14.40 [#/sec] (mean)
Time per request:       2083.193 [ms] (mean)
...

每秒的平均请求数只有14个。性能很差劲。
使用top命令查看,发现load很高,cpu的使用率也很高。前面的几个都是php-fpm进程,不用说了。是php-fpm 的问题了。

top - 01:19:26 up  2:06,  2 users,  load average: 3.85, 1.04, 0.42
Tasks: 185 total,   6 running, 179 sleeping,   0 stopped,   0 zombie
%Cpu(s): 97.0 us,  3.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3861520 total,  2303384 free,   253588 used,  1304548 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  3216488 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                  
 20864 bin       20   0  336684   9360   1680 R  43.8  0.2   0:19.38 php-fpm: pool www                                                        
 20862 bin       20   0  336684   9368   1688 R  37.5  0.2   0:19.96 php-fpm: pool www                                                        
 20863 bin       20   0  336684   9364   1684 R  37.5  0.2   0:19.65 php-fpm: pool www                                                        
 20866 bin       20   0  336684   9360   1680 R  37.5  0.2   0:19.89 php-fpm: pool www                                                        
 20865 bin       20   0  336684   9360   1680 R  31.2  0.2   0:20.25 php-fpm: pool www    

使用perf命令记录。

perf record -a -g -F 99 -p 21212
Warning:
PID/TID switch overriding SYSTEM^C[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.263 MB perf.data (2067 samples) ]

转成火焰图,然后打开看。


性能瓶颈--CPU(使用率)_第1张图片
perf 火焰图

可以看到右上角。主要是在执行那两个函数。
原来性能问题就出在那两个函数上。

小结

CPU使用率是最直观和最常用的系统性能指标。

  • 用户CPU和Nice值高时,说明用户态进程占了较多的CPU,所以应该着重排查进程的性能问题。
  • 系统的CPU高,说明内核态占用的CPU多,应该着重查看内核线程或者系统调用的性能问题。
  • I/O 等待CPU高,说明等待I/O的时间比较长,所以应该着重查是不是出现了I/O问题。
  • 软中断和硬中断高,说明中断处理程序占用了较多的CPU,应该着重查看内核中的中断服务程序。

perf 的使用与动态追踪技术:
https://www.jianshu.com/p/3cdc0f05ac5d
动态追踪技术漫谈
http://www.brendangregg.com/

你可能感兴趣的:(性能瓶颈--CPU(使用率))