fio:如何测试 bs 小于 1 文件系统块大小?

fio:如何测试 bs 小于 1 文件系统块大小?

我正在测试我的 SSD,有两个问题。

  1. SNIA已发布规范PTS(SNIA)测试SSD。在许多情况下,需要对设备进行 bs=0.5Ki 测试!这背后的道理是什么?如果我理解正确的话,这里的目的是评估小于 1 块大小的 IO 的性能。如果我的理解有误,请纠正我。

  2. 如何使用 fio 测试这个场景?我认为,因为 fio 希望 bs 与文件系统块大小对齐。例如,就我而言,它因以下错误而失败。

    [root@system pwd]# /bin/fio --name=iops-wdpc --direct=1 --ioengine=libaio --bs=512 --size=1024Gi --numjobs=1 --thread=1 --iodepth=1 --output=op --allow_mounted_write=1 --filename=/dev/nvme2n1 --rw=write

    fio: io_u error on file /dev/nvme2n1: Invalid argument: write offset=6295552, buflen=512

(我的文件系统块大小是 4Ki)

[root@system pwd]# tune2fs -l /dev/nvme2n1 | grep -i 'block size'
Block size:               4096

(fio 不适用于 bs=512、1024、2048,但适用于 bs=4096)

[root@system ~]#  /bin/fio --name=iops-wdpc --direct=1 --ioengine=libaio --bs=512 --size=1024Gi --numjobs=1 --thread=1 --iodepth=1 --output=op --allow_mounted_write=1 --filename=/dev/nvme2n1 --rw=write
fio: io_u error on file /dev/nvme2n1: Invalid argument: write offset=6295552, buflen=512
[root@system ~]# 
[root@system ~]#  /bin/fio --name=iops-wdpc --direct=1 --ioengine=libaio --bs=1024 --size=1024Gi --numjobs=1 --thread=1 --iodepth=1 --output=op --allow_mounted_write=1 --filename=/dev/nvme2n1 --rw=write
fio: io_u error on file /dev/nvme2n1: Invalid argument: write offset=6295552, buflen=1024
[root@system ~]#
[root@system ~]#  /bin/fio --name=iops-wdpc --direct=1 --ioengine=libaio --bs=2048 --size=1024Gi --numjobs=1 --thread=1 --iodepth=1 --output=op --allow_mounted_write=1 --filename=/dev/nvme2n1 --rw=write
fio: io_u error on file /dev/nvme2n1: Invalid argument: write offset=6295552, buflen=2048
[root@system ~]#
[root@system ~]#  /bin/fio --name=iops-wdpc --direct=1 --ioengine=libaio --bs=4096 --size=1024Gi --numjobs=1 --thread=1 --iodepth=1 --output=op --allow_mounted_write=1 --filename=/dev/nvme2n1 --rw=write
^C[root@system ~]# ^C3%][r=0KiB/s,w=147MiB/s][r=0,w=37.7k IOPS][eta 01h:57m:58s]

(fio版)

[root@smartiops ~]# /bin/fio --version
fio-3.1

答案1

(当我写这篇文章时,我开始担心你的设置。请参阅最后的粗体文本)

使用direct=1将在 Linux 上打开该O_DIRECT标志,当堆栈的较低级别不忽略该标志时,该标志带有对齐和大小限制(请参阅有关详细信息,请参阅手册页O_DIRECT中的信息open(2))。如果要O_DIRECT对块设备执行 I/O,则必须使用磁盘逻辑块大小的倍数的块大小。对于 NVMe,通常为 4096 字节,但根据设备配置也可以使用其他值。

在许多情况下,需要对设备进行 bs=0.5Ki 测试!这背后的理由是什么?

当 SSD 首次推出时,它们经常被模仿(请参阅512e)当时硬盘的逻辑块大小,以避免破坏假定 512 字节逻辑块大小/扇区的旧版软件,但这可能会在 I/O 对齐不良时导致性能不佳(请参阅这些有关 Solaris 中 4K 扇区支持的幻灯片)。随着时间的推移,许多设备默认不模拟如此小的块大小。您可能想与 SNIA/指南的作者讨论现代的最小块大小(随着时间的推移,512 字节性能变得不再那么有趣)。

我在这里做错了什么?

您没有做任何错误 - 只是您不能违反O_DIRECT给定块设备的使用规则(I/O 必须良好对齐,并且必须是磁盘逻辑块大小的倍数)。

fio:如何测试 bs 小于 1 文件系统块大小?

奇怪的是,你不断提到“文件系统”,因为你的 fio 工作描述说你将使用块设备 ( filename=/dev/nvme2n1) 并且不会涉及任何 Linux 文件系统(对于特定类型的测试来说,这是非常合理的事情) 。您的命令可能会返回令人困惑的结果(因为它正在返回文件系统信息!),我认为您打算仅对顶部有 ext* 文件系统的东西tune2fs使用/sbin/blockdev --getss <device>as is ...tune2fs

...我现在担心你的设置。如果您正在对系统上的块设备执行 I/O,而该系统上的数据是您无法负担的永久且不可恢复地被摧毁请住手并花一些时间来理解为什么您不应该对具有“活动”文件系统的块设备进行 fio 块设备访问。抱歉发出警告,但你所说的一些内容表明存在严重混乱,如果有数据面临风险......哦天哪,我刚刚看到你在做--allow_mounted_write=1。我只能说你所做的看起来危险的并可能导致奇怪的结果和/或系统崩溃。当您跨越安全屏障时,我建议您先阅读一些背景知识,以便在继续之前有更好的理解。

如果我们假设你的命令的意图是正确的并且你的意思是“我如何直接对一个设备块大小小于设备的逻辑块大小”答案是:你不能。设备的逻辑块大小是设备向操作系统公开的最小可寻址单元,您的逻辑块大小为 4096 字节。您也许能够重新配置设备以通告 512 字节块,但您必须向设备供应商咨询如何执行此操作(这可能意味着性能成本)。

相关内容