ZoL+FIO Randwrite nvme bs=8k@32io = 148MiB/s?

ZoL+FIO Randwrite nvme bs=8k@32io = 148MiB/s?

抱歉,标题是这样的,但这只是我正在调查的 BS 的简短摘要。情况

我在 Ubuntu 上使用 ZoL 2.1.5(来自 jonathonf 的 ppa)(尝试过 20.04&22.04)

我有以下 NVMe 磁盘

  • 金士顿 KC2500 1TB(/dev/nvme0n1)格式化为 512(使用 nvme format -l 0)
  • 三星 983 DCT M.2 960GB(/dev/nvme6n1)使用 nvme format -l 0 格式化为 512)

以下 pastebin 包含所有命令,这里是简短的输出:

RAW 设备:

fio -name=rndw8k32 -ioengine=libaio -direct=1 -buffered=0 -invalidate=1 -filesize=30G -numjobs=1 -bs=8k -iodepth=32 -rw=randwrite -filename=/dev/nvme0n1
WRITE: bw=1600MiB/s (1678MB/s), 1600MiB/s-1600MiB/s (1678MB/s-1678MB/s), io=30.0GiB (32.2GB), run=19202-19202msec

fio -name=rndw8k32 -ioengine=libaio -direct=1 -buffered=0 -invalidate=1 -filesize=30G -numjobs=1 -bs=**8k** -iodepth=32 -rw=randwrite -filename=/dev/nvme6n1
WRITE: bw=1180MiB/s (1237MB/s), 1180MiB/s-1180MiB/s (1237MB/s-1237MB/s), io=30.0GiB (32.2GB), run=26031-26031msec

现在从第一个磁盘创建条带:

zpool create -o ashift=9 -O compression=lz4 -O atime=off -O recordsize=64k nvme /dev/nvme0n1
fio -name=rndw8k32 -ioengine=libaio -direct=1 -buffered=0 -invalidate=1 -filesize=30G -numjobs=1 -bs=**8k** -iodepth=32 -rw=**randwrite** -filename=/nvme/temp.tmp
WRITE: bw=147MiB/s (154MB/s), 147MiB/s-147MiB/s (154MB/s-154MB/s), io=30.0GiB (32.2GB), run=209618-209618msec

好吧,也许是记录大小的问题:

zpool create -o ashift=9 -O compression=lz4 -O atime=off -O recordsize=8k nvme /dev/nvme0n1
fio -name=rndw8k32 -ioengine=libaio -direct=1 -buffered=0 -invalidate=1 -filesize=30G -numjobs=1 -bs=8k -iodepth=32 -rw=randwrite -filename=/nvme/temp.tmp
WRITE: bw=349MiB/s (366MB/s), 349MiB/s-349MiB/s (366MB/s-366MB/s), io=30.0GiB (32.2GB), run=87922-87922msec

这到底是怎么回事?第二个 NVMe 上也有同样的图片。如果我使用 recordsize=64k 和 fio bs=64k,我就会获得正常速度。如果我使用 recordsize=64 和 fio bs=8k,我就会获得糟糕的速度。如果我使用 recordsize=8k 和 fio bs=8k,我就会获得糟糕的速度。

https://pastebin.com/0RH6gLM9

也许问题在于我正在使用文件并比较文件与设备?好吧,ext4 给我:

对于 8k 块

fio -name=rndw8k32 -ioengine=libaio -direct=1 -buffered=0 -invalidate=1 -filesize=30G -numjobs=1 -bs=8k -iodepth=32 -rw=randwrite -filename=/mnt/temp.tmp
WRITE: bw=569MiB/s (597MB/s), 569MiB/s-569MiB/s (597MB/s-597MB/s), io=30.0GiB (32.2GB), run=53989-53989msec

对于 64k 块

fio -name=rndw8k32 -ioengine=libaio -direct=1 -buffered=0 -invalidate=1 -filesize=30G -numjobs=1 -bs=64k -iodepth=32 -rw=randwrite -filename=/mnt/tmp.tmp
WRITE: bw=2137MiB/s (2241MB/s), 2137MiB/s-2137MiB/s (2241MB/s-2241MB/s), io=30.0GiB (32.2GB), run=14373-14373msec

为了以防万一,我也在用以下方法重新格式化 NVMe 后对其进行了测试

nvme format /dev/nvme0n1 -l 1

使用 ashift=12 bs=8k 得到:

zpool create -o ashift=12 -O compression=lz4 -O atime=off -O recordsize=8k nvme /dev/nvme0n1 -f
fio -name=rndw8k32 -ioengine=libaio -direct=1 -buffered=0 -invalidate=1 -filesize=30G -numjobs=1 -bs=8k -iodepth=32 -rw=randwrite -filename=/nvme/temp.tmp
WRITE: bw=192MiB/s (202MB/s), 192MiB/s-192MiB/s (202MB/s-202MB/s), io=30.0GiB (32.2GB), run=159853-159853msec

使用 ashift=12 bs=64k 得到:

zpool create -o ashift=12 -O compression=lz4 -O atime=off -O recordsize=64k nvme /dev/nvme0n1 -f
fio -name=rndw8k32 -ioengine=libaio -direct=1 -buffered=0 -invalidate=1 -filesize=30G -numjobs=1 -bs=8k -iodepth=32 -rw=randwrite -filename=/nvme/temp.tmp    
WRITE: bw=495MiB/s (519MB/s), 495MiB/s-495MiB/s (519MB/s-519MB/s), io=30.0GiB (32.2GB), run=62035-62035msec

细节:https://pastebin.com/GDGgSMmR

那么,我在测试中遗漏了什么?ZFS 怎么会让我的 nvme 慢那么多?以防整个 NVMe 在测试前被归零(比如前一天)。

相关内容