与 aio_context 关联的资源

Resources associated to an aio_context

Linux 的异步文件 IO (AIO) 的语义在 io_setup(2), io_submit(2) and io_getevents(2) 的手册页中有很好的描述。

但是,如果不深入了解块 IO 子系统,实施的操作方面就不太清楚了。 aio_context 分配一个队列,用于将 io_events 发送回 user-space 中的特定客户端。但是还有更多吗?

更广泛地说,应向哪些硬件资源(NUMA 节点、CPU 核心、物理驱动器、文件系统和文件)aio_context 分配,以及在哪个粒度级别?

也许这并不重要,aio_contexts 只不过是用户-space 程序的抽象。 我问是因为我观察到同时读取多个文件时性能下降,每个文件都有自己的 aio_context,与手动将块请求循环序列化为单个 aio_context.

  • 您可以在单个上下文中自由混合请求,我会这样做。否则,您必须轮询两个单独的上下文,使系统调用的数量加倍。

  • 对上下文的请求被传递到内核异步 IO VFS 层。多个文件、多个上下文、多个进程或执行请求的用户都在同一层结束。然后 VFS 层将请求发送到相关的文件系统或块设备,所有通常的整理等自然发生。

  • 同时向一个或多个上下文请求同一个文件,如果它们重叠,我认为是未定义的行为。它们可以以一种或另一种方式订购。例如,可以先处理较晚的请求。因此,如果需要严格排序,则需要编写自己的同步。与一个或多个线程并行执行 read/write 调用相同。

  • 优先级和调度将取决于较低层。 Afaik 块设备将重新排序请求,以便它们以增加的块数(电梯代码)发生,以最大限度地减少旋转磁盘上的查找时间。

  • 是的,来自不同上下文的请求和正常的 read/write 调用会交错。

  • 我认为请求进程和NUMA等完全被忽略了。

注意:在处理文件时,确保文件系统支持 linux 异步 IO 挂钩,您可能需要在 open() 上使用 O_DIRECT 及其所有后果。 我发现的一种简单测试方法是在一次 io_submit() 调用中对文件发出大量请求,然后检查所有请求是否同时完成。如果文件系统回退到同步 IO,那么提交的所有内容将同时完成。