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

C++ 如何快速将不确定大小的缓冲区写入NVMe SSD,c++,mmap,nvme,C++,Mmap,Nvme,我正在开发一个应用程序,在这个应用程序中,我有连续写入ram的大数据,我试图快速从ram中读取数据,并将其写入NVMe SSD,写入完成后,我将ram空间重新排队以允许写入 我目前的问题是,数据在无限期内连续写入,因此最终我的RAM不够大,无法容纳所有数据,必须将其读出并存储到磁盘中。由于数据的大小,写入速度标准很高(1.5G/s) 我经常看到人们提到mmap可以提高I/O效率,但主要是读效率,因为它可以防止将大数据复制到DRAM。因此,我想知道在我的使用案例中,使用mmap将我的SSD直接映射

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

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


我经常看到人们提到mmap可以提高I/O效率,但主要是读效率,因为它可以防止将大数据复制到DRAM。因此,我想知道在我的使用案例中,使用mmap将我的SSD直接映射为虚拟内存并直接写入是否比标准的fwrite更快?mmap for write的问题是,您不知道写入何时完成,甚至何时开始,这可能会增加驱动器对LBA的写入次数,因为内存已写入但未写入完整的4KB块中,写入操作已发送到磁盘,然后数据再次写入内存,现在需要再次写入页面

如果您希望它简单,那么最好使用O_直接文件并使用write系统调用或aio。如果您希望获得最佳速度,可以使用SPDK获得对NVMe设备的原始访问,而无需内核干扰和完全零拷贝写入


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

试试看。仔细地分别对运营的各个方面进行基准测试,然后将其结合在一起。请注意,如果以1.5GB/s的速度连续、无限期地写入,不仅会耗尽RAM,还会耗尽磁盘…嗨,巴鲁克,我经常听说有人与SPDK交谈,SPDK提供的确切角色是什么?底层it是否使用mmap访问NVMe设备并将其映射到用户空间?如果是这样,使用SPDK而不是只调用mmap有什么好处?SPDK实际上将PCI条映射到用户空间,然后直接与硬件通信NVMe协议,而无需切换到内核,因此您可以消除大量系统调用切换延迟并获得原始性能,您还可以消除所有内存拷贝以获得额外的好处。其代价是您以独占方式访问驱动器,其他人无法并行使用它,并且您失去了文件系统组织,需要在磁盘数据上实现您自己的命令。