为什么 dd 在 NVMe SSD 上这么慢?

为什么 dd 在 NVMe SSD 上这么慢?

我最近看了这个视频其中,作者解释说,在使用dd命令时,RAM 磁盘比 HDD/SSD 快得多。我明白为什么会这样。然而,我不明白的是,为什么当我dd if=/dev/zero of=test.iso bs=1M count=8000在具有 16GB RAM、12 核 Ryzen 3600X CPU 和额定 NVMe SSD 的系统上执行他的示例命令时,写入速度为 220MB/s写入速度可达 5GB/s。

我知道 RAM 总是会更快,但这看起来太慢了,肯定还有其他东西在起作用。这是他使用命令的方式吗dd?我不知道其内部原理dd,但这是系统限制性能的情况,还是命令被误用了?

注意:连续第二次运行完全相同的命令后,第二次写入速度更快,为 1.4GB/s,但这并不能消除我的困惑。

答案1

SSD 等 NAND 闪存介质具有最小块擦除大小,这意味着如果您dd使用较小的块大小在其上存储数据,SSD 控制器必须多次擦除块才能写入块内的位置。如果最小块擦除大小为 4M,则 1M 意味着该块必须重写 4 次以上。 SSD 需要擦除同一个 4M 块 4 次。

事实上,第二次dd运行相同的命令时它会变得更快,这可以通过内核、驱动程序和控制器的缓存和内部优化来解释,类似于重复命令时看到的情况find

我指的是很好的答案通过 @greg-kennedy 了解更多信息和用于查找最小擦除块大小的脚本,应将其用作dds 块大小值以获得最佳性能。

有时,您也可以在设备规格中或通过阅读 找到它/sys/class/mtd/mtdx/erasesize,具体取决于各个设备。

答案2

我在我的相当旧的工作站(Lenovo Thinkstation C30)上做了一些测试,其中有一个 NVME 驱动器、一个 SATA-SSD 和一个 SATA HDD。

我运行了以下命令(包括从缓冲区刷新以测量写入每个设备所需的实时时间)。

NVME驱动器:

sudodus@bionic64 /mnt/sd1 $ time ( sudo dd if=/dev/zero of=test.img bs=1M count=8000 status=progress ; sync )
7480541184 byte (7,5 GB, 7,0 GiB) kopierade, 4 s, 1,9 GB/s
8000+0 poster in
8000+0 poster ut
8388608000 byte (8,4 GB, 7,8 GiB) kopierade, 4,86151 s, 1,7 GB/s

real    0m9,243s
user    0m0,014s
sys 0m3,921s

SATA-SSD:

sudodus@bionic64 /tmp $ time ( sudo dd if=/dev/zero of=test.img bs=1M count=8000 status=progress ; sync )
8384413696 byte (8,4 GB, 7,8 GiB) kopierade, 11 s, 762 MB/s
8000+0 poster in
8000+0 poster ut
8388608000 byte (8,4 GB, 7,8 GiB) kopierade, 11,0025 s, 762 MB/s

real    0m25,841s
user    0m0,023s
sys 0m3,894s

SATA硬盘:

sudodus@bionic64 /media/multimed-2/test/test0/temp $ time ( sudo dd if=/dev/zero of=test.img bs=1M count=8000 status=progress ; sync )
8296333312 byte (8,3 GB, 7,7 GiB) kopierade, 18 s, 461 MB/s
8000+0 poster in
8000+0 poster ut
8388608000 byte (8,4 GB, 7,8 GiB) kopierade, 18,3536 s, 457 MB/s

real    0m50,050s
user    0m0,024s
sys 0m3,566s

速度计算:

$ bc
...
scale=0
8000/9.243
865
8000/25.841
309
8000/50.050
159

实际写入速度摘要(以 MiB/s 为单位)

NVME: 865
SSD:  309
HDD:  159

所以结论是NVME和SSD驱动器的写入速度远低于理论速度。我们必须得出结论,限制速度的瓶颈可能有多个,而不仅仅是设备本身。

我不会责怪dd,我认为还有其他瓶颈。但在我看来,你的 220 MiB/s 写入速度对于你的 NVME SSD 来说太低了。 (我怀疑你可以放弃第二个结果,1.4GB/s,因为它只显示 RAM 的写入速度,但不包括刷新缓冲区。)

也许您可以测试 NVME 驱动器的写入速度,当直播启动来自几个不同的新的Linux 发行版/版本。新的 Linux 内核可能为您的硬件提供更快的驱动程序。

顺便问一下,您的 NVME 驱动器中有什么文件系统? Linux 最适合与 Linux 文件系统(例如 ext4)配合使用。

答案3

如果不添加oflag=directwith dd,写入将被缓冲,吞吐量不是真实的。

相关内容