为什么Linux Kernel AIO不支持异步' open'系统调用? 因为' open'可以长时间阻止文件系统,不能吗?
答案 0 :(得分:13)
首先,这是一个非常好的合法问题; downvote是不幸的,它可能推开了比我更有知识的人。
AFAICT,没有良好的原因。你设法挖掘的讨论是相关的,但根本不令人满意(这可能也是你的结论)。虽然Torvald的观点在技术上是正确的,但他们明显地忽略了房间里的大象 - GUI编程 - 以及我确定的许多其他用例。
是的,网络服务器将受到网络延迟的约束。它有点可疑,不应该关心所有其他IO,但我可以接受。
是的,许多服务器工作负载都可以使用dentry / inode缓存,但不是全部,并且总是会丢失。
是的,争论"购买更多内存"作品。我从来没有发现这是一个很好的论据。
然后是所有其他用例。对于许多人来说,包括GUI编程,我们有时或很多都不会阻止它们;我们永远不应该阻止。如果访问模式非常随机且时间较长,那么购买更多RAM也不会有任何帮助 - 缺少与二级存储提供的容量相同的容量。
无论如何它应该是快速的想法"也错了;始终考虑远程文件系统。
唯一令人信服的一点是:
简短而甜蜜:" aio_open()"基本上绝不应该是一个 问题。如果是,您错误设计了某些内容,或者您也在尝试 该死的很难单线程一切(和#34;隐藏"线程 只需调用它即可发生 " AIO"相反 - 简而言之,对自己说谎。
这里的要点正是为了避免线程,所以这句话让我感到惊讶。其他论点甚至被列举的事实告诉我,这个论点太脆弱而无法自立。
在同一个讨论中,你可以找到Mikulas Patocka的这篇文章:
您可以使用FreeBSD和。等内核线程模拟异步IO 一些商业联合会做的,但你仍然需要尽可能多的(可能 内核)线程尽可能多的请求服务。
(...)
制作真正的异步IO需要重写所有文件系统和 整个VFS _from_scratch_。它不会发生。
http://lkml.iu.edu//hypermail/linux/kernel/0102.1/0074.html
这听起来像是一个正确的解释,但显然不是一个好的解释。
请记住,这是一个旧线程,从那以后发生了很多变化,所以这个答案的价值很小。但是,它可以提供有关假设aio_open
历史上 的原因的见解。此外,要了解许多内核讨论(或任何项目的内部讨论)通常期望所有参与者都从一系列假设开始。因此,完全有可能我没有以正确的方式看待这一点。
话虽如此,这一点很有意思(Stephen C. Tweedie):
啊,但即使是VMS SYS $ QIO也是同步进行打开,分配 IO请求数据包,以及将文件位置映射到磁盘块。只要 数据IO始终是异步的(而且Linux提供的Ben的async IO东西 那也是。
http://lkml.iu.edu//hypermail/linux/kernel/0102.1/0139.html
为什么有趣?因为它强化了许多不同系统不能异步实现open
(以及其他调用)的概念。此外,POSIX未指定aio_open
,我找不到解释原因的讨论。 Windows似乎也忽略了这个问题。
似乎这个概念固有的东西是错误的或困难的,除非似乎没有人为最终的原因做好准备。
我的猜测是,这只是低优先级,而且一直都是。据推测,预先包含线程或打开文件的变通方法足以满足足够的用例 - 提供功能的工作永远不会被证明是合理的。
了解为什么POSIX没有定义这样的呼叫会很有趣。我希望"超出范围"理由虽然。
如果你想深究这一点,我怀疑你必须把讨论带到更合适的渠道,比如LKML。
答案 1 :(得分:0)
我写了一个相当简单但功能强大的cpaio C实用程序,它使用Linux本机aio + O_DIRECT(io_submit,io_getevents)复制了一堆文件。我只是尽早使它打开文件,将初始aio读取排队,只有打开足够多的文件(或者如果足够少则全部读取)后,才去寻找读取结果。能够异步打开文件本来很好,但是最后没什么大不了的。
我已经使用此工具复制了数十TB。
最后,我认为没有异步打开是有意义的。这是一个复杂的操作,内核从本质上讲必须触发一个线程来处理它。