与aio_context关联的资源

Pie*_*oid 7 c linux multithreading asynchronous aio

Linux的异步文件IO(AIO)的语义在io_setup(2),io_submit(2)io_getevents(2)的手册页中有详细描述.

但是,如果没有在块IO子系统中潜水,实施的操作方面就不那么清楚了.aio_context分配一个队列,用于将io_events发送回用户空间中的特定客户端.但还有更多吗?

  • 让一个文件按块顺序读取块.是否可以整理请求,尤其是直接IO(DIO)中的请求?如果两个文件的请求交错到一个aio_context怎么办?如果将一个文件的请求发送到两个不同的aio_contexts怎么办?
  • 在上述情况下如何优先处理和安排请求,具有一个或多个aio_contexts?
  • 来自两个aio_contexts的请求是否可能在某个时刻交错?(偶尔会出现超出预期的延迟.)
  • 调用io_submit的线程或CPU会影响它的调度方式吗?是否考虑了包含目标缓冲区的NUMA节点?

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

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

Gos*_*low 1

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

  • 对上下文的请求将传递到内核异步 IO VFS 层。多个文件、多个上下文、多个进程或用户执行请求,所有这些最终都位于同一层。然后,VFS 层将请求发送到相关文件系统或块设备,并且所有常见的排序规则都会自然发生。

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

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

  • 是的,来自不同上下文的请求和正常的读/写调用将交错。

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

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