0

据我从所有有关 NVMe SSD 的相关文章中了解到,NVMe SSD 的好处之一是多队列。利用多个 NVMe I/O 队列,可以极大地利用 NVMe 带宽。然而,我从自己的实验中发现的并不同意这一点。

我想从 NVMe SSD 进行并行 4k 粒度顺序读取。我正在使用三星 970 EVO Plus 250GB。我使用 FIO 对 SSD 进行基准测试。我使用的命令是:

fio --size=1000m --directory=/home/xxx/fio_test/ --ioengine=libaio --direct=1 --name=4kseqread --bs=4k --iodepth=64 --rw=read --numjobs 1/2/4 --group_reporting

下面是我测试 1/2/4 并行顺序读取的结果:

numjobs=1:1008.7MB/s

numjobs=2:927 MB/s

numjobs=4:580 MB/s

即使不会增加带宽,我预计增加 I/O 队列至少会保持与单队列性能相同的带宽。带宽减少有点违反直觉。减少的可能原因是什么?

谢谢你。

4

1 回答 1

0

我想强调您可能会看到此问题的 3 个原因:

  1. 有效队列深度太高,
  2. 测试的容量仅限于 1GB,
  3. 驱动前提条件

首先,为每个 Job 指定参数 --iodepth=X。这意味着在您的上一个实验中(--iodepth=64 和--numjobs=4)有效队列深度为 4x64=256。这对您的云端硬盘来说可能太高了。根据您的 250GB 驱动器的供应商规格,对于 32 的队列深度,4KB 随机读取应显示 250 KIOPS (1GB/s)。由此供应商声明 QD32 非常适合您的驱动器操作以达到最佳性能。如果我们开始增加 QD,那么命令将开始聚合并在提交队列中等待。它不会提高性能。反之亦然,它将开始消耗系统资源(CPU、内存)并降低吞吐量。

其次,将被测容量限制在如此小的范围(1GB)可能会导致 SSD 内部发生大量冲突。这是读取将命中相同的媒体物理读取单元(又名死又名 LUN)的情况。在这种情况下,新的读取将不得不等待前一个读取完成。将测试容量增加到整个驱动器或至少 50-100GB 应尽量减少冲突。

第三,为了获得符合规格的性能数据,需要对 Drive 进行相应的预处理。对于测量顺序和随机读取的情况,最好使用全驱动顺序前提条件。下面的命令将在 QD32 处对整个驱动器容量执行 128KB 顺序写入。

fio --size=100% --ioengine=libaio --direct=1 --name=128KB_SEQ_WRITE_QD32 --bs=128k --iodepth=4 --rw=write --numjobs=8

于 2021-08-20T06:30:49.803 回答