如何快速将无限大小的缓冲区写入 NVMe SSD

How to quickly write indefinite size buffer to NVMe SSD

我正在开发一个应用程序,其中有大量数据不断写入ram,我试图从ram中快速读取数据,并将其写入NVMe SSD,写入完成后,我重新队列 ram space 以允许它被写入。

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

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

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

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

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