【问题标题】:How to quickly write indefinite size buffer to NVMe SSD如何快速将无限大小的缓冲区写入 NVMe SSD
【发布时间】:2019-08-17 15:44:21
【问题描述】:

我正在开发一个应用程序,其中我有大量数据不断写入 ram,我正在尝试快速从 ram 中读取数据,并将其写入 NVMe SSD,写入完成后,我重新排队 ram允许写入的空间。

我目前的问题是数据无限期地连续写入,所以最终我的 RAM 不足以容纳所有数据,它必须被读出并存储到磁盘中。由于数据量大,写入速度标准很高(1.5G/s)。

我经常看到 mmap 被提及以提高 I/O 效率,但主要是读取效率,因为它可以防止将大数据复制到 DRAM。所以我想在我的用例中,使用 mmap 将我的 SSD 直接映射为虚拟内存并直接写入它是否比标准 fwrite 更快?

【问题讨论】:

  • 试试看。仔细分别对您运营的各个方面进行基准测试,然后将它们放在一起。请注意,如果您以 1.5GB/s 的速度连续无限地写入,您不仅会耗尽 RAM,还会耗尽磁盘...

标签: c++ mmap nvme


【解决方案1】:

使用 mmap 进行写入的问题是您不知道写入何时完成甚至开始,这可能会增加驱动器必须对 LBA 执行的写入次数,因为内存已写入但未完整写入4KB chunk,写到磁盘,然后数据再次写入内存,现在需要再次写入页面。

如果您想简单,最好的办法是使用 O_DIRECT 文件并使用 write 系统调用或 aio。如果您想获得最佳速度,您可以使用 SPDK 获得对 NVMe 设备的原始访问权限,而无需内核干扰并实现完全零拷贝写入。

SPDK 是完全在用户空间中的 NVMe 设备驱动程序。这意味着您使用内核驱动程序将 PCIe BAR 映射到用户空间,告诉 SPDK 附加到 NVMe 设备,现在您可以向设备发出原始 NVMe 命令而无需任何副本。与简单的 mmap 相比,最大的优势是您可以完全控制 IO 的完成方式、顺序以及一次执行的命令数量及其大小。这意味着应用程序需要做更多的工作,但它确实为您提供了终极控制和最佳性能。

【讨论】:

  • 嗨,Baruch,我经常听到有人和 SPDK 交谈,SPDK 提供的具体角色是什么?它的底层是使用 mmap 访问 NVMe 设备并将其映射到用户空间吗?如果是这样,使用 SPDK 而不是仅仅调用 mmap 有什么好处?
  • SPDK 实际上将 PCI BAR 映射到用户空间,然后直接与硬件通信 NVMe 协议,而无需切换到内核,因此您消除了很多系统调用切换延迟并可以获得原始性能,您还消除所有内存副本以获得额外的好处。代价是您获得了对驱动器的独占访问权,并且没有其他人可以并行使用它,并且您失去了文件系统组织,需要在磁盘数据上实现您自己的顺序。
猜你喜欢
  • 2012-07-18
  • 2014-09-29
  • 2013-08-12
  • 1970-01-01
  • 2012-02-06
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
相关资源
最近更新 更多