与 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 中的特定客户端。但是还有更多吗?
- 假设一个文件逐块顺序读取。可以整理请求,尤其是直接 IO (DIO) 中的请求吗?如果对两个文件的请求交织成一个 aio_context 怎么办?如果对一个文件的请求被发送到两个不同的 aio_context 怎么办?
- 在上述情况下,一个或多个 aio_context 如何对请求进行优先级排序和安排?
- 来自两个 aio_context 的请求是否有可能在某个时候交错? (偶尔会出现比预期更多的搜索延迟。)
- 线程或 CPU 调用 io_submit 会影响它的调度方式吗?是否考虑了包含目标缓冲区的 NUMA 节点?
更广泛地说,应向哪些硬件资源(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,那么提交的所有内容将同时完成。
Linux 的异步文件 IO (AIO) 的语义在 io_setup(2), io_submit(2) and io_getevents(2) 的手册页中有很好的描述。
但是,如果不深入了解块 IO 子系统,实施的操作方面就不太清楚了。 aio_context 分配一个队列,用于将 io_events 发送回 user-space 中的特定客户端。但是还有更多吗?
- 假设一个文件逐块顺序读取。可以整理请求,尤其是直接 IO (DIO) 中的请求吗?如果对两个文件的请求交织成一个 aio_context 怎么办?如果对一个文件的请求被发送到两个不同的 aio_context 怎么办?
- 在上述情况下,一个或多个 aio_context 如何对请求进行优先级排序和安排?
- 来自两个 aio_context 的请求是否有可能在某个时候交错? (偶尔会出现比预期更多的搜索延迟。)
- 线程或 CPU 调用 io_submit 会影响它的调度方式吗?是否考虑了包含目标缓冲区的 NUMA 节点?
更广泛地说,应向哪些硬件资源(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,那么提交的所有内容将同时完成。