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

Ben*_*aro 5 unix linux aio

由于写操作无论如何都是立即进行的(复制到内核缓冲区并返回),因此使用io_submit进行写操作有什么好处?

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

我的问题只是写,而不是读。

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

Arv*_*vid 5

将缓冲区复制到内核不一定是瞬时的。

首先,内核需要找到一个空闲页面。如果不存在(很可能在沉重的磁盘写入压力下),则必须决定驱逐其中一个。如果它决定驱逐一个脏页(而不是驱逐您的进程),则必须在使用该页之前实际编写它。

当饱和写入慢速驱动器时,Linux中存在一个相关问题,页面高速缓存将填充慢速驱动器支持的脏页。每当内核需要页面时,无论出于何种原因,获取页面都将花费很长时间,结果整个系统将冻结。

每个单独写入的大小与系统的写入压力无关。如果您已经排队等待一百万次小写操作,那么这可能是必须阻止的写操作。

关于分配是驻留在堆栈上还是堆上也无关紧要。如果要有效分配要写入的块,则可以使用专用的池分配器(来自堆),而不用为通用堆分配器付费。

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