除了 CPU 和显存,硬盘读写(I/O)能力也是影响 Linux 系统性能的重要诱因之一。本节将介绍几个可用来查看硬碟读写性能的系统命令,并教你们怎样通过这种命令的输出结果,判断出当前系统中硬碟是否处于超负荷运转。
Linux 查看硬碟读写性能:sar -d 命令
《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)性能:
Linux 查看硬碟读写性能:iostat -d 命令
通过执行 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 列,它们各自表示的涵义分别是:
注意,此输出结果中arm linux,第一次输出的数据是系统从启动以来直至统计时的所有传输信息RAR FOR LINUX,从第二次输出的数据开始,才代表在指定检查时间段内系统的传输值。
根据 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 命令的输出结果相同,需要额外说明的几个选项的含意如下:
Linux 查看硬碟读写性能:vmstat -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 的性能linux下查看硬盘型号,其实影响硬碟 I/O 的诱因是多方面的,例如应用程序本身、硬件设计、系统自身配置等等。
要想解决硬碟 I/O 的困局,关键是要增强 I/O 子系统的执行效率。比如说,首先从应用程序上对硬碟读写性能进行优化,能够放在显存中执行的操作尽量别保存到硬碟里(内存读写效率要远低于硬碟读写效率);其次,还可以对硬碟储存方式进行合理规划,选择合适的 RAID 存储方法;最后linux下查看硬盘型号,选择适宜自身应用的文件系统,必要时可以使用裸设备提升硬碟的读写性能。
在裸设备上,数据可以直接读写,不必经过操作系统级别的缓存,还可以避免文件系统级别的维护开支(文件系统须要维护超级块、I-node 块等)以及操作系统的 cache 预读功能(减少了 I/O 请求)。