一、背景
在应用中我们常常使用磁盘来做持久化存储,在不同的应用场景中,对磁盘的性能要求也是不同的,那么我们应该如何衡量磁盘的性能是否满足应用的需求呢?本篇主要侧重介绍以下两个方面。
- 磁盘性能指标介绍
- 磁盘压测工具介绍
二、磁盘性能指标
衡量磁盘性能,一般会从这几个指标入手,分别是使用率、饱和度、IOPS、吞吐量。
- 使用率:向设备发出I/O请求的已用时间百分比。
- 饱和度:描述IO设备繁忙程度,100%饱和度代表不能再接收新的IO请求。
- IOPS(Input/Output Operations Per Second):每秒IO请求数
- 吞吐量:每秒磁盘I/O的流量=IOPS*IO大小
以上这些指标我们常常被提及,但是那些指标才是衡量磁盘性能最关键的呢?其实脱离应用本身单一看这些单个的指标可能并不能满足我们的需求。举个例子来说,数据库存在大量随机IO的场景下,IOPS指标就更能反映出系统的性能,而在大文件读取/写入的场景下,存在大量连续IO,吞吐量就更能反映系统的性能。所以在工业化的软件中,更多从应用场景出发,结合io的特性、读写比例、连续IO/顺序IO、IO大小等综合考量,才能知道应用更应该关注哪些性能指标。
三、磁盘指标&压测工具
3.1 iostat-查看磁盘指标
磁盘指标最常用的观察的工具就是iostat,下图就是通过iostat展示的指标图。
其中可以看到iostat提供了很多性能指标,每个指标的含义如下:
字段 | 描述 |
---|---|
Device | 设备名 |
r/s | 设备每秒完成的读取请求数(包括合并后) |
rKB/s | 每秒从设备读取的数据量,单位KB |
rrqm/s | 每秒合并的读请求数 |
%rrqm | 合并读请求的百分比 |
r_await | 读请求的平均等待时间,包括请求在queue中的时间,单位milliseconds |
rareq-sz | 读请求的平均io大小,单位kilobytes(KB) |
w/s | 设备每秒完成的写入请求数(包括合并后) |
wKBs/s | 每秒从设备写入的数据量,单位KB |
wrqm/s | 每秒合并的写请求数 |
%wrqm | 合并写请求的百分比 |
w_await | 写请求的平均等待时间,包括请求在queue中的时间,单位milliseconds |
wareq-sz | 写请求的平均io大小,单位kilobytes(KB) |
d/s | 设备每秒丢弃的请求数(合并后) |
dKB/s | 每秒为设备丢弃的数据量,单位KB |
drqm/s | 每秒丢弃请求被合并的数量,从queue到device |
%drqm | 发送到设备之前合并在一起的丢弃请求的百分比 |
d_await | 丢弃请求的平均等待时间 |
dareq-sz | 丢弃请求的平均io大小,单位kilobytes(KB) |
aqu-sz | 向设备发出的请求的平均队列长度。(note:老版本为avgqu-sz) |
%util | 向设备发出I/O请求的已用时间百分比(设备的带宽利用率) |
使用率(%util):当该值接近100%时,设备饱和会发生。但对于服务于并行任务,如RAID阵列和现代SSD,这个数字并不能反映它们的性能限制。
IOPS=r/s+w/s
吞吐量=rKB/s+wKB/s
3.2 fio-性能压测
知道了磁盘指标的查看,我们还需要对磁盘进行性能压测,以便我们了解应用线上使用IO的大概理论极限性能。
fio是一个性能压测工具,它可以执行用户指定的特定类型的I/O操作。常用相关参数如下:
参数 | 描述 |
---|---|
direct | 如果值为真,则使用非缓冲I/O。这通常是O_DIRECT。注意,Solaris上的OpenBSD和ZFS不支持直接I/O。在Windows上,同步ioengine不支持直接I/O。默认值:false |
iodepth | 在途文件io数,默认为1,注意:在同步模式下>1会无效 |
numjobs | 创建的线程/进程数,默认为1 |
blocksize | 每次读写的IO大小,默认4096字节 |
readwrite | 读写模式 read:顺序读、wirte:顺序写、randread:随机读、randwrite:随机写 |
size | 整个任务的io大小 |
ioengine | sync:同步io libaio:linux本地实现的异步io(Linux可能只支持非缓冲I/O的排队行为(设置“direct=1”或“buffere=0”))。 |
name | 任务名 |
使用如下命令进行顺序写测试:
fio -direct=1 -iodepth=64 -readwrite=write -ioengine=libaio -bs=4k -size=10G -numjobs=1 -name=./fio.test
可以看到在我主机上IOPS为2313/s,吞吐量为9252KB/s
压测的同时,我们使用iostat观察一下是否我们上述描述的一些指标
可以看到iostat结果和fio的压测结果基本上是一致的。
我们还可以将readwrite参数设置为read、randread、randwrite分别来测试顺序读、随机读、随机写的性能。
四、总结
本文主要介绍了一下几个方面的内容
- 磁盘性能关注的几个关键指标
- 通过iostat查看磁盘性能指标
- 通过fio压测磁盘的性能
小问题:你知道iostat的数据是从哪里来的么?另外你工作有使用过iostat来排查线上io问题吗?希望你也可以分享下遇到的问题,相互学习。