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)。
第二行的数据格式。
- OverHead 是该符号的性能事件在所有的采样中的比例,用百分比表示。
- Shared 是该函数或者指令所在的动态共享对象(Dynamic Shared Object),如内核,进程名,动态链接库,内核模块等。
- Object 是动态共享对象的类型。[.] 表示用户空间的可执行程序、或者动态链接库,而[k]表示的内核空间。
- 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使用率是最直观和最常用的系统性能指标。
- 用户CPU和Nice值高时,说明用户态进程占了较多的CPU,所以应该着重排查进程的性能问题。
- 系统的CPU高,说明内核态占用的CPU多,应该着重查看内核线程或者系统调用的性能问题。
- I/O 等待CPU高,说明等待I/O的时间比较长,所以应该着重查是不是出现了I/O问题。
- 软中断和硬中断高,说明中断处理程序占用了较多的CPU,应该着重查看内核中的中断服务程序。
perf 的使用与动态追踪技术:
https://www.jianshu.com/p/3cdc0f05ac5d
动态追踪技术漫谈
http://www.brendangregg.com/