Linux 异步 (io_submit) 写入 v/s 正常(缓冲)写入



既然写入是即时的(复制到内核缓冲区并返回),那么使用io_submit进行写入有什么好处?

事实上,它(aio/io_submit)似乎更糟,因为您必须在堆上分配写入缓冲区,并且不能使用基于堆栈的缓冲区。

我的问题只是关于写作,而不是阅读。

编辑:我说的是相对较小的写入(最多几KB),而不是MB或GB,所以缓冲区复制应该不是一个大问题。

缓冲区复制到内核中不一定是即时的。

首先,内核需要找到一个免费的页面。如果没有(这很可能是在沉重的磁盘写入压力下),它必须决定逐出一个。如果它决定逐出脏页(而不是逐出您的进程),它必须先实际编写它,然后才能使用该页面。

Linux 中有一个相关的问题,当写入慢速驱动器饱和时,页面缓存会填满由慢速驱动器支持的脏页。每当内核需要页面时,出于任何原因,都需要很长时间才能获取一个页面,结果整个系统都会冻结。

每次写入的大小不如系统的写入压力相关。如果您已经排队了一百万个小写,这可能是必须阻止的写。

关于分配是存在于堆栈上还是堆上也不太相关。如果要有效地分配要写入的块,则可以使用专用的池分配器(从堆中),而无需为通用堆分配器付费。

aio_write() 通过根本不将缓冲区复制到内核中来解决这个问题,它甚至可以直接从缓冲区中取出 DMAd(考虑到对齐要求),这意味着您也可能保存副本。