磁盘I/O性能分析

存储系统的I/O栈分为三层:

文件系统层,包括虚拟文件系统和其他各种文件系统的具体实现。它为上层的应用程序,提供标准的文件访问接口;对下会通过通用块层,来存储和管理磁盘数据。

通用块层,向上为文件系统和应用程序,提供访问块设备的标准接口;向下,把各种异构磁盘设备抽象为统一的设备,并提供统一框架来管理这些设备。

设备层,包括存储设备和相应的驱动程序,负责最终物理设备的I/O操作。

磁盘是可以持久化存储的设备,根据存储介质的不同,常见的磁盘可以分为两类:机械磁盘和固态磁盘

机械硬盘,通常简称HDD,由盘片和磁头组成,读写数据时,需要移动磁头去定位盘片,然后才能访问数据。显然,如果请求的I/O是连续的,这样就不需要磁道寻址,可以获得最佳性能,但是如果是随机的I/O请求,那它就需要不停地移动磁头,所以随机读写会非常的慢。

固态硬盘,通常简称SSD,由固态电子元器件组成,它不需要磁道寻址,所以不管是连续I/O请求还是随机I/O请求,性能都要比机械硬盘好很多。

虽然说固态硬盘不需要磁道寻址,但是随机I/O的性能还是比连续I/O的性能要差,因为它存在“先擦除再写入”的限制。随机读写会导致大量的垃圾回收,所以,随机I/O的性能比连续I/O的性能差。

还有一个区别就是机械硬盘的最小读写单位是扇区,大小为512字节,固态硬盘的最小读写单位是页,通常大小是4KB、8KB等。

磁盘性能指标

磁盘性能有五个常见指标:使用率饱和度IOPS吞吐量以及响应时间

使用率:指磁盘处理I/O的时间百分比,过高的使用率意味着磁盘I/O存在性能瓶颈。
饱和度:指磁盘处理I/O的繁忙度,过高的饱和度意味着磁盘存在性能瓶颈,当饱和度 为100%时,磁盘无法再接受新的I/O请求。
IOPS:指每秒的I/O请求数。
吞吐量:指每秒的I/O请求大小
响应时间:指I/O请求从发出到收到响应的间隔时间。
注:使用率只考虑有没有I/O,不考虑I/O大小,所以如果使用率为100%时,磁盘依然有可能接受新的I/O请求。

我们可以用fio工具去衡量磁盘的性能:
我做测试用的磁盘为36块企业级的NVME SSD,下面是我用来测试的fio脚本
——————————————————————————————————————————————————————————
[global]
numjobs=16
rw=randread
bs=8K
runtime=100
ioengine=libaio
direct=1
iodepth=1
name=sz
group_reporting
[file1]
filename=/dev/qdata/mpath-s01.3261.01.n0000b4000
[file2]
filename=/dev/qdata/mpath-s01.3262.01.n0000b3000
[file3]
filename=/dev/qdata/mpath-s01.3263.01.n0000b2000

[file35]
filename=/dev/qdata/mpath-s03.3271.01.n000061000
[file36]
filename=/dev/qdata/mpath-s03.3272.01.n000060000
注:filename=/dev/xxxxxxxxxx是你本地磁盘的路径
——————————————————————————————————————————————————————————
我测试的随机读的性能,下面是我的测试结果:
随机读:
在这里插入图片描述
我们看到IOPS的值是263万,平均每块磁盘提供7.3万的IOPS,再看avg的平均延迟,单位是微秒,在数据库这种对延迟要求比较高的环境下,我们需要把延迟控制在500us以内,我这边是215us,是在要求范围以内的。
测试随机写也是这样,但是要在脚本上把rw改成randwrite,写的性能的话一般是比读要低的,前面我也提到了,这边我就不演示了。

扫描二维码关注公众号,回复: 10804076 查看本文章

顺序读:
测试顺序读,需要在脚本中把bs的值改成1024K,rw改成read
下面是我测试的结果:
在这里插入图片描述
我们看顺序读的时候,就不需要去看IOPS和延迟的值了,我们主要去看BW的值,就是吞吐,前面我也提到了,顺序读的场景一般都是那种多媒体的环境,所以主要看吞吐,这边36块盘提供了23GB/s的性能,算下来每块盘提供了638MB/s的性能,对于nvme ssd来说,也是没有问题的。

接下来我们主要看测随机写时的性能,利用iostat命令来查看磁盘具体性能
iostat -xm 1 -d 命令
在这里插入图片描述
我只截了部分…
下面我放一张具体参数表
在这里插入图片描述
%util 就是磁盘I/O使用率
r/s w/s 就是IOPS
rKB/s wKB/s 就是吞吐
由于我在进行压测,所以你可以看到,磁盘的使用率已经达到了80%以上,这是正常的,再来看一下w/s,可以看上面的表,这个值的意思是每秒提供的IOPS的值,由于我使用了多路径方案,把一块盘按两个路径输出,所以上图中nvme0n1和nvme1n1其实是一块盘,这两个的w/s加起来,大概是7.2万每秒,跟我们上面使用fio压测工具测出来的值是不是对应上了?
还有就是await和svctm的值,这两个值不能相差太大,await就相当于每次io的平均请求时间;svctm则表示每次处理io的平均服务时间,所以,如果相差较大,就表示有io有大量的延迟。

发布了13 篇原创文章 · 获赞 2 · 访问量 459

猜你喜欢

转载自blog.csdn.net/qq_38114620/article/details/102563973