网页上散布着各种描述POSIX AIO设施的页面,其中包含不同的细节.它们都不是最近的.目前还不清楚他们究竟在描述什么.例如,Linux内核异步I/O支持的"官方"(?)网站说套接字不起作用,但我的Ubuntu 8.04.1工作站上的"aio.h"手册页似乎都暗示它适用于任意文件描述符.然后还有另一个项目似乎在图书馆层工作,文档更少.
我想知道:
<aio.h>
似乎有希望?我可以使用的其他多路复用机制非常好,但随处可见的信息碎片让我很好奇.
事件驱动和异步通常用作同义词.这两者有什么不同吗?
另外,epoll
和之间有什么区别aio
?它们如何结合在一起?
最后,我多次读过Linux中的AIO被严重破坏.究竟是怎么破碎的?
谢谢.
使用winsock,您可以将套接字或单独的I/O操作配置为"重叠".这意味着立即返回执行I/O的调用,而实际操作由单独的工作线程异步完成.
Winsock还提供"完成端口".据我所知,完成端口充当句柄(套接字)的多路复用器.如果句柄不在I/O操作的中间,即如果其所有I/O操作都已完成,则可以解复用句柄.
那么,关于我的问题...... linux是否支持完成端口甚至是套接字的异步I/O?
我正在寻找在linux上进行异步文件I/O的最有效方法.
POSIX glibc实现使用userland中的线程.
本机aio内核api仅适用于无缓冲操作,内核补丁用于添加对缓冲操作的支持,但这些补丁已超过3年,似乎没有人关心将它们集成到主线中.
我发现了许多允许异步I/O的其他想法,概念和补丁,尽管其中大多数都是在3年以上的文章中.在今天的内核中真正可用的是什么呢?我已经阅读过有关servlet,acalls,内核线程的内容以及我现在甚至都不记得的更多内容.
在今天的内核中进行缓冲异步文件输入/输出的最有效方法是什么?
我在这里问,因为谷歌搜索引导你在档案馆周围愉快的旅行,没有暗示目前的状态.如果你去谷歌,似乎异步IO在2001年到2003年风靡一时,到2006年,有些东西就像epoll
并且libaio
正在出现; kevent
似乎已经消失了,据我所知,仍然没有好的方法来混合基于完成和基于准备的信号,异步sendfile
- 甚至可能吗? - 以及单线程事件循环中的所有其他内容.
所以请告诉我,我错了,这一切都很美好! - 而且,重要的是,使用什么API.
在这方面,Linux与FreeBSD和其他操作系统相比如何?
根据本教程,可以使用Linux上的AIO轻松实现异步磁盘文件io,至少从编程/ api的角度来看.但是在本教程之前和之后,我已经阅读了很多帖子和文章,这些要么无法完成,要么应该使用带有补丁和其他许多问题的libevent.另一件事是我应该等待信号的循环,但基于本教程,我可以使用回调机制,这显然使AIO更容易使用.
现在,我不是一个Linux程序员甚至由一个长镜头我只是想找到一种简单的方式来支持Linux上的异步磁盘文件IO,学习它,并把它添加到一个异步磁盘IO库,我需要一个个人项目.目前我在非Windows平台上的Windows和io工作线程上使用重叠io.由于mutithreaded解决方案可能很棘手,我想在Linux上用AIO替换它.
那么,本教程中描述的AIO有什么问题?是性能吗?是否可以使用AIO对操作进行限制?
ps我不关心代码是否无法移植到其他POSIX兼容平台,只要它适用于主要的Linux发行版.而我所关心的只是常规磁盘文件io.
谢谢.
我正在试图找出是否mmap
正在使用文件,然后使用madvise()
或posix_madvise()
使用MADV_WILLNEED
/ POSIX_MADV_WILLNEED
实际触发后台异步I/O以进行预读.该手册页madvise
不指定这是否是如此-的实际行为madvise
是左大多不清楚,为了允许执行的灵活性.
但是,当调用madvise()
with 时,任何实际的主流POSIX实现(如Linux)是否实际执行异步文件I/O MADV_WILLNEED
?我似乎无法得到任何关于此的可靠信息. 这个问题表明它至少在Linux上,即使它不理想,因为没有回调机制.
这本书摘录声称posix_fadvise
有POSIX_FADV_WILLNEED
会做异步读取提前,但没有提及是否madvise()
做异步读.
此外,似乎"预读"I/O的整个概念实际上没有任何意义,除非它是异步的.如果它是同步的,它只是让用户应用程序阻止预读,而不是后来实际读取文件时,这似乎不是一个特别强大的优化.
因此,不madvise()
与MADV_WILLNEED
任何主流平台(如Linux)实际做异步预读?
在他有关C#async / await中的线程使用的博客文章(http://blog.stephencleary.com/2013/11/there-is-no-thread.html)中,Stephen Cleary详细介绍了如何不使用线程来处理真正的线程。异步操作,例如文件I / O,Web请求等(从现有线程(例如I / O线程)借来的时间除外)
从该帖子看来,当操作系统为Windows时,BCL似乎将使用重叠的I / O或I / O完成端口将操作传递给操作系统。
我的问题是,是否将相同的“无线程”且非阻塞的异步操作模型应用于其他操作系统(主要是Linux的Mono)的C#实现?
如果是这样,那么BCL与OS进行通信的通道是什么,因为IOCP(和重叠的I / O)似乎是Win32 API所特有的?
另外,据推测,一旦到达驱动程序,无论OS是什么,操作都是异步的?
最近我在不同的论坛上看到了这个。据我阅读一些论坛讨论可以看出,它与输入和输出有关。io_uring 究竟是什么?
我正在寻找有关如何为我在Ubuntu Linux 14.04上运行的应用程序提供高效和高性能异步IO的建议.
我的应用程序处理事务并在磁盘/闪存上创建文件.当应用程序正在进行事务处理时,会创建必须附加到磁盘/闪存上的文件的附加块.应用程序还需要在处理新事务时频繁读取此文件的块.除了还要创建必须附加到此文件的新块之外,每个事务可能还需要从该文件中读取不同的块.有一个传入的事务队列,应用程序可以继续处理队列中的事务,以创建足够深的IO操作管道,以隐藏读取访问的延迟或磁盘或闪存上的写入完成.对于尚未写入磁盘/闪存的块(由先前事务放入写入队列)的读取,应用程序将停止,直到相应的写入完成.
我有一个重要的性能目标 - 应用程序应该产生尽可能低的发布IO操作的延迟.我的应用程序大约需要10微秒来处理每个事务,并准备对磁盘/闪存上的文件发出写入或读取.发出异步读取或写入的额外延迟应尽可能小,以便应用程序可以在每次事务处理时尽可能接近10个usecs,只需要进行文件写入时完成每个事务的处理.
我们正在尝试使用io_submit发出写入和读取请求的实现.我将不胜感激任何有关我们要求的最佳方法的建议或反馈.io_submit会给我们最好的表现以达到我们的目标吗?我应该期望每个写入io_submit的延迟和每个读取io_submit的延迟?
使用我们的实验代码(在2.3 GHz Haswell Macbook Pro,Ubuntu Linux 14.04上运行),我们在扩展输出文件时测量写入io_submit大约50个usecs.这太长了,我们甚至没有接近我们的性能要求.任何帮助我以最小延迟启动写请求的指南都将非常感激.
显然,Linux 已经有了 Asyn-IO (AIO) API。我相信它不是完全异步的。那么 AIO 出了什么问题呢?io_uring 如何克服它?
PS:我尝试阅读https://kernel.dk/io_uring.pdf但无法完全理解,因为我与该语言脱节C
。
linux ×9
asynchronous ×7
aio ×6
io ×3
io-uring ×2
posix ×2
bsd ×1
c ×1
c# ×1
c++ ×1
epoll ×1
event-driven ×1
iocp ×1
latency ×1
linux-kernel ×1
mmap ×1
mono ×1
performance ×1
sockets ×1