gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:17:34 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

关于c++ - 如何快速将无限大小的缓冲区写入 NVMe SSD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55371030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com