新一代异步I/O:io_uring介绍
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支持
- ceph、redis等
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. 同步读写流程
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):
提交队列:submission queue(SQ)
完成队列: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库,简化了使用。
总结
io_uring的开发给Linux编程带来革命性变化,统一了Linux异步接口。
使开发者能更高效地使用Intel Optane等高速介质。
谢谢
参考:
[译] Linux 异步 I/O 框架 io_uring:基本原理、程序示例与性能压测(2020
异步IO引擎——io_uring设计与实现
【io_uring】简介和使用_ywang_wnlo的博客
新一代异步I/O:io_uring介绍相关推荐
- 操作系统与存储:解析Linux内核全新异步IO引擎io_uring设计与实现
作者:draculaqian,腾讯后台开发工程师 引言 存储场景中,我们对性能的要求非常高.在存储引擎底层的IO技术选型时,可能会有如下讨论关于IO的讨论. http://davmac.org/dav ...
- python同步异步_python中Tornado的同步与异步I/O的介绍(附示例)
本篇文章给大家带来的内容是关于python中Tornado的同步与异步I/O的介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 协程是Tornado种推荐的编程方式,使用 ...
- 分布式的,新一代版本控制系统Mercurial的介绍及简要入门
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 分布式的 ...
- 强大易用!新一代爬虫利器 Playwright 的介绍
来源:进击的Coder Playwright 是微软在 2020 年初开源的新一代自动化测试工具,它的功能类似于 Selenium.Pyppeteer 等,都可以驱动浏览器进行各种自动化操作.它的功能 ...
- Centos 异步 IO framework io_uring,基本原理,程序示例与性能压测
尊重原创版权: https://www.conghengx.com/hot/37285.html 更多内容参考: https://www.conghengx.com/ Linux 异步 I/O 框架 ...
- fetch.js php,JavaScript如何使用fetch来完成异步请求的实例介绍
传递信息到服务器,从服务器获取信息,是前端发展的重中之重,尤其是现在前后端分离的大前提下,前后端的数据交互是前端的必修科目了,下面这篇文章主要给大家介绍了关于JavaScript利用fetch实现异步 ...
- python协程异步原理_简单介绍Python的Tornado框架中的协程异步实现原理
Tornado 4.0 已经发布了很长一段时间了, 新版本广泛的应用了协程(Future)特性. 我们目前已经将 Tornado 升级到最新版本, 而且也大量的使用协程特性. 很长时间没有更新博客, ...
- 异步GridView(ASPxGridView) 特点介绍(2) - 筛选(Filter)、弹出编辑(Editing)
这里补充一下 Devexpress 控件的引用方式:先下载安装程序.安装,然后拖动出现在工具栏的相应控件进行引用 -- 非常简单.不过朋友们在学习的过程中记得给那些非免费的产品装上破解补丁(对应您下载 ...
- Android中的AsyncTask异步任务的简单介绍
事件原由: 很多耗时的资源在安卓客户端加载时,必须要开启一个新的线程去操作维护,而如果直接在主线程中加载的话,客户端会直接报出异常,导致程序不能正常使用,而子线程无法直接更新UI,因此客户端提供了 ...
- Node.js 异步编程之 Callback介绍
原文:http://www.jb51.net/article/63070.htm ------------------------------------- Node.js 基于 JavaScript ...
最新文章
- android小技巧(二)
- OpenCVSharp::FindContours 错误:“total()==0||data!=NULL“
- 执行phpize Cannot find config.m4
- springboot配置cxf
- python xlrd使用_python使用xlrd 操作Excel读写
- 51单片机基本刷屏测试实验_基于单片机的发动机振动速度、位移和加速度测量方法...
- 【原创,提供下载】winfrom 打印表格,字符串的封装
- springcloud工作笔记093---springcloud封装按钮权限控制_思路和实现_根据用户拥有的权限控制是否显示某个按钮
- oracle union all 特别慢_Oracle查询性能优化
- 用编译安装搭建自己的http服务器
- c++简单程序实现——小公主养成记
- Discuz! ML远程代码执行(CVE-2019-13956)
- 使用x264压制视频简介
- 如何选择crm客户管理系统
- 哪个手机浏览器可以倍速_手机四款浏览器APP的比较
- 宠物合成养成游戏养猫养牛流量主小程序开发
- iOS中WKWebView清除cookies
- windows11专业工作站版
- Android java.lang.NoSuchMethodError: No virtual method ;or its super classes (declaration of
- 多进程与多线程的区别,和用途
热门文章
- elementui报Deprecation Warning: Using / for division outside of calc() is deprecated and will be remo
- 苹果前华裔工程师窃密被捕;脸书遭罚66.4万美元;小米市值反超京东 | 极客头条...
- 访问学者在英国生活必须要了解的文化差异:
- 如何设置电脑定时提醒?电脑设置定时弹窗提醒方法
- Ubuntu18.04配置tensorflow1.10.0
- 离职跳槽前,要不要先找好下家
- 6-06. 任务调度的合理性(25)(拓扑排序啊 ZJU_PAT)
- 关于密评,这10个问题你一定要知道
- 跨模态行人重识别:Towards a Unified Middle Modality Learning forVisible-Infrared Person Re-Identification阅读笔记
- cad模糊查询符号_SQL实现 模糊查询(转)