Linux 异步API:io_uring介绍


io_uring:

高性能异步I/O框架

  • 能显著提高IO密集型应用的性能。

  • linux5.1内核正式引入,取缔传统的AIO。

  • 作者Jens Axboe也是CFQ、Noop、Deadline、Fio等的作者

  • 性能接近SPDK,并支持buffer IO



应用

一些项目开始做尝试性应用:

  • RocksDb实现了MultiRead(),使用io_uring进行批量下发读io。
  • TiKV扩展了WAL、SSTable等写入使用io_uring。
  • SPDK在通用块层加入了io_uring支持
  • cephredis

linux io系统调用发展历程

(同步接口:)

➔ read(2)/write(2)

➔ pread(2)、readv(2)、preadv(2)、preadv2(2)

(异步接口:)

➔ aio_read(2)/aio_write(2)

➔ io_uring since Linux Kernel 5.1


1. 同步读写流程

#mermaid-svg-I0d2DJdQmRURsGqZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-I0d2DJdQmRURsGqZ .error-icon{fill:#552222;}#mermaid-svg-I0d2DJdQmRURsGqZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-I0d2DJdQmRURsGqZ .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-I0d2DJdQmRURsGqZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-I0d2DJdQmRURsGqZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-I0d2DJdQmRURsGqZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-I0d2DJdQmRURsGqZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-I0d2DJdQmRURsGqZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-I0d2DJdQmRURsGqZ .marker.cross{stroke:#333333;}#mermaid-svg-I0d2DJdQmRURsGqZ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-I0d2DJdQmRURsGqZ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-I0d2DJdQmRURsGqZ .cluster-label text{fill:#333;}#mermaid-svg-I0d2DJdQmRURsGqZ .cluster-label span{color:#333;}#mermaid-svg-I0d2DJdQmRURsGqZ .label text,#mermaid-svg-I0d2DJdQmRURsGqZ span{fill:#333;color:#333;}#mermaid-svg-I0d2DJdQmRURsGqZ .node rect,#mermaid-svg-I0d2DJdQmRURsGqZ .node circle,#mermaid-svg-I0d2DJdQmRURsGqZ .node ellipse,#mermaid-svg-I0d2DJdQmRURsGqZ .node polygon,#mermaid-svg-I0d2DJdQmRURsGqZ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-I0d2DJdQmRURsGqZ .node .label{text-align:center;}#mermaid-svg-I0d2DJdQmRURsGqZ .node.clickable{cursor:pointer;}#mermaid-svg-I0d2DJdQmRURsGqZ .arrowheadPath{fill:#333333;}#mermaid-svg-I0d2DJdQmRURsGqZ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-I0d2DJdQmRURsGqZ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-I0d2DJdQmRURsGqZ .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-I0d2DJdQmRURsGqZ .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-I0d2DJdQmRURsGqZ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-I0d2DJdQmRURsGqZ .cluster text{fill:#333;}#mermaid-svg-I0d2DJdQmRURsGqZ .cluster span{color:#333;}#mermaid-svg-I0d2DJdQmRURsGqZ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-I0d2DJdQmRURsGqZ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

device
kernel
user
Buffer IO
Direct IO
设备
Page Cache
VFS: vfs_read()
文件系统
块IO层
read()

1. 同步读写流程

  • 发出IO后,程序进入sleep状态,直到IO操作完成

  • 可想,随着存储设备越来越快,程序越来越复杂,该阻塞方式不够用了。


2. 异步IO:aio

  • aio实现了一套异步IO框架(since linux 2.5)。

  • 相对同步阻塞IO,提高了性能。

2. 异步IO:aio

但是!

aio一直被认为难以使用效率低下

  • 只支持Direct IO。不支持Buffer IO,对大部分常规应用无用处。
  • 部分内部实现仍然会阻塞。
  • 未考虑扩展性,改动极其复杂。

3. io_uring

解决了aio的问题,统一了接口。

  • 真正异步,不会发生阻塞。
  • 支持所有IO模式。
  • 支持轮询模式(poller)等高级特性,针对不同场景,性能更好。
  • 灵活、可扩展。

io_uring基本原理

  • 每个io_uring有两个环形队列(ring),app和kernel共享,(类似NVMe):

    1. 提交队列:submission queue(SQ

    2. 完成队列:completion queue(CQ


使用ring buffer(SQ、CQ)好处

  • 省去应用和内核间的内存拷贝。

  • 无锁操作,通过几个简单头尾指针移动就能完成交互。

  • 内核轮询模式下,无需系统调用。

    ​ 内核线程轮询处理SQ,应用只需监控CQ即可。


使用

三个系统调用
  • io_uring_setup(2):设置上下文,创建SQ、CQ等
  • io_uring_register(2):注册文件、缓存区
  • io_uring_enter(2):初始化和完成IO,支持很多操作

使用起来还是比较复杂,Jens Axboe提供了封装好的liburing库,简化了使用。


总结


谢谢

参考:

[译] Linux 异步 I/O 框架 io_uring:基本原理、程序示例与性能压测(2020

异步IO引擎——io_uring设计与实现

【io_uring】简介和使用_ywang_wnlo的博客

新一代异步I/O:io_uring介绍相关推荐

  1. 操作系统与存储:解析Linux内核全新异步IO引擎io_uring设计与实现

    作者:draculaqian,腾讯后台开发工程师 引言 存储场景中,我们对性能的要求非常高.在存储引擎底层的IO技术选型时,可能会有如下讨论关于IO的讨论. http://davmac.org/dav ...

  2. python同步异步_python中Tornado的同步与异步I/O的介绍(附示例)

    本篇文章给大家带来的内容是关于python中Tornado的同步与异步I/O的介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 协程是Tornado种推荐的编程方式,使用 ...

  3. 分布式的,新一代版本控制系统Mercurial的介绍及简要入门

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 分布式的 ...

  4. 强大易用!新一代爬虫利器 Playwright 的介绍

    来源:进击的Coder Playwright 是微软在 2020 年初开源的新一代自动化测试工具,它的功能类似于 Selenium.Pyppeteer 等,都可以驱动浏览器进行各种自动化操作.它的功能 ...

  5. Centos 异步 IO framework io_uring,基本原理,程序示例与性能压测

    尊重原创版权: https://www.conghengx.com/hot/37285.html 更多内容参考: https://www.conghengx.com/ Linux 异步 I/O 框架 ...

  6. fetch.js php,JavaScript如何使用fetch来完成异步请求的实例介绍

    传递信息到服务器,从服务器获取信息,是前端发展的重中之重,尤其是现在前后端分离的大前提下,前后端的数据交互是前端的必修科目了,下面这篇文章主要给大家介绍了关于JavaScript利用fetch实现异步 ...

  7. python协程异步原理_简单介绍Python的Tornado框架中的协程异步实现原理

    Tornado 4.0 已经发布了很长一段时间了, 新版本广泛的应用了协程(Future)特性. 我们目前已经将 Tornado 升级到最新版本, 而且也大量的使用协程特性. 很长时间没有更新博客, ...

  8. 异步GridView(ASPxGridView) 特点介绍(2) - 筛选(Filter)、弹出编辑(Editing)

    这里补充一下 Devexpress 控件的引用方式:先下载安装程序.安装,然后拖动出现在工具栏的相应控件进行引用 -- 非常简单.不过朋友们在学习的过程中记得给那些非免费的产品装上破解补丁(对应您下载 ...

  9. Android中的AsyncTask异步任务的简单介绍

    事件原由: 很多耗时的资源在安卓客户端加载时,必须要开启一个新的线程去操作维护,而如果直接在主线程中加载的话,客户端会直接报出异常,导致程序不能正常使用,而子线程无法直接更新UI,因此客户端提供了   ...

  10. Node.js 异步编程之 Callback介绍

    原文:http://www.jb51.net/article/63070.htm ------------------------------------- Node.js 基于 JavaScript ...

最新文章

  1. android小技巧(二)
  2. OpenCVSharp::FindContours 错误:“total()==0||data!=NULL“
  3. 执行phpize Cannot find config.m4
  4. springboot配置cxf
  5. python xlrd使用_python使用xlrd 操作Excel读写
  6. 51单片机基本刷屏测试实验_基于单片机的发动机振动速度、位移和加速度测量方法...
  7. 【原创,提供下载】winfrom 打印表格,字符串的封装
  8. springcloud工作笔记093---springcloud封装按钮权限控制_思路和实现_根据用户拥有的权限控制是否显示某个按钮
  9. oracle union all 特别慢_Oracle查询性能优化
  10. 用编译安装搭建自己的http服务器
  11. c++简单程序实现——小公主养成记
  12. Discuz! ML远程代码执行(CVE-2019-13956)
  13. 使用x264压制视频简介
  14. 如何选择crm客户管理系统
  15. 哪个手机浏览器可以倍速_手机四款浏览器APP的比较
  16. 宠物合成养成游戏养猫养牛流量主小程序开发
  17. iOS中WKWebView清除cookies
  18. windows11专业工作站版
  19. Android java.lang.NoSuchMethodError: No virtual method ;or its super classes (declaration of
  20. 多进程与多线程的区别,和用途

热门文章

  1. elementui报Deprecation Warning: Using / for division outside of calc() is deprecated and will be remo
  2. 苹果前华裔工程师窃密被捕;脸书遭罚66.4万美元;小米市值反超京东 | 极客头条...
  3. 访问学者在英国生活必须要了解的文化差异:
  4. 如何设置电脑定时提醒?电脑设置定时弹窗提醒方法
  5. Ubuntu18.04配置tensorflow1.10.0
  6. 离职跳槽前,要不要先找好下家
  7. 6-06. 任务调度的合理性(25)(拓扑排序啊 ZJU_PAT)
  8. 关于密评,这10个问题你一定要知道
  9. 跨模态行人重识别:Towards a Unified Middle Modality Learning forVisible-Infrared Person Re-Identification阅读笔记
  10. cad模糊查询符号_SQL实现 模糊查询(转)