【问题标题】:Linux async (io_submit) write v/s normal (buffered) writeLinux 异步(io_submit)写入与正常(缓冲)写入
【发布时间】:2013-10-25 11:49:27
【问题描述】:

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

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

我的问题只是关于写入,而不是读取。

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

【问题讨论】:

    标签: linux unix aio


    【解决方案1】:

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

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

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

    每个单独写入的大小与系统的写入压力无关。如果你有一百万个小写已经在排队,这可能是必须阻止的。

    关于分配是在栈上还是堆上也不太重要。如果您想要高效地分配要写入的块,您可以使用专用池分配器(来自堆),而无需为通用堆分配器付费。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多