cpu性能测试工具 (CPU性能测试工具) 方法论

CPU分析的一般步骤:

性能监控指标+工具:通过已有指标或者现成的工具进行初步分析和判断使用USE方法进行进一步分析:U:CPU使用率,S:满载率:E:错误测量分析微基准测试静态性能优化

本文侧重对工具的使用介绍。

基础分析工具

基础分析主要包含以下工具的使用:uptime、vmstat、mpstat、sar、ps、top、pidstat,time/ptime

1. uptime

通常uptime可以用来查看系统负载信息

$ uptime 19:10:52 up 1135 电脑days, 7:37, 1 user, load average: 87.87, 77.49, 66.99

最后三列分别是1分钟、5分钟和15分钟系统的平均负载。如果数字是依次减小的,说明现在系统负载在升高,如果是依次增大的,则说明系统负载在降低。

在Linux系统中load值的计算包含系统中正在运行的进行(RUNNING)、可以运行的进程(RUNABLE)和处于不可中断的进程。

2. vmstat

虚拟内存分析工具第一列输出的是可运行进程数,最后几列输出的是cpu相关指标,可以用来分析cpu相关的问题,该工具可显示CPU正式使用率。

$ vmstat 1procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st58 9 0 856644 44052 88905592 0 0 4214 3852 0 0 61 8 26 5 060 7 0 973376 44072 88245416 0 0 324648 333560 265446 247480 62 11 23 3 058 5 0 1349060 44068 86577808 0 0 289808 257000 270242 276081 55 18 24 3 040 24 0 1573068 44080 84997592 0 0 224756 659252 250767 268095 64 13 17 6 0120 电脑 12 0 1636280 44080 83402944 0 0 307740 283888 249253 253964 56 14 22 8 037 14 0 867316 44080 81521136 0 0 454760 298512 275080 294816 51 16 24 10 052 11 0 2181236 44260 80656688 0 0 445088 560996 298539 249712 56 12 24 9 037 6 0 7423208 44260 81312632 0 0 401356 511956 306425 330183 50 9 33 7 0

跟CPU相关的列分析:

r:对于Linux系统该字段表示所有的Runnable+Running进程,不包含处于D状态的进程,如下图所示us:用户态(用户)CPU使用率sy:内核态(系统)CPU使用率id:CPU空闲率wa:CPU等待I/O使用率,当进程阻塞在磁盘IO上时可以用来衡量CPU idlest:在虚拟化环境显示被其它租户占用的CPU使用率3. mpstat

多CPU统计工具,可以统计每个CPU的使用情况

~# mpstat -P ALL 1Linux 5.4.0-99-generic (ambariserver-wangshuaihua-02.dev.kwaidc.com) 02/26/22 _x86_64_(8 CPU)15:11:56 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle15:11:57 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0015:11:57 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0015:11:57 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0015:11:57 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0015:11:57 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0015:11:57 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0015:11:57 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0015:11:57 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0015:11:57 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00

命令输出列说明:

CPU:逻辑CPU序号,或者是all%usr:用户态(用户)CPU使用率,不包含%nice%nice:带有nice进程的用户态CPU使用率%sys:内核态(系统)CPU使用率%iowait:I/O wait%irq:硬中断CPU使用率%soft:软中断CPU使用率%steal:虚拟化环境其它租户CPU使用率%guest:客户端虚拟机使用使用率%gnice:客户端虚拟机带有nice标记的进程CPU使用率%idle:CPU剩余率

需要关注的列是 %usr,%sys和%idle,注意查看每个CPU的使用率,看是否存在CPU使用不均衡或者热点。

mpstat默认只显示CPU的整体使用情况,如下图所示:

~# mpstat 1Linux 5.4.0-99-generic (ambariserver-wangshuaihua-02.dev.kwaidc.com) 02/26/22 _x86_64_(8 CPU)15:14:04 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle15:14:05 all 0.00 0.00 0.12 0.00 0.00 0.00 0.00 0.00 0.00 99.8815:14:06 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0015:14:07 all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.004. sar

sar工具可以用来观测多项系统指标,针对CPU的参数有:

-P ALL:效果与mpstat -P ALL一样,只是输出的列稍微少一些-u:与mpstat默认输出结果一样,系统平均指标-q:输出run-queue大小,RUNNABLE+RUNNING与vmstat的r列内容一致
初次使用sar工具可能会报错,如果没有sar工具则需要安装,安装后可能还会遇到以下错误

~# sar -P ALLCannot open /var/log/sysstat/sa26: No such file or directoryPlease check if data collecting is enabled

解决方法:

~# sar -o 2 3

~# sar -P ALL 1 -u -qLinux 5.4.0-99-generic (ambariserver-wangshuaihua-02.dev.kwaidc.com) 02/26/22 _x86_64_(8 CPU)15:27:19 CPU %user %nice %system %iowait %steal %idle15:27:20 all 0.00 0.00 0.00 0.00 0.00 100.0015:27:20 0 0.00 0.00 0.00 0.00 0.00 100.0015:27:20 1 0.00 0.00 0.00 0.00 0.00 100.0015:27:20 2 0.00 0.00 0.00 0.00 0.00 100.0015:27:20 3 0.00 0.00 0.00 0.00 0.00 100.0015:27:20 4 0.00 0.00 0.00 0.00 0.00 100.0015:27:20 5 0.00 0.00 0.00 0.00 0.00 100.0015:27:20 6 0.00 0.00 0.00 0.00 0.00 100.0015:27:20 7 0.00 0.00 0.00 0.00 0.00 100.005. ps

ps方法是非常常用的工具,可以列出所有进程的相关信息,命令格式有两种:

BSD格式,参数不带'-'字符SVR4测试,参数带'-'字符

BSD格式命令输出如下所示:

~# ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.1 171060 13240 ? Ss Feb15 0:27 /sbin/initroot 2 0.0 0.0 0 0 ? S Feb15 0:00 [kthreadd]root 3 0.0 0.0 0 0 ? I< Feb15 0:00 [rcu_gp]root 4 0.0 0.0 0 0 ? I< Feb15 0:00 [rcu_par_gp]root 6 0.0 0.0 0 0 ? I< Feb15 0:00 [kworker/0:0H-kblockd]root 9 0.0 0.0 0 0 ? I< Feb15 0:00 [mm_percpu_wq]root 10 0.0 0.0 0 0 ? S Feb15 0:00 [ksoftirqd/0]root 11 0.0 0.0 0 0 ? I Feb15 8:49 [rcu_sched]

SVR4格式命令输出如下所示:

~# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 Feb15 ? 00:00:27 /sbin/initroot 2 0 0 Feb15 ? 00:00:00 [kthreadd]root 3 2 0 Feb15 ? 00:00:00 [rcu_gp]root 4 2 0 Feb15 ? 00:00:00 [rcu_par_gp]root 6 2 0 Feb15 ? 00:00:00 [kworker/0:0H-kblockd]root 9 2 0 Feb15 ? 00:00:00 [mm_percpu_wq]root 10 2 0 Feb15 ? 00:00:00 [ksoftirqd/0]root 11 2 0 Feb15 ? 00:08:49 [rcu_sched]root 12 2 0 Feb15 ? 00:00:06 [migration/0]

从命令的输出结果上面,看起来BSD格式的输出信息更全一些,但是ps命令可以通过-o参数定制输出列。针对CPU的使用情况,我们按照BSD格式的输出来说,需要关注的是%CPU和TIME列:

%CPU:进程从启动以来的平均CPU使用率TIME:进程启动以来总消耗的CPU时间用户态+内核态(usr+sys)6. top

top命令可以以指定的时间间隔实时展示进程的CPU使用情况。

~# toptop - 23:46:46 up 1135 days, 12:13, 1 user, load average: 46.75, 60.82, 66.77Tasks: 1660 total, 2 running, 1657 sleeping, 0 stopped, 1 zombie%Cpu(s): 28.5 us, 2.3 sy, 0.0 ni, 63.9 id, 4.7 wa, 0.0 hi, 0.5 si, 0.0 stKiB Mem : 19780201+total, 606332 free, 70851200 used, 12634449+buff/cacheKiB Swap: 0 total, 0 free, 0 used. 12021227+avail MemPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND46652 yarn 20 0 8807788 3.459g 40876 S 428.9 1.8 7:49.67 java69808 yarn 20 0 8643232 2.257g 41064 S 412.5 1.2 2:12.97 java6608 yarn 20 0 9153288 3.615g 54376 S 404.9 1.9 17:39.61 java8852 yarn 20 0 4104884 1.796g 47476 S 104.9 1.0 4:58.38 java7359 hdfs 20 0 8616144 5.152g 3900 S 90.1 2.7 424070:32 java46763 yarn 20 0 10.562g 7.527g 108768 S 66.1 4.0 1:09.90 java28082 yarn 20 0 5371224 1.766g 34608 S 59.9 0.9 3:20.35 java8030 yarn 20 0 4093672 1.656g 61588 S 52.0 0.9 5:33.91 java 51830 yarn 20 0 14.877g 0.010t 15560 S 33.2 5.3 64477:55 java

top命令的输出结果中包含了系统整体CPU使用情况(第3行),和每个进程的CPU使用情况。对于每个进程CPU使用情况我们需要关注的是%CPU和TIME列:

%CPU:两次屏幕刷新期间进程的CPU使用率TIME:进程启动以来的总CPU使用时间,单位为秒,比如上面输出的7359号进程已经消耗的CPU时间是424070分32秒

虽然top是一个非常基础的分析工具,但是它对性能的损耗不可小觑,在负载重的机器上表现尤为明显,需要谨慎使用。top对系统性能有较大的影响主要是因为要读取/proc下面所有进程的信息。因为top是对/proc做快照,所以很容易漏掉执行时间比较短的进程。

7. pidstat

pidstat可以用来分析单个进程或线程的CPU使用情况,默认情况下会滚动输出。

# pidstat 1Linux 3.10.0-693.5.2.el7.x86_64 (bjlt-h10366.sy) 02/27/2022 _x86_64_(56 CPU)12:00:34 AM UID PID %usr %system %guest %CPU CPU Command12:00:35 AM 1107 24628 100.00 4.59 0.00 100.00 51 java12:00:35 AM 1107 29868 100.00 3.67 0.00 100.00 38 java12:00:35 AM 1107 37421 100.00 2.75 0.00 100.00 45 java12:00:35 AM 1107 38523 0.92 0.00 0.00 0.92 38 java12:00:35 AM 1107 44470 100.00 26.61 0.00 100.00 40 java12:00:35 AM 1107 48401 100.00 17.43 0.00 100.00 40 java12:00:35 AM 1107 51584 27.52 2.75 0.00 30.28 29 java12:00:35 AM 1107 51830 0.00 100.00 0.00 100.00 45 java

CPU分析常用参数:

-p ALL:显示所有进程或线程CPU使用情况-t:显示线程粒度统计8. time

time有两个版本,一个是shell内建的,另外一个是/usr/bin/下的,这两个有不同的使用效果
shell内建time命令
两次对同一个文件求MD5值

# time md5sum ambari-agent-2.6.2.0-0.x86_64.rpm06e883c97b88079b0cc71a763fa2a99e ambari-agent-2.6.2.0-0.x86_64.rpmreal0m0.417suser0m0.175ssys0m0.056s# time md5sum ambari-agent-2.6.2.0-0.x86_64.rpm06e883c97b88079b0cc71a763fa2a99e ambari-agent-2.6.2.0-0.x86_64.rpmreal0m0.242suser0m0.177ssys0m0.027s

从结果上可以看出第一次使用了0.417秒,用户态使用了0.175秒,内核态使用了0.056秒,其中有0.186(0.417-0.175-0.056)秒的差距,猜测可能是花等磁盘io上了,第二次计算后时间差值缩小到了0.038秒,估计是这个文件已经通过文件系统缓存到了内存中。

/usr/bin/time使用

# /usr/bin/time -v md5sum ambari-agent-2.6.2.0-0.x86_64.rpm06e883c97b88079b0cc71a763fa2a99e ambari-agent-2.6.2.0-0.x86_64.rpmCommand being timed: "md5sum ambari-agent-2.6.2.0-0.x86_64.rpm"User time (seconds): 0.16System time (seconds): 0.03Percent of CPU this job got: 98%Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.2电脑 0Average shared text size (kbytes): 0Average unshared data size (kbytes): 0Average stack size (kbytes): 0Average total size (kbytes): 0Maximum resident set size (kbytes): 724Average resident set size (kbytes): 0Major (requiring I/O) page faults: 0Minor (reclaiming a frame) page faults: 227Voluntary context switches: 0Involuntary context switches: 22Swaps: 0File system inputs: 0File system outputs: 0Socket messages sent: 0Socket messages received: 0Signals delivered: 0Page size (bytes): 4096Exit status: 0
电脑