合 如何查询及测试Linux系统的磁盘IO性能
简介
我们知道 Linux 存储系统 I/O 栈由文件系统层(file system layer)、通用块层( general block layer)和设备层(device layer)构成。
其中,通用块层是 Linux 磁盘 I/O 的核心。向上,它为访问文件系统和应用程序的块设备提供了标准接口;向下,它将各种异构磁盘设备抽象为一个统一的块设备,并响应文件系统和应用程序发送的 I/O。
磁盘 IO 的使用率是指磁盘处理 IO 的时间百分比,可以反映磁盘的负载情况。过高的使用率(比如超过 80%)通常意味着磁盘 IO 存在性能瓶颈。
查看磁盘 IO 的使用率有多种方法,例如:
- 使用 top 命令,通过查看 CPU 的 wa% 值来判断当前磁盘 IO 性能
- 使用 iostat 命令,通过查看 %util 列来判断每个设备的使用率
- 使用sar命令,通过查看 %util 列来判断每个设备的使用率
- 使用 pidstat 命令,通过查看 kB_rd/s 和 kB_wr/s 列来判断每个进程的读写速度
Linux 磁盘性能指标说明
在衡量磁盘性能时,我们经常提到五个常见指标:利用率、饱和度、IOPS、吞吐量和响应时间。这五个指标是衡量磁盘性能的基本指标。
- 使用率(Utilization):磁盘处理 I/O 的时间百分比。过度使用(如超过 80%)通常意味着磁盘 I/O 存在性能瓶颈。
- 饱和度(Saturation):指磁盘处理 I/O 的繁忙程度。过度饱和意味着磁盘存在严重的性能瓶颈。当饱和度为 100% 时,磁盘无法接受新的 I/O 请求。
- IOPS(Input/Output Per Second):指每秒 I/O 请求的数量。
- 吞吐量(Throughput):每秒 I/O 请求的大小。
- 响应时间(Response time):指发送 I/O 请求和接收响应之间的间隔时间。
这里需要注意的是,关于利用率,我们只考虑有无 I/O,而不考虑 I/O 的大小。也就是说,当利用率为 100% 时,磁盘仍有可能接受新的 I/O 请求。
一般来说,在为应用选择服务器时,首先要对磁盘的 I/O 性能进行基准测试,这样才能准确评估磁盘性能,以判断是否能够满足应用的需求。当然,这需要你在随机读、随机写、顺序读、顺序写等各种应用场景下测试不同 I/O 大小的性能。
IOPS 与吞吐量的关系
每秒 I/O 吞吐量= IOPS * 平均 I/O SIZE。从公式可以看出: I/O SIZE 越大,IOPS 越高,那么每秒 I/O 的吞吐量就越高。因此,我们会认为 IOPS 和吞吐量的数值越高越好。实际上,对于一个磁盘来讲,这两个参数均有其最大值,而且这两个参数也存在着一定的关系。
IOPS可细分为如下几个指标:
- Toatal IOPS,混合读写和顺序随机I/O负载情况下的磁盘IOPS,这个与实际I/O情况最为相符,大多数应用关注此指标。
- Random Read IOPS,100%随机读负载情况下的IOPS。
- Random Write IOPS,100%随机写负载情况下的IOPS。
- Sequential Read IOPS,100%顺序读负载情况下的IOPS。
- Sequential Write IOPS,100%顺序写负载情况下的IOPS。
磁盘 I/O 观察
首先要观察的是每个磁盘的使用情况。iostat 是最常用的磁盘 I/O 性能观察工具。它提供了各种常用性能指标,例如每个磁盘的利用率、IOPS 和吞吐量。当然,这些指标实际上来自 /proc/diskstats
。
iostat
iostat主要用于监控系统设备的 IO 负载情况,iostat 首次运行时显示自系统启动开始的各项统计信息,之后运行 iostat 将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。
iostat,对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。
iostat命令参数说明:
- -c: 显示CPU使用情况
- -d: 显示磁盘使用情况
- -N: 显示磁盘阵列(LVM) 信息
- -n: 显示NFS 使用情况
- -k: 以 KB 为单位显示
- -m: 以 M 为单位显示
- -t: 报告每秒向终端读取和写入的字符数和CPU的信息
- -V: 显示版本信息
- -x: 显示IO相关的详细信息
- -p [磁盘] : 显示磁盘和分区的情况
备注:
如果%iowait的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲。
如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。
如果%idle值持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。
CPU属性值说明:
- %user: CPU处在用户模式下的时间百分比
- %nice: CPU处在带NICE值的用户模式下的时间百分比
- %system: CPU处在系统模式下的时间百分比
- %iowait: CPU等待输入输出完成时间的百分比
- %steal: 管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比
- %idle: CPU空闲时间百分比
磁盘属性值说明:
- device: 磁盘名称
- tps: 每秒钟发送到的I/O请求数
- Blk_read/s: 每秒读取的block数
- Blk_wrtn/s: 每秒写入的block数
- Blk_read: 读入的block总数
- Blk_wrtn: 写入的block总数
磁盘IO相关的详细说明:
- rrqm/s: 每秒进行 merge 的读操作数目。即 rmerge/s
- wrqm/s: 每秒进行 merge 的写操作数目。即 wmerge/s
- r/s: 每秒完成的读 I/O 设备次数。即 rio/s
- w/s: 每秒完成的写 I/O 设备次数。即 wio/s
- rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
- wkB/s: 每秒写K字节数。是 wsect/s 的一半
- avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)
- avgqu-sz: 平均I/O队列长度
- rsec/s: 每秒读扇区数。即 rsect/s
- wsec/s: 每秒写扇区数。即 wsect/s
- r_await: 每个读操作平均所需的时间,不仅包括硬盘设备读操作的时间,还包括了在kernel队列中等待的时间
- w_await: 每个写操作平均所需的时间,不仅包括硬盘设备写操作的时间,还包括了在kernel队列中等待的时间
- await: 平均每次设备I/O操作的等待时间 (毫秒)
- svctm: 平均每次设备I/O操作的服务时间 (毫秒)
- %util: 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比
备注:
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;
如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化。
如果avgqu-sz比较大,也表示有当量io在等待。
示例:查看cpu状态
1 | iostat -c 1 1 |
示例:查看磁盘使用率和响应时间
1 2 | # -d 显示磁盘使用情况,-x 显示详细信息 iostat -d -x -k 1 1 |
其他示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 间隔1秒,总共显示5次 iostat 1 5 # 每隔2秒,显示一次设备统计信息 iostat -d 2 # 每隔2秒,显示一次设备统计信息,总共输出3次 iostat -d 2 3 # 每隔2秒显示一次sda, sdb两个设备的扩展统计信息,共输出3次 iostat -x sda sdb 2 3 # 每隔2秒显示一次sda及上面所有分区的统计信息,共输出3次 iostat -p sda 2 3 # 以M为单位显示所有信息 iostat -m |
以下是 iostat
的输出示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # -d -x means display all disk I/O performance $ iostat -d -x 1 Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util loop0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 loop1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 [root@server-68.2.stage.polex.io var ]$ iostat -dxk 1 2 Linux 3.10.0-693.5.2.el7.x86_64 (server-68) 03/11/2019 _x86_64_ (64 CPU) Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.06 0.32 2.08 1.44 72.78 61.81 0.14 59.32 0.51 68.37 5.68 1.36 sdb 0.00 0.00 0.03 0.00 1.15 0.00 86.32 0.00 0.17 0.17 0.00 0.16 0.00 dm-0 0.00 0.00 0.00 0.24 0.02 1.56 13.22 0.01 44.55 6.36 44.71 13.25 0.32 dm-1 0.00 0.00 0.32 1.90 1.32 71.22 65.30 0.14 62.43 0.49 72.79 4.75 1.06 dm-2 0.00 0.00 0.00 0.00 0.00 0.00 26.79 0.00 28.06 4.68 38.98 5.18 0.00 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.00 0.00 3.00 0.00 16.00 10.67 0.26 86.33 0.00 86.33 42.33 12.70 sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 dm-1 0.00 0.00 0.00 3.00 0.00 16.00 10.67 0.26 86.33 0.00 86.33 42.33 12.70 dm-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 |
在上述指标中,您需要注意的是:
%util
是我们前面提到的磁盘 I/O 使用情况r/s
和w/s
是 IOPSrkB/s
和wkB/s
是吞吐量r_await
和w_await
是响应时间
您可能已经注意到 iostat
不能直接获取磁盘的饱和度。事实上,通常没有什么简单的方法可以测量饱和度。但是,您可以将观察到的平均请求队列长度或完成读写请求的等待时间与基准测试(例如通过 fio)的结果进行比较,以综合评估磁盘饱和度。
该命令的结果与上面 sar -d -p 1 2
命令类似,实际使用中主要还是看 await svctm %util 参数。
sar
sar 命令是分析系统瓶颈的神器,可以用来查看 CPU 、内存、磁盘、网络等性能。