CPU 是影响 Linux 性能的主要因素之一,本节将介绍几个可以用来查看 CPU 性能的命令。
Linux CPU性能分析:vmstat命令
vmstat 命令可以显示关于系统各种资源之间相关性能的简要信息,在 《Linux vmstat命令》一节中,我们已经对此命令的基本格式和用法做了详细的介绍,因此不再赘述,这里主要用它来看 CPU 的一个负载情况。
下面是 vmstat 命令在当前测试系统中的输出结果:
[root@localhost ~]# vmstat 2 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 8 247512 39660 394168 0 0 31 8 86 269 0 1 98 1 0
0 0 8 247480 39660 394172 0 0 0 0 96 147 4 0 96 0 0
0 0 8 247484 39660 394172 0 0 0 66 95 141 2 2 96 0 0
通过分析 vmstat 命令的执行结果,可以获得一些与当前 Linux 运行性能相关的信息。比如说:
1、r 列表示运行和等待 CPU 时间片的进程数,如果这个值长期大于系统 CPU 的个数,就说明 CPU 不足,需要增加 CPU。
2、swpd 列表示切换到内存交换区的内存数量(以 kB 为单位)。如果 swpd 的值不为 0,或者比较大,而且 si、so 的值长期为 0,那么这种情况下一般不用担心,不用影响系统性能。
3、cache 列表示缓存的内存数量,一般作为文件系统缓存,频繁访问的文件都会被缓存。如果缓存值较大,就说明缓存的文件数较多,如果此时 I/O 中 bi 比较小,就表明文件系统效率比较好。
4、一般情况下,si(数据由硬盘调入内存)、so(数据由内存调入硬盘) 的值都为 0,如果 si、so 的值长期不为 0,则表示系统内存不足,需要增加系统内存。
5、如果 bi+bo 的参考值为 1000 甚至超过 1000,而且 wa 值较大,则表示系统磁盘 I/O 有问题,应该考虑提高磁盘的读写性能。
6、输出结果中,CPU 项显示了 CPU 的使用状态,其中当 us 列的值较高时,说明用户进程消耗的 CPU 时间多,如果其长期大于 50%,就需要考虑优化程序或算法;sy 列的值较高时,说明内核消耗的 CPU 资源较多。通常情况下,us+sy 的参考值为 80%,如果其值大于 80%,则表明可能存在 CPU 资源不足的情况。
总的来说,vmstat 命令的输出结果中,我们应该重点注意 procs 项中 r 列的值,以及 CPU 项中 us 列、sy 列和 id 列的值。
Linux CPU性能分析:sar命令
除了 vmstat 命令,sar 命令也可以用来检查 CPU 性能,它可以对系统的每个方面进行单独的统计。
注意,虽然使用 sar 命令会增加系统开销,不过这些开销是可以评估的,不会对系统性能的统计结果产生很大影响。
和 vmstat 命令一样,sar 命令的基本格式和用法已经在 《Linux sar命令》一节中做了详细的介绍,接下来直接学习如何使用 sar 命令查看 CPU 性能。
下面是 sar 命令对当前测试系统的 CPU 统计输出结果:
[root@localhost ~]# sar -u 3 5
Linux 2.6.32-431.el6.x86_64 (localhost) 10/28/2019 _x86_64_ (8 CPU)
04:02:46 AM CPU %user %nice %system %iowait %steal %idle
04:02:49 AM all 1.69 0.00 2.03 0.00 0.00 96.27
04:02:52 AM all 1.68 0.00 0.67 0.34 0.00 97.31
04:02:55 AM all 2.36 0.00 1.69 0.00 0.00 95.95
04:02:58 AM all 0.00 0.00 1.68 0.00 0.00 98.32
04:03:01 AM all 0.33 0.00 0.67 0.00 0.00 99.00
Average: all 1.21 0.00 1.35 0.07 0.00 97.37
此输出结果统计的是系统中包含的 8 颗 CPU 的整体运行状况,每项的输出都非常直观,其中最后一行(Average)是汇总行,是对上面统计信息的一个平均值。
需要指出的是,sar 输出结果中第一行包含了 sar 命令本身的统计消耗,因此 %user 列的值会偏高一点,但这并不会对统计结果产生很大影响。
另外,在一个多 CPU 的系统中,如果程序使用了单线程,就会出现“CPU 整体利用率不高,但系统应用响应慢”的现象,造成此现象的原因在于,单线程只使用一个 CPU,该 CPU 占用率为 100%,无法处理其他请求,但除此之外的其他 CPU 却处于闲置状态,进而整体 CPU 使用率并不高。
针对这个问题,可以使用 sar 命令单独查看系统中每个 CPU 的运行状态,例如:
[root@localhost ~]# sar -P 0 3 5
Linux 2.6.32-431.el6.x86_64 (localhost) 10/28/2019 _x86_64_ (8 CPU)
04:44:57 AM CPU %user %nice %system %iowait %steal %idle
04:45:00 AM 0 8.93 0.00 1.37 0.00 0.00 89.69
04:45:03 AM 0 6.83 0.00 1.02 0.00 0.00 92.15
04:45:06 AM 0 0.67 0.00 0.33 0.33 0.00 98.66
04:45:09 AM 0 0.67 0.00 0.33 0.00 0.00 99.00
04:45:12 AM 0 2.38 0.00 0.34 0.00 0.00 97.28
Average: 0 3.86 0.00 0.68 0.07 0.00 95.39
注意,sar 命令对系统中 CPU 的计数是从数字 0 开始的,因此上面执行的命令表示对系统中第一颗 CPU 的运行状态进行统计。如果想单独统计系统中第 5 颗 CPU 的运行状态,可以执行sar -P 4 3 5
命令。
Linux CPU性能分析:iostat命令
iostat 命令主要用于统计磁盘 I/O 状态,但也能用来查看 CPU 的使用情况,只不过使用此命令仅能显示系统所有 CPU 的平均状态,无法向 sar 命令那样做具体分析。
使用 iostat 命令查看 CPU 运行状态,需要使用该命令提供的 -c 选项,该选项的作用是仅显示系统 CPU 的运行情况。例如:
[root@localhost ~]# iostat -c
Linux 2.6.32-431.el6.x86_64 (localhost) 10/28/2019 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.07 0.00 0.12 0.09 0.00 99.71
可以看到,此输出结果中包含的项和 sar 命令的输出项完全相同。
有关 iostat 命令的基本用法,由于不是本节重点,因为不再详细介绍。
Linux CPU性能分析:uptime命令
uptime 命令是监控系统性能最常用的一个命令,主要用来统计系统当前的运行状况,例如:
[root@localhost ~]# uptime
05:38:26 up 1:47, 2 users, load average: 0.12, 0.08, 0.08
该命令的输出结果中,各个数据所代表的含义依次是:系统当前时间、系统运行时长、当前登陆系统的用户数量、系统分别在 1 分钟、5 分钟和 15 分钟内的平均负载。
这里需要注意的是,load average 这 3 个输出值一般不能大于系统 CPU 的个数。例如,本测试系统有 8 个 CPU,如果 load average 中这 3 个值长期大于 8,就说明 CPU 很繁忙,负载很高,系统性能可能会受到影响;如果偶尔大于 8 则不用担心,系统性能一般不会受到影响;如果这 3 个值小于 CPU 的个数(如本例所示),则表示 CPU 是非常空闲的。
总的来说,本节介绍了 4 个可查看 CPU 性能的命令,但这些命令也仅能查看 CPU 是否繁忙、负载是否过大,无法知道造成这种现象的根本原因。因此,在明确判断出系统 CPU 出现问题之后,还要结合 top、ps 等命令,进一步检查出是哪些进程造成的。
另外要知道的是,引发 CPU 资源紧张的原因有多个,可能是应用程序不合理造成的,也可能是硬件资源匮乏引起的。因此,要学会具体问题具体分析,或者优化应用程序,或者增加系统 CPU 资源。