【问题标题】:NVMe SSD's bandwidth decreases when increasing the number of I/O queues增加 I/O 队列数时 NVMe SSD 的带宽会降低
【发布时间】:2021-03-18 12:06:54
【问题描述】:

据我从所有有关 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 队列至少会保持与单队列性能相同的带宽。带宽减少有点违反直觉。减少的可能原因是什么?

谢谢。

【问题讨论】:

  • 您是否因为所有文件都在同一个目录中而导致文件系统争用?

标签: operating-system storage hardware solid-state-drive nvme


【解决方案1】:

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

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

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

其次,将待测容量限制在如此小的范围 (1GB) 会导致 SSD 内部发生大量冲突。这是读取将命中相同的媒体物理读取单元(又名死又名 LUN)的情况。在这种情况下,新读取将不得不等待前一个读取完成。将测试容量增加到整个 Drive 或至少 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

【讨论】:

    猜你喜欢
    • 2020-05-18
    • 2015-02-24
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    相关资源
    最近更新 更多