Linux async IO的状态?

时间:2010-10-11 18:07:54

标签: linux asynchronous io

我在这里问,因为谷歌搜索引导你在档案馆的愉快旅行,没有暗示当前的状态。如果你去谷歌,似乎异步IO在2001年至2003年风靡一时,到2006年,epolllibaio之类的东西出现了; kevent出现了,但似乎已经消失了,据我所知,仍然没有良好的方式来混合基于完成和基于就绪的信令,异步sendfile - 甚至可能吗? - 以及单线程事件循环中的所有其他内容。

所以请告诉我我错了,这一切都很美好! - 而且,重要的是,使用什么API。

Linux在这方面与FreeBSD和其他操作系统相比如何?

4 个答案:

答案 0 :(得分:4)

AIO本身仍然有些局限,并且开始时真的很痛苦,但是一旦你挖掘它,它在很大程度上都有效。

我认为它有一些严重的错误,但这些都是真正的功能。例如,在提交一定数量的命令或数据时,您的提交线程将被阻止。我不记得这个功能的确切理由,但我当时回复的回答是“当然,内核对其队列大小有限制,这是预期的”。如果您提交几千个请求,这是可以接受的......显然,某处必须有限制。从DoS的角度来看也可能是有意义的(否则恶意程序会通过发布十亿个请求来强制内核耗尽内存)。但是,它仍然是你可以逼真地遇到“正常”数字(一百个左右)的东西,它会意外地打击你,这是不好的。另外,如果你只提交了6个左右的请求并且它们有点大(几兆字节的数据)同样可能发生,显然是因为内核在子请求中将它们分解。这也是有道理的,但是看到文档没有告诉你的情况,人们应该预期,无论你读取500字节还是50兆字节的数据,它都没有区别(除了花费更长时间)。

此外,似乎没有办法做缓冲AIO,至少在我的任何Debian和Ubuntu系统上都没有(尽管我看到其他人抱怨完全相反,即实际上通过缓冲区进行无缓冲写入) 。从我在我的系统上可以看到的情况来看,AIO实际上只是异步关闭缓冲,这是一个耻辱(这就是为什么我现在使用围绕内存映射和工作线程的丑陋构造)。

任何异步的一个重要问题是能够在其上使用epoll_wait(),这对于除磁盘IO之外的任何其他操作(例如接收网络流量)非常重要。当然有io_getevents,但它不是那么令人满意/有用,因为它只适用于一个单一的东西。

在最近的内核中,支持 eventfd 。乍一看,它似乎毫无用处,因为它在任何方面都不会有什么帮助。 但是,为了您的救援,还有未记录的函数 io_set_eventfd ,它允许您将AIO与eventfd关联,后者是epoll_wait()。你必须深入了解标题才能找到它,但它肯定存在,并且它的工作正常。

答案 1 :(得分:3)

异步光盘IO还活着......实际上它支持并且现在工作得相当好,但是有很大的局限性(但是有足够的功能,一些主要用户可以有效地使用它 - 例如MySQL的Innodb在最新版本。)

异步磁盘IO能够以非阻塞方式(在单个线程中)调用磁盘IO操作并等待它们完成。这很好,http://lse.sourceforge.net/io/aio.html有更多信息。

AIO足以让典型的应用程序(数据库服务器)能够使用它。 AIO是创建大量执行同步IO的线程,或者在现有系统调用的preadv系列中使用分散/聚集的一个很好的替代方法。

可以使用newish preadv调用执行“购物清单”同步IO作业,其中内核将从文件中的不同偏移获取一堆页面。只要您只有一个文件可供阅读,这就没问题。 (注意:存在等效写入功能)。

民意调查,epoll等,只是花费较少的限制和可扩展性问题的select()方式 - 它们可能无法轻易地与光盘aio混合,但在实际应用中,你可能通过使用线程相当简单地解决这个问题(一些数据库服务器倾向于在不同的线程中进行这些类型的操作)。对于大量的文件描述符,Poll()很好,epoll更好。 select()对于少量文件描述符(或者特别是低文件描述符号)也是可以的。

答案 2 :(得分:2)

我在Linux中学到的关于异步I / O的大部分内容都是基于Lighttpd源代码。它是一个单线程Web服务器,可以处理许多同时连接,使用它认为运行系统上可用的任何异步I / O机制中最好的连接。看看源代码,它支持Linux,BSD和(我认为)其他一些操作系统。

答案 3 :(得分:2)

(在提出原始问题近十年后的2019年底,一线希望)

如果您拥有5.1或更高版本的Linux内核,则可以使用io_uring interface,它有望为Linux带来更好的异步I / O未来(请参阅关于堆栈溢出问题{{3}的答案之一) } "Is there really no asynchronous block I/O on Linux?")。希望这将使Linux为FreeBSD的异步AIO benefits io_uring provides over KAIO提供激烈的竞争!