我们应该如何解释cfq-iosched.txt中的短语“异步请求”?

我们应该如何解释cfq-iosched.txt中的短语“异步请求”?

老人cfq-iosched.txt在几个地方提到“异步”或“异步”请求。

CFQ 为请求 I/O 操作(同步请求)的进程维护每个进程的队列。对于异步请求,来自所有进程的所有请求将根据其进程的 I/O 优先级一起批处理。

从用户空间的角度来看,我们到底应该如何理解本文档中的区别?我不清楚,因为有几个称为同步/异步的区别:

  1. 正常read()/write()调用,与 Linux AIO (io_submit()/io_getevents)。
  2. 标志O_SYNC,可以在您设置时设置open()一份文件。

(请注意,据我了解,上面关于 IO 优先级的引用不适用于简单的缓冲写入。 IO 优先级对此类请求没有影响。)

答案1

Linux IO 调度程序处理的请求形式有各种“提示”设置。其中之一是“同步”提示。

在 Linux 中所有 IO 都是异步处理的。这对于后台写入来说很好,但是对于有人等待完成的读取或写入,我们希望通知块层和 IO 调度程序,以便他们知道这一点。这使他们能够做出更好的调度决策。因此,当下面引用“sync”和“async”时,它正在引用此优先级提示。

--包含/linux/fs.h(2016-11-01)

读取请求始终被视为同步。

块:不要在 READ_SYNC 定义中使用 REQ_SYNC(2016-11-01)

读取根据定义是同步的,不要为其添加另一个标志。

O_DIRECT和写入都O_SYNC被视为同步。

#define READ_SYNC       0
#define WRITE_SYNC      (REQ_SYNC | REQ_NOIDLE)
#define WRITE_ODIRECT   REQ_SYNC

fsync()使用与写入相同的提示发起 IO 请求O_SYNC。虽然如果IO请求已经发起并且fsync()必须等待现有的请求,但我看不到调整请求的机制。

回复:尝试了解 READ_META、READ_SYNC、WRITE_SYNC 等(2010)

但这留下了一个问题,为什么为了数据完整性而禁用空闲逻辑 ->writepage 就可以了?这会从 ->fsync 或 O_SYNC 写入中调用,并且与 O_DIRECT 写入具有相同的影响。

我们从未为这些启用空转。 O_SYNC 也应该得到很好的提升,它只需要进行基准测试和测试,然后就没有理由不添加它。

我们去年才开始在提交 a64c8610bd3b 的 ->writepage 中使用任何类型的同步标记 “block_write_full_page:对 WBC_SYNC_ALL 写回使用同步写入”

“禁用空闲”是一个不同的提示标志,这有点难以解释。但上面引用中链接的提交确认了 WRITE_SYNC 提示的使用fsync()

上面引用的代码已被移动或替换,但“sync”提示的使用在 2018 年应该与 2016 年相同。

所以我认为请求是否使用 Linux AIO 发出并不重要。

我注意到 AIO 仅支持 O_DIRECT,因此从 IO 调度程序的角度来看,所有 AIO 都应该是“同步”的:-)。至少从 v4.20 开始。这提议的新 AIO 接口支持缓冲(非 O_DIRECT)IO。这将执行与上面相同的代码,因此提示仍将根据是否使用 O_SYNC 来设置。

sync_file_range()旨在允许触发异步写回。当前的实现(Linux v4.20)REQ_SYNC通过使用写回模式来避免设置WB_SYNC_NONE。即使您的程序通过包含该标志来等待写回,情况也是如此SYNC_FILE_RANGE_WAIT_AFTER。但是,v2.6.29 和 v4.4 之间的内核使用不正确WB_SYNC_ALL,因此REQ_SYNC对于sync_file_range().

相关内容