如何快速将不确定大小的缓冲区写入NVMe SSD

时间:2019-03-27 06:24:35

标签: c++ mmap nvme

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

我当前的问题是数据会无限期地连续写入,因此最终我的RAM不够大,无法承载所有数据,必须将其读出并存储到磁盘中。由于数据量大,写入速度标准很高(1.5G / s)。

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

1 个答案:

答案 0 :(得分:1)

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

如果您想简单一点,最好的选择是使用O_DIRECT文件并使用write syscall或aio。如果希望获得最佳速度,则可以使用SPDK获得对NVMe设备的原始访问权限,而不会干扰内核并具有完全零拷贝的写操作。

SPDK是完全在用户空间中用于NVMe设备的驱动程序。这意味着您使用内核驱动程序将PCIe BAR映射到用户空间,告诉SPDK附加到NVMe设备,现在您可以向该设备发出原始NVMe命令,而无需任何副本。相对于简单的mmap而言,最大的优势在于,您可以完全控制执行哪些IO,一次执行的顺序以及执行中有多少个命令及其大小。这意味着需要为应用程序做更多的工作,但实际上可以为您提供最终的控制和最佳的性能。