Articles of aio

在Linux上的AIO支持

有没有人知道我可以在哪里得到有关最新的Linux内核上的内核支持aio的状态信息? 谷歌search带来的网页可能是绝望的过时。 编辑: 更具体地说,我感兴趣的是非文件相关的描述符,如pipe道和套接字。 networking上的东西表示没有支持,这是否仍然如此? 编辑2:我正在寻找类似于Windows OVERLAPPED IO

Linux的AIO:可怜的扩展

我正在编写一个使用LinuxasynchronousI / O系统调用的库,并想知道为什么io_submit函数在ext4文件系统上performance出较差的缩放。 如果可能,我可以做些什么来让io_submit不要阻塞大的IO请求大小? 我已经做了以下(如这里所述): 使用O_DIRECT 。 将IO缓冲区alignment到一个512字节的边界。 将缓冲区大小设置为页面大小的倍数。 为了观察内核在io_submit花费了多io_submit ,我运行了一个testing,在该testing中,我使用dd和/dev/urandom创build了1 Gbtesting文件,并重复丢弃了系统caching( sync; echo 1 > /proc/sys/vm/drop_caches )并且读取越来越大的文件部分。 在每次迭代中,我都会打印io_submit所花费的时间以及等待读取请求完成的时间。 我在运行Arch Linux的x86-64系统上运行以下实验,内核版本为3.11。 该机器具有SSD和Core i7 CPU。 第一个graphics绘制了等待io_submit完成所花费的时间。 第二个graphics显示等待读取请求完成的时间。 时间以秒为单位。 为了比较,我创build了一个类似的testing,通过pread使用同步IO。 结果如下: 看起来,asynchronousIO的工作如预期的要求约20,000页的大小。 之后, io_submit块。 这些意见导致了以下问题: 为什么不是io_submit的执行时间是常量? 什么是造成这种不好的缩放行为? 我是否需要将ext4文件系统上的所有读取请求拆分为多个请求,每个请求的大小都小于20,000页? 20,000这个“魔术”价值从哪里来? 如果我在另一个Linux系统上运行我的程序,如何确定使用的最大IO请求大小,而不会遇到缩放行为不佳的情况? 用于testingasynchronousIO的代码如下所示。 如果您认为他们是相关的,我可以添加其他来源列表,但我试图只发布我认为可能相关的细节。 #include <cstddef> #include <cstdint> #include <cstring> #include <chrono> #include <iostream> #include <memory> #include <fcntl.h> #include […]

如何在单个事件循环中一起使用AIO和epoll?

如何将AIO和epoll结合在一个事件循环中? 谷歌在2002年和2003年之间发现了很多关于统一它们的话题,但是如果发生了什么事情,或者如果可能的话,它都不清楚。 有没有人滚动他们自己的epoll循环使用eventfd的AIO信号?

linux内核的aiofunction

我正在testing内核asynchronousio函数(而不是posix aio),并试图找出它是如何工作的。 下面的代码是一个完整的程序,我只需将一个数组重复写入使用O_DIRECT打开的文件。 我在callback函数“write missed bytes expect 1024 got 0”中看到错误(请参阅work_done()中的fprintf语句)。 对于那些不熟悉kernel aio的人来说,下面的代码可以做到以下几点: 初步build立一些结构 准备aio(io_prep_pwrite) 提交io请求(io_submit) 检查事件是否完成(io_getevents) 调用callback函数来查看是否一切正常。 我在步骤5得到一个错误。如果我不打开文件使用O_DIRECT,事情工作正常,但它打败了asynchronous写入的目的。 有人能告诉我我做错了什么吗? 这是内核aio的正确用法,例如,我使用callback是否正确? O_DIRECT的使用是否有任何限制? 我使用'gcc -Wall test.c -laio' 提前致谢。 /* * File: myaiocp.c * Author: kmehta * * Created on July 11, 2011, 12:50 PM * * * Testing kernel aio. * Program creates a 2D matrix and […]

缓冲在Linux上的asynchronous文件I / O

我正在寻找在Linux上执行asynchronous文件I / O的最有效方法。 POSIX glibc实现使用userland中的线程。 本地aio内核API只适用于没有缓冲的操作,为内核添加对缓冲操作的支持的补丁存在,但是那些大于3岁,似乎没有人关心将它们集成到主线。 我发现了很多其他的想法,概念,补丁,可以允许asynchronousI / O,尽pipe其中大部分都是3年以上的文章。 这些在今天的内核中真的有用吗? 我已经阅读了关于servlet,acalls,内核线程的东西以及更多我现在甚至不记得的东西。 什么是在今天的内核做缓冲asynchronous文件input/输出的最有效的方法是什么?

事件驱动和asynchronous之间有什么区别? 在epoll和AIO之间?

事件驱动和asynchronous通常被用作同义词。 两者有什么分别吗? 另外, epoll和aio什么区别? 他们如何融合在一起? 最后,我读过很多次,Linux下的AIO是可怕的。 究竟是如何破碎? 谢谢。