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

问题描述 投票:0回答:1

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

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

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

c++ mmap nvme
1个回答
2
投票

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

如果您想要简单,最好的办法是使用O_DIRECT文件并使用write syscall或aio。如果您希望获得最佳速度,则可以使用SPDK获取NVMe设备的原始访问权限,而无需内核干扰并具有完全零拷贝写入。

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

© www.soinside.com 2019 - 2024. All rights reserved.