为什么我的顺序读取速度如此(相对)慢?
虽然 Win10 上的 CrystalDiskMark 报告约为 5GB/s(读取和写入),但我在 Linux 上的性能还差得远。 (在 Windows 上从/到同一驱动器复制和粘贴数百 GB 的平均速度约为 2.5GB/s,因此我认为 CDM 与此处的实际值相差不远。)
简单的
dd if=/dev/nvme0n1 of=/dev/null bs=1M count=10k
报告仅为 1.5GB/s。
在另一个 NVME(均为 Corsair Force MP600 1TB)上,dd 报告 1.4 GB/s。
我希望这样的顺序访问是从任何存储设备读取的最佳情况,所以我真的不知道这里发生了什么。
(我在 StackExchange 上看到了一些类似的问题,但它们都朝着与这个“简单问题”不同的方向发展。)
注意:如果我没有记错的话,CrystalDiskMark 使用“真实文件” - 因此它甚至有额外的文件系统开销,而我的 dd 调用应该是可能得到的最好的 - 或者不是?
系统信息:
- 两个 NVME 均通过 4 个 PCIe 4.0 通道连接
- 两个 NVME 的温度 < 60°C
- 以 root 身份挂载的速度越快,卸载的速度就越慢
- Zen2 Threadripper(所以 PCIe 4.0 通道绰绰有余......)
- 内核5.6.4
- BIOS更新
- NVME固件更新
任何正确方向的想法或指示将不胜感激!
答案1
罪魁祸首是顺序访问。 NVME 仅在许多同时请求时显示其性能。因此,“cp”只会导致一次[顺序]读取,dd 和 hdparm 也是如此。如果您使用“并行”等技巧为每个文件创建一个 cp 进程,则总吞吐量会变得更高。即使对于大文件,Windows 的资源管理器似乎也能做到这一点(并行复制多个段 - 至少我猜是这样)。
答案2
请务必认真对待hdparm
,请阅读手册页,其中一个有助于 Linux 提高读取性能的命令是:
sudo hdparm -tT --direct /dev/nvmexxx
衡量性能的问题dd
显然是 Linux 如何在内存中进行分页。我自己仍在尝试完全理解它。我怀疑 Windows 也有同样的功能,只是隐藏得更好,因为没有dd
命令。据我了解,hdparm
围绕操作系统来测量设备性能就像 CrystalDiskMark 所做的那样。
它在手册页--direct
选项中进行了解释。