CPU 是影响 Linux 性能的主要因素之一,本节将介绍几个可以用来查看 CPU 性能的命令。
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 运行性能相关的信息。比如说:
总的来说,vmstat 命令的输出结果中,我们应该重点注意 procs 项中 r 列的值,以及 CPU 项中 us 列、sy 列和 id 列的值。
除了 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
命令。
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 命令的基本用法,由于不是本节重点,因为不再详细介绍。
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 资源。
内存的管理和优化,是 Linux 系统性能优化的重要组成部分,换句话说,内存资源是否充足,会直接影响应用系统(包含操作系统和应用程序)的使用性能。
本节将介绍几个系统命令,通过它们,可以快速查看 Linux 系统中内存的使用状况。
free 是监控 Linux 内存使用状况最常用的命令之一,有关该命令的基本用法,已经在《十二 二十四:Linux free命令:查看内存使用状态》一节中做了详细介绍,所以不再赘述,这里重点给大家讲解如何使用 free 命令查看系统内存的使用情况。
下面是 free 命令在当前测试系统中的输出结果:
[root@localhost ~]# free -m total used free shared buffers cached Mem: 2004 573 1431 0 47 201 -/+ buffers/cache: 323 1680 Swap: 1983 0 1983
从输出结果可以看到,该系统共 2GB 内存,其中系统空闲内存还有 1431MB,并且 swap 交换分区还未使用,因此可以判断出当前系统的内存资源还非常充足。
除此之外,free 命令还可以实时地监控内存的使用状况,通过使用 -s 选项,可以实现在指定的时间段内不间断地监控内存的使用情况。例如:
[root@localhost ~]# free -m -s 5 total used free shared buffers cached Mem: 2004 571 1433 0 47 202 -/+ buffers/cache: 321 1683 Swap: 1983 0 1983 total used free shared buffers cached Mem: 2004 571 1433 0 47 202 -/+ buffers/cache: 321 1683 Swap: 1983 0 1983 #省略后续输出
要想实现动态地监控内存使用状况,除了使用 free 命令提供的 -s 选项,还可以借助 watch 命令。通过给 watch 命令后面添加需要运行的命令,watch 就会自行重复去运行这个命令(默认 2 秒执行一次),例如:
[root@localhost ~]# watch -n 3 -d free Every 3.0s: free Tue Oct 29 03:05:43 2019 total used free shared buffers cached Mem: 2052988 586504 1466484 0 49184 207360 -/+ buffers/cache: 329960 1723028 Swap: 2031608 0 2031608
上面执行的命令中,-n 选项用于执行重复执行的间隔时间,-d 选项用于在显示数据时,高亮显示变动了的数据。
vmstat 命令在监控系统内存方面的功能很强大,有关此命令的基本用法,已经在《十二 二十二:Linux vmstat命令详解:监控系统资源》一节中做了详细介绍,这里重点讲解如何使用此命令查看内存的使用状况。
下面是执行 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 0 0 0 1436128 53004 210744 0 0 7 0 13 14 0 0 100 0 0 1 0 0 1436112 53004 210744 0 0 0 0 128 226 0 0 100 0 0 0 0 0 1435988 53004 210744 0 0 0 0 144 220 1 0 99 0 0
对于内存的监控,我们只需要重点关注 swpd、si 和 so 这 3 列。从此输出结果可以看出,当前系统中,虚拟内存没有使用,硬盘和内存之间没有交换数据,可见内存资源处于空闲状态。
sar 命令也可以用来监控 Linux 的内存使用状况,通过“sar -r”组合可以查看系统内存和交换空间的使用率。
有关 sar 命令的基本用法,可以阅读《八、Linux sar命令详解:分析系统性能》一文做详细了解。
如下是执行“sar -r”命令的输出结果:
[root@localhost ~]# sar -r 2 3 Linux 2.6.32-431.el6.x86_64 (localhost) 10/29/2019 _x86_64_ (8 CPU) 04:54:20 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit 04:54:22 AM 1218760 834228 40.63 53228 424908 738312 18.08 04:54:24 AM 1218744 834244 40.64 53228 424908 738312 18.08 04:54:26 AM 1218712 834276 40.64 53228 424908 738312 18.08 Average: 1218739 834249 40.64 53228 424908 738312 18.08
此输出结果中,各个参数表示的含义如下:
相比 free 命令,sar 命令的输出信息更加人性化,不仅给出了内存使用量,还给出了内存使用的百分比以及统计的平均值。比如说,仅通过 %commit 一项就可以得知,当前系统中的内存资源充足。
除了 CPU 和内存,硬盘读写(I/O)能力也是影响 Linux 系统性能的重要因素之一。本节将介绍几个可用来查看硬盘读写性能的系统命令,并教大家如何通过这些命令的输出结果,判断出当前系统中硬盘是否处于超负荷运转。
《八、Linux sar命令详解:分析系统性能》一节,已经对 sar 命令的基本用法做了详细的介绍,这里不再赘述,接下来主要讲解如何通过 sar -d 命令分析出硬盘读写的性能。
下面是执行 sar -d 命令的输出结果样例:
[root@localhost ~]# sar -d 3 5 Linux 2.6.32-431.el6.x86_64 (localhost) 10/25/2019 _x86_64_ (1 CPU) 06:36:52 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 06:36:55 AM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 06:36:55 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 06:36:58 AM dev8-0 1.00 0.00 12.00 12.00 0.00 0.00 0.00 0.00 06:36:58 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 06:37:01 AM dev8-0 1.99 0.00 47.76 24.00 0.00 0.50 0.25 0.05 Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util Average: dev8-0 1.00 0.00 19.97 20.00 0.00 0.33 0.17 0.02
结合以上输出结果,可以遵循如下标准来判断当前硬盘的读写(I/O)性能:
通过执行 iostat -d 命令,也可以查看系统中硬盘的使用情况,如下是执行此命令的一个样例输出:
[root@localhost ~]# iostat -d 2 3 Linux 2.6.32-431.el6.x86_64 (localhost) 10/30/2019 _x86_64_ (8 CPU) Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 5.29 337.11 9.51 485202 13690 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 1.00 8.00 16.00 16 32 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 0.00 0.00 0.00 0 0
此输出结果中,我们重点看后面 4 列,它们各自表示的含义分别是:
注意,此输出结果中,第一次输出的数据是系统从启动以来直到统计时的所有传输信息,从第二次输出的数据开始,才代表在指定检测时间段内系统的传输值。
根据 iostat 命令的输出结果,我们也可以从中判断出当前硬盘的 I/O 性能。比如说,如果 Blk_read/s 的值很大,就表示当前硬盘的读操作很频繁;同样,如果 Blk_wrtn/s 的值很大,就表示当前硬盘的写操作很频繁。对于 Blk_read 和 Blk_wrtn 的大小,没有一个固定的界限,不同的系统应用对应值的范围也不同。但如果长期出现超大的数据读写情况,通常是不正常的,一定程度上会影响系统性能。
不仅如此,iostat 命令还提供了统计指定硬盘 I/O 状况的方法,即使用 -x 选项。例如:
[root@localhost ~]# iostat -x /dev/sda 2 3 Linux 2.6.32-431.el6.x86_64 (localhost) 10/30/2019 _x86_64_ (8 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.09 0.00 0.24 0.26 0.00 99.42 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 2.00 0.56 2.92 0.44 206.03 7.98 63.56 0.03 9.99 5.31 1.79 avg-cpu: %user %nice %system %iowait %steal %idle 0.31 0.00 0.06 0.00 0.00 99.62 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 avg-cpu: %user %nice %system %iowait %steal %idle 0.50 0.00 0.06 0.00 0.00 99.44 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
此输出结果基本和 sar -d 命令的输出结果相同,需要额外说明的几个选项的含义如下:
使用 vmstat 命令也可以查看有关硬盘的统计数据,例如:
[root@bogon ~]# vmstat -d 3 2 disk- ------------reads------------ ------------writes----------- -----IO------ total merged sectors ms total merged sectors ms cur sec sda 6897 4720 485618 71458 1256 1475 21842 9838 0 43 disk- ------------reads------------ ------------writes----------- -----IO------ total merged sectors ms total merged sectors ms cur sec sda 6897 4720 485618 71458 1256 1475 21842 9838 0 43
该命令的输出结果显示了硬盘的读(reads)、写(writes)以及 I/O 的使用状态。
以上主要讲解了如何通过命令查看当前系统中硬盘 I/O 的性能,其实影响硬盘 I/O 的因素是多方面的,例如应用程序本身、硬件设计、系统自身配置等等。
要想解决硬盘 I/O 的瓶颈,关键是要提高 I/O 子系统的执行效率。比如说,首先从应用程序上对硬盘读写性能进行优化,能够放到内存中执行的操作尽量别保存到硬盘里(内存读写效率要远高于硬盘读写效率);其次,还可以对硬盘存储方法进行合理规划,选择合适的 RAID 存储方式;最后,选择适合自身应用的文件系统,必要时可以使用裸设备提高硬盘的读写性能。
在裸设备上,数据可以直接读写,不必经过操作系统级别的缓存,还可以避免文件系统级别的维护开销(文件系统需要维护超级块、I-node 块等)以及操作系统的 cache 预读功能(减少了 I/O 请求)。