【问题标题】:Difference between POSIX AIO and libaio on Linux?Linux 上 POSIX AIO 和 libaio 的区别?
【发布时间】:2012-02-04 18:53:51
【问题描述】:

似乎明白了什么:

POSIX AIO API 原型在 <aio.h> 中,您将程序与 librt(-lrt) 链接,而 libaio API 在 <libaio.h> 中,您的程序与 libaio (-laio) 链接。

我想不通:

1.内核对这两种方法的处理方式不同吗?

2.O_DIRECT 标志是否强制使用它们中的任何一个?

正如this post 中提到的,libaio 在使用libaio 时可以在没有O_DIRECT 的情况下正常工作。好吧,明白但是:

根据 R.Love 的 Linux System Programming 书,Linux 支持 aio(我假设是 POSIX AIO)在常规文件上如果使用O_DIRECT 打开。但是我编写的一个小程序(使用aio.h,与-lrt 链接)在没有O_DIRECT 标志打开的文件上调用aio_write 没有问题。

【问题讨论】:

    标签: linux asynchronous io linux-kernel aio


    【解决方案1】:

    在 linux 上,这两种 AIO 实现是根本不同的。

    POSIX AIO 是一个用户级实现,它在多个线程中执行正常的阻塞 I/O,因此给人一种 I/O 是异步的错觉。这样做的主要原因是:

    1. 它适用于任何文件系统
    2. 它(基本上)可以在任何操作系统上运行(请记住,gnu 的 libc 是可移植的)
    3. 它适用于启用缓冲的文件(即未设置 O_DIRECT 标志)

    主要缺点是您的队列深度(即您在实践中可以拥有的未完成操作的数量)受到您选择拥有的线程数量的限制,这也意味着一个磁盘上的缓慢操作可能会阻塞操作转到另一个磁盘。它还会影响内核和磁盘调度程序看到的 I/O(或数量)。

    内核 AIO(即 io_submit() 等)是对异步 I/O 操作的内核支持,其中 io 请求实际上在内核中排队,按您拥有的任何磁盘调度程序排序,大概其中一些作为异步操作(使用 TCQ 或 NCQ)被转发(以人们希望的某种最佳顺序)到实际磁盘。这种方法的主要限制是并非所有文件系统都可以很好地工作或根本无法使用异步 I/O(并且可能会退回到阻塞语义),必须使用 O_DIRECT 打开文件,这对I/O 请求。如果您无法使用 O_DIRECT 打开文件,它可能仍然“有效”,因为您可以取回正确的数据,但它可能不是异步完成的,而是退回到阻塞语义。

    另外请记住,io_submit() 在某些情况下实际上会阻塞磁盘。

    【讨论】:

    • 感谢您的回复。所以对于 POSIX AIO,O_DIRECT 是不是强制的,但对于内核 AIO,它是(以确保没有后备发生)?这似乎矛盾书中提到了什么。在内核代码中,VFS 有这些 aio_read/write 函数,这些函数被 aio_read/write 系统调用(这是 POXIS AIO 而不是内核 AIO)调用(?)。
    • 没有 aio_* 系统调用 (linux.die.net/man/2/syscalls)。您在 vfs 中看到的 aio_* 函数可能是内核 aio 的一部分。 用户级别 aio_* 函数不会 1:1 映射到系统调用。
    • @Arvid 请您详细说明 io_submit() 在何种情况下阻塞? (你提到有时它可能会阻塞磁盘)
    • 我的理解是块设备层本质上是保证不阻塞的。如果您只关心访问原始磁盘,那没问题。然而,文件系统的实现并不是假设有人可能想要异步使用它们。我测试了 ext4、reiser 和 xfs。 iirc,ext4 是阻塞最多的,但也是最快完成我的基准测试的。搜索 linux-aio 邮件列表会给你很多点击。这是我的:article.gmane.org/gmane.linux.kernel.aio.general/3024/…
    • 有一个非详尽的列表,让io_submit() 阻塞stackoverflow.com/a/46377629/2732969 ...
    猜你喜欢
    • 2020-10-20
    • 2011-10-02
    • 2013-08-23
    • 2010-11-16
    • 2017-06-21
    • 1970-01-01
    • 2011-03-12
    • 2011-04-24
    • 2018-12-31
    相关资源
    最近更新 更多