相关文章推荐
着急的杨桃  ·  部署并连接到 SQL Server ...·  3 月前    · 
大鼻子的双杠  ·  Linux编译安装Python3.9——以C ...·  2 月前    · 
旅途中的小笼包  ·  使用 bcp 工具進行大量複製 - SQL ...·  2 月前    · 
聪明的柚子  ·  WSL 的基本命令 | Microsoft ...·  1 月前    · 
温文尔雅的野马  ·  Android drawable绘制虚线 ...·  2 年前    · 
性感的小摩托  ·  python - ...·  3 年前    · 
健壮的眼镜  ·  Python CGI ...·  3 年前    · 
胆小的冰淇淋  ·  从发现到优化,解决性能问题通用思路_Quer ...·  3 年前    · 
性感的佛珠  ·  oracle如何拆分以逗号分隔的字符串为多行 ...·  3 年前    · 
Code  ›  Linux 5.1内核AIO 的新归宿:io_uring - 云+社区 -
aio linux社区 linux系统
https://cloud.tencent.com/developer/article/1458912
15328076128
4 年前
腾讯云
备案 控制台
云+社区
  • 专栏
  • 视频
  • 精选
  • 问答
  • 沙龙
  • 云+竞赛
  • 实验室
  • 团队主页
  • 开发者手册
  • 腾讯云TI平台
  • TVP
搜索
创作
  • 写文章
  • 发视频
提问
登录 注册
展开

腾讯云·社区

登录

云+社区

  • 首页
  • 专栏
  • 视频
  • 精选
  • 问答
  • 沙龙
  • 云+竞赛
  • 团队主页
  • 开发者手册
  • 腾讯云TI平台
  • TVP
返回腾讯云官网

Linux阅码场

320 篇文章

Linux 5.1内核AIO 的新归宿:io_uring

专栏首页 LINUX阅码场 Linux 5.1内核AIO 的新归宿:io_uring
4 0
分享
  • 分享文章到朋友圈

  • 分享文章到 QQ
  • 分享文章到微博
  • 复制文章链接到剪贴板

海报分享

Linux 5.1内核AIO 的新归宿:io_uring

2019-07-08 2019-07-08 14:41:51 阅读 1.9K 0

作者/公司介绍

@panic,SmartX 存储研发工程师。

SmartX是中国领先的超融合产品与企业云解决方案提供商,拥有国内最顶尖的分布式存储和超融合架构研发团队,在分布式存储、虚拟化计算、微服务、容器、前端开发、自动化测试等领域都做着行业最前沿的实践。

在正文开始之前,我们先来看一段对话(演绎版本)

Jens Axboe :Linus,我有个好东西,你瞅瞅? Linus:啥玩意儿,不是已经有 aio 了么,为啥又来一套,你咋不去好好修 aio 的问题。aio 还有 balabala 问题没有修呢。 Jens Axboe :我这个 DIAO 啊,balabala Linus :看你诚意这么足,那行吧,我先收到我的 tree 下,不 push out 出去,让我测测先。 【不一会儿】 Linus :你这 IO 引用计数写的辣鸡,一看就有问题,去改吧。 ……

背景

Linus 和 Jens 在讨论的,就是 Linux Kernel 即将在 5.1 版本加入一个重大 feature:io_uring。

对做存储的来说,这是一个大事情,值得普大喜奔,广而告之。libaio 即将埋入黄土,io_uring 拔地而起。

一句话总结 io_uring 就是:一套全新的 syscall,一套全新的 async API,更高的性能,更好的兼容性,来迎接高 IOPS,高吞吐量的未来。

先看一下性能数据(数据来自 Jens Axboe)。

4k randread,3D Xpoint 盘:

Interface       QD      Polled          Latency         IOPS
--------------------------------------------------------------------------
io_uring        1       0                9.5usec         77K
io_uring        2       0                8.2usec        183K
io_uring        4       0                8.4usec        383K
io_uring        8       0               13.3usec        449K
libaio          1       0                9.7usec         74K
libaio          2       0                8.5usec        181K
libaio          4       0                8.5usec        373K
libaio          8       0               15.4usec        402K
io_uring        1       1                6.1usec        139K
io_uring        2       1                6.1usec        272K
io_uring        4       1                6.3usec        519K
io_uring        8       1               11.5usec        592K
spdk            1       1                6.1usec        151K
spdk            2       1                6.2usec        293K
spdk            4       1                6.7usec        536K
spdk            8       1               12.6usec        586K

io_uring vs libaio,在非 polling 模式下,io_uring 性能提升不到 10%,好像并没有什么了不起的地方。

然而 io_uring 提供了 polling 模式。在 polling 模式下,io_uring 和 SPDK 的性能非常接近,特别是高 QueueDepth 下,io_uring 有赶超的架势,同时完爆 libaio。

测试 per-core,4k randread 多设备下的最高 IOPS 能力:

Interface       QD      Polled          IOPS
--------------------------------------------------------------------------
io_uring        128     1               1620K
libaio          128     0                608K
spdk            128     1               1739K

最近几年一直流行 kernel bypass,从网络到存储,各个领域开花,内核在性能方面被各种诟病。io_uring 出现以后,算是扳回一局。

io_uring 有如此出众的性能,主要来源于以下几个方面:

  • 用户态和内核态共享提交队列(submission queue)和完成队列(completion queue)
  • IO 提交和收割可以 offload 给 Kernel,且提交和完成不需要经过系统调用(system call)
  • 支持 Block 层的 Polling 模式
  • 通过提前注册用户态内存地址,减少地址映射的开销

不仅如此,io_uring 还可以完美支持 buffered IO,而 libaio 对于 buffered IO 的支持则一直是被诟病的地方。

io_uring

io_uring 提供了一套新的系统调用,应用程序可以使用两个队列,Submission Queue(SQ) 和 Completion Queue(CQ) 来和 Kernel 进行通信。这种方式类似 RDMA 或者 NVMe 的方式,可以高效处理 IO。

syscall
425        io_uring_setup
426        io_uring_enter
427        io_uring_register

io_uring 准备阶段

io_uring_setup 需要两个参数,entries 和 io_uring_params。

其中 entries,代表 queue depth。

io_uring_params 的定义如下。

struct io_uring_params {
	__u32 sq_entries;
	__u32 cq_entries;
	__u32 flags;
	__u32 sq_thread_cpu;
	__u32 sq_thread_idle;
	__u32 resv[5];
	struct io_sqring_offsets sq_off;
	struct io_cqring_offsets cq_off;
struct io_sqring_offsets {
	__u32 head;
	__u32 tail;
	__u32 ring_mask;
	__u32 ring_entries;
	__u32 flags;
	__u32 dropped;
	__u32 array;
	__u32 resv1;
	__u64 resv2;
struct io_cqring_offsets {
	__u32 head;
	__u32 tail;
	__u32 ring_mask;
 
推荐文章
着急的杨桃  ·  部署并连接到 SQL Server Linux 容器 - SQL Server | Microsoft Learn
3 月前
大鼻子的双杠  ·  Linux编译安装Python3.9——以CentOS7为例开发者社区
2 月前
旅途中的小笼包  ·  使用 bcp 工具進行大量複製 - SQL Server | Microsoft Learn
2 月前
聪明的柚子  ·  WSL 的基本命令 | Microsoft Learn
1 月前
温文尔雅的野马  ·  Android drawable绘制虚线 android view绘制过程_mob6454cc68310b的技术博客_51CTO博客
2 年前
性感的小摩托  ·  python - flask-bootstrap导航条覆盖文本 - SegmentFault 思否
3 年前
健壮的眼镜  ·  Python CGI 中文乱码_118路司机的博客-CSDN博客
3 年前
胆小的冰淇淋  ·  从发现到优化,解决性能问题通用思路_Queries_业务_public
3 年前
性感的佛珠  ·  oracle如何拆分以逗号分隔的字符串为多行?_oracle按照分隔符拆分行_侠之大者为国为民的博客-CSDN博客
3 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号