首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux内核如何处理异步I/O (AIO)请求?

Linux内核如何处理异步I/O (AIO)请求?
EN

Stack Overflow用户
提问于 2015-03-12 00:10:09
回答 1查看 7.3K关注 0票数 20

我正在编写一个C程序,通过直接从原始块设备文件读取数据从SSD驱动器读取数据。

我正在尝试Linux (我指的是Linux,即linuxaio.h提供的函数,如io_submit(...)等,而不是POSIX )。我使用O_DIRECT标志打开块设备文件,并确保对缓冲区的写入符合块大小。

我注意到Linux比使用同时带有O_DIRECT标志的同步IO要快得多。

最让我惊讶的是,使用Linux对几个KBs进行多个小随机读取所获得的吞吐量非常高,甚至比使用同步I/O和O_DIRECT对少数MBs进行大(顺序)读取的吞吐量还要高。

所以,我想知道:为什么Linux比同步I/O更好?当使用AIO时,内核会做什么?内核是否执行请求重新排序?使用Linux是否比使用同步I/O带来更大的CPU利用率?

提前谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-12 13:23:56

简短的回答:最有可能是AIO实现“更快”,因为它并行提交多个IOs,而同步实现有零个或一个I/O在运行中。它与写入内存无关,也与内核I/O路径无关,同步I/O有额外的开销。

您可以使用iostat -x -d 1检查这一点。查看avgqu(平均队列大小=飞行中I/O的平均数量)和%util (利用率=设备至少发出一个I/O的时间百分比)。

长答案:

  • 在谈论I/O时,“更快”的概念是很棘手的。“更快”是否意味着更高的带宽?还是更低的延迟?还是给定请求大小的带宽?还是在给定队列深度时延迟?还是延迟、带宽、请求大小、队列深度以及许多其他参数或工作负载的组合?在这里,我假设您使用的是吞吐量/带宽,但是最好记住,存储设备的性能不是单维度量。
  • SSD是高度并行的设备。SSD由多个flash芯片组成,每个芯片具有可独立读写的多个芯片。SSD利用这一点,并行执行许多I/O,而没有明显增加响应时间。因此,就吞吐量而言,SSD看到多少并发I/O非常重要。
  • 让我们了解当线程提交同步I/O时会发生什么:( a)线程花费一些CPU周期准备I/O请求(生成数据、计算偏移量、将数据复制到缓冲区等);( b)系统调用被执行(例如,扩展( PCIe)、执行传递到内核空间,以及线程块,c) I/O请求由内核处理&遍历各种内核I/O层,d) I/O请求提交给设备并遍历互连(例如,),e) i/O请求由SSD程序处理,( f)实际读取命令发送到适当的闪存芯片,g) SSD控制器等待数据,h) SSD控制器从闪存芯片获取数据并通过互连发送。在这一点上,数据离开SSD和阶段e-a)在反向发生。
  • 如您所见,同步I/O进程正在与SSD一起播放请求乒乓。在上面描述的许多阶段中,实际上没有从闪存芯片读取任何数据。最重要的是,尽管SSD可以并行处理数十到数百个请求,但它最多在任何给定的时刻都会看到一个请求。因此,吞吐量非常非常低,因为您实际上并没有真正使用SSD。
  • 异步I/O在两方面有所帮助:( a)它允许进程并行提交多个I/O请求( SSD有足够的工作来保持忙碌),以及( b)它允许流水线I/O通过不同的处理阶段(因此,将延迟与吞吐量分离)。
  • 您之所以看到异步I/O比同步I/O更快,是因为您比较了苹果和橙子。同步吞吐量在给定的请求大小、较低的队列深度和没有流水线的情况下进行。异步吞吐量具有不同的请求大小、较高的队列深度和流水线性。你看到的数字是不可比拟的。
  • 大多数I/O密集型应用程序(即大多数应用程序,如数据库、The服务器等)有许多执行同步I/O的线程,尽管每个线程最多可以在任何给定时间提交一个I/O,但是内核& SSD设备会看到许多可以并行处理的I/O请求。多个同步I/O请求与多个异步I/O请求具有相同的好处。 异步I/O和同步I/O之间的主要区别在于I/O& processes调度的方式和编程模型。如果操作正确,异步和同步I/O都可以从存储设备中挤出相同的IOPS/吞吐量。
票数 30
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28999765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档