Zoned-Storage - 对ZNS块设备进行基准测试
Flexible I/O Tester (fio) 最初是作为内核块 I/O 堆栈的测试工具编写的。 然而,多年来,fio 获得了许多功能和详细的性能统计输出,从而将该工具变成了存储设备的标准基准测试应用程序。
fio 源代码可在 GitHub 上获得。
fio zoned块设备支持
fio3.9版 添加了对分区块设备的支持。 所有以前的版本都不为主机管理的分区块设备的写入命令顺序提供保证。 仍然可以执行工作负载,但需要编写复杂的 fio 脚本。
命令行选项
对 fio 的更改以支持zoned块设备包括几个新选项,允许用户控制符合zoned块设备的工作负载。 fio 已经实现了选项 --zonemode
,它允许定义在不相交的块范围内运行的工作负载。 此选项被重用于定义新的 zbd 区域模式。
当 fio job 使用 zbd 区域模式时,--zonerange
选项将被忽略,--zonesize
选项会自动设置为设备区域大小。 此外,读写命令的行为被修改如下。
- 当跨越区域边界时,读取和写入命令会被拆分。
- 对于顺序写入,写入流始终从区域写入指针位置开始。 如果要写入的下一个zone不为空,则写入流“跳转”到该区域写入指针并继续。
- 对于随机写工作负载,写命令总是在写命令的目标区域的写指针位置发出。
- 任何针对已满(完全写入)的顺序区域的写入命令都会在发出写入 I/O 之前触发区域写入指针的reset。
- 默认情况下,所有读取命令始终以写入扇区为目标,即顺序写入区域的起始扇区和写入指针位置之间的扇区。 可以禁用此行为,允许使用新选项
read_beyond_wp
向任何扇区发出读取命令。
此外,可以使用以下新选项添加对工作负载操作的更精细控制。
- –max_open_zones 此选项限制工作负载正在写入的区域数。 使用此选项,随机写入工作负载无法发出针对超过设置限制的区域的写入命令。 一旦正在写入的区域变满,就会选择另一个区域并允许写入以该区域为目标,从而导致写入的区域数量恒定,始终最多等于 max_open_zones 限制。
- –zone_reset_threshold 和 –zone_reset_frequency 这两个选项允许用户模拟应用程序发出的区域重置命令的执行。
除了这些选项之外,zbd 区域模式会自动启用作业同步,以确保跨多个线程或进程的工作负载可以同时执行针对同一区域的写入 I/O。
限制
正如内核支持文档中所讨论的,zoned块设备必须使用直接写入 I/O。 zbd 区域模式在启用时会通过检查是否为执行写入 I/O 的任何作业指定了选项 --direct=1 来强制执行此要求。
–offset 和 --size 选项必须指定与设备区域大小对齐的值。
zonemode=zbd 示例
本节提供各种示例,展示如何使用 fio new zbd zone mode 。 在所有示例中,都使用了 15TB ZAC 主机管理的 SATA 磁盘。 磁盘区域大小为 256 MiB。 磁盘有 524 个常规区域,从偏移量 0 开始。磁盘的第一个顺序写入所需区域从扇区 274726912(512 B 扇区单元)开始,即字节偏移量 140660178944。
顺序写入工作负载
以下命令使用队列深度为 8 的 libaio I/O 引擎顺序写入磁盘的前 4 个顺序区域。
# fio --name=zbc --filename=/dev/sdd --direct=1 --zonemode=zbd \
--offset=140660178944 --size=1G \
--ioengine=libaio --iodepth=8 --rw=write --bs=256K
zbc: (g=0): rw=write, bs=(R) 256KiB-256KiB, (W) 256KiB-256KiB, (T) 256KiB-256KiB, ioengine=libaio, iodepth=8
fio-3.13
Starting 1 process
Jobs: 1 (f=1): [W(1)][100.0%][w=239MiB/s][w=955 IOPS][eta 00m:00s]
zbc: (groupid=0, jobs=1): err= 0: pid=4124: Fri May 24 11:49:18 2019
write: IOPS=938, BW=235MiB/s (246MB/s)(1024MiB/4365msec); 0 zone resets
slat (nsec): min=5930, max=39068, avg=9729.06, stdev=2048.99
clat (usec): min=783, max=55846, avg=8511.40, stdev=4079.36
lat (usec): min=809, max=55854, avg=8521.19, stdev=4079.36
clat percentiles (usec):
| 1.00th=[ 3884], 5.00th=[ 7701], 10.00th=[ 8094], 20.00th=[ 8225],
| 30.00th=[ 8225], 40.00th=[ 8225], 50.00th=[ 8225], 60.00th=[ 8291],
| 70.00th=[ 8356], 80.00th=[ 8356], 90.00th=[ 8356], 95.00th=[ 8356],
| 99.00th=[30540], 99.50th=[45351], 99.90th=[55837], 99.95th=[55837],
| 99.99th=[55837]
bw ( KiB/s): min=224830, max=249357, per=99.49%, avg=239009.50, stdev=9032.95, samples=8
iops : min= 878, max= 974, avg=933.50, stdev=35.36, samples=8
lat (usec) : 1000=0.02%
lat (msec) : 4=2.91%, 10=95.70%, 20=0.20%, 50=0.78%, 100=0.39%
cpu : usr=0.73%, sys=0.64%, ctx=1045, majf=0, minf=11
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=99.8%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.1%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued rwts: total=0,4096,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=8
Run status group 0 (all jobs):
WRITE: bw=235MiB/s (246MB/s), 235MiB/s-235MiB/s (246MB/s-246MB/s), io=1024MiB (1074MB), run=4365-4365msec
Disk stats (read/write):
sdd: ios=0/984, merge=0/2943, ticks=0/8365, in_queue=7383, util=24.13%
在磁盘处于此状态时,在未启用 zbd 区域模式的情况下再次执行相同的命令,fio 将尝试写入full zone,从而导致 I/O 错误。
# fio --name=zbc --filename=/dev/sdd --direct=1 \
--offset=140660178944 --size=1G \
--ioengine=libaio --iodepth=8 --rw=write --bs=256K
zbc: (g=0): rw=write, bs=(R) 256KiB-256KiB, (W) 256KiB-256KiB, (T) 256KiB-256KiB, ioengine=libaio, iodepth=8
fio-3.13
Starting 1 process
fio: io_u error on file /dev/sdd: Remote I/O error: write offset=140660178944, buflen=262144
fio: pid=4206, err=121/file:io_u.c:1791, func=io_u error, error=Remote I/O error
zbc: (groupid=0, jobs=1): err=121 (file:io_u.c:1791, func=io_u error, error=Remote I/O error): pid=4206: Fri May 24 12:34:27 2019
cpu : usr=1.22%, sys=0.00%, ctx=3, majf=0, minf=16
IO depths : 1=12.5%, 2=25.0%, 4=50.0%, 8=12.5%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%,