首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试官:io_uring 相比Linux AIO性能提高5%,为什么成为革命性技术?

面试官:io_uring 相比Linux AIO性能提高5%,为什么成为革命性技术?

作者头像
早起的鸟儿有虫吃
发布2025-06-13 14:22:22
发布2025-06-13 14:22:22
3000
举报

各位老师好,这是大厂面试拆解——项目实战系列的第10篇文章。

最近投递简历石沉大海,这个时候更要冷静

我问自己 面试成功第一性原理是什么?

  1. 自然是通过面试官 项目系统设计回答
  2. 死磕系统设计题目,今天不搞明白,一家公司面试不通过,换另外一家公司同样不通过,下一次面试还是不通过。
  3. 面试官都不更换题目这说明行业类就一个问题
  4. 第一性原理 就是自己真正搞懂,而不是考虑市场环境如何。

我问自己 面试策略是什么?

  1. 如果不知道准备什么,先开枪,再瞄准,
  2. 找1-2家公司面一次就知道,这个时候必须复盘总结。
  3. 无数次面试经验告诉我,大部分90%人都 都会被同一个问题问到。为什么总结,忙工作,忙其他 干扰因素很多,甚至自己1个月后自己忘记了。
  4. 把面试官当陪练 你越战越勇,平时根本没有和大神交流机会,这次就是。准备-交流,准备-交流 也是高效的学校方式。
  • 游戏地图:深入理解计算机系统--IO模型

希望在io_uring使用场景上对你有帮助。

io_uring 已成为现代高性能开源项目的基石技术 尤其在存储、 数据库和 网络领域实现革命性突破。其设计兼顾效率与灵活性,未来有望在更多场景替代传统 I/O 模型

一、面试回顾青铜被虐

岗位信息

  • 时间:2025年 5月28
  • 岗位:后端开发工程师

对话内容

面试官: 在你简历提到使用 io_uring请问,

  • 说说libaio和   io_uring有什么区别?
  • 然后说一说 io_uring怎么使用的?

我的感觉

  • 自己简历写内容,自己忘记了,这妥妥犯了一个致命错误,别人揪出来,尴尬,面试官印象打折扣80%
  • 我看W.Richard Steven << UNIX网络编程>> 和 陈硕老师的 << Linux多线程服务端编程:使用muduo C++网络库>>
  • 提到 5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO。只研究到同步IO (select、poll、epoll 、kqueue),大多数面试这个,自己源码和数据结构还不和清楚呢
  • 纯异步IO 看过相关文章,看过几眼,现在忘记了,没有实际操作,当场卡克了,不知道怎么回答了。回答的没底气
异步定义:可以阻塞实现,也可以组阻塞实现
异步定义:可以阻塞实现,也可以组阻塞实现

我回答:把自己知道全部回答一次。

面试官:提问,还有吗?等了20分钟 ,这个才是重点

我:反复说之前内容。

后记:

  1. 最重要一点 减少用户态到内核态拷贝,一开始说了,这个没有深入讨论
  2. 自己没有实际代码结合,开始想想更多 问题,例如epoll 可以监控多个,纯异步IO不能解决,判断IO出来完成 一点 纠结15分钟。
  3. 还是那句话,在纯知识方面,你不会,没时间学习,面试官更没时间,更不会,在不清楚情况下,试图说全部要点,导致 思路混乱

小陷阱

  1. 在日常工作中 和面试一样,领导反问,真的吗?你确定吗?还有其他吗?
  2. 为什么不敢大声说,就这几点,而是习惯说 我回去在想想,别人认为根本考虑不周全,是糊弄,应付领导,这就是干活了,等白干想什么,一个项目1周完成,就是它,简单还效率。 在工作中 复杂设计绝对不通过评审的.
  3. 一个简单事情 你知道,大家知道,但是经过反复验证 这个才是做事情,其他超出能力范围,责任范围 不是做事情。
  4. 清楚 自己能做什么,把能做事情做好,不能做什么,不能做事情 找人解决,而不是自己解决,这个职场大忌,有方案不找领导,专家讨论,就是最大问题,这个蛮干,瞎干,目中无人
  5. 需求是什么问清楚,方案是什么考虑清楚,然后找评审,评审了 后面出问题领导不责怪,如果自己做,结果出问题了,就是自己问题。 因为分工协作

完整的题目:

二、查缺补漏王者归来

2.1 拆分任务

✅ 步骤1: 动手写 io_uring一个 demo例子,最简单一个例子

  1. 通过最简单例子 体会背后设计原理。

✅ 步骤2 :阅读材料

  1. Understanding Modern Storage APIs: A systematic study of libaio, SPDK, and io_uring
  2. How io_uring and eBPF Will Revolutionize Programming in Linux, ScyllaDB, 2020
  3. An Introduction to the io_uring Asynchronous I/O Framework, Oracle, 2020 ✅ 步骤3 :回答区别(不要试图完美回答,自己怎么理解就怎么回答)

✅ 步骤4:结合实际项目 验证 你猜想。不用怕打脸,及时调整,及时提问

项目

应用场景

具体实现方式

性能收益

Ceph

分布式存储系统

BlueStore OSD:直接集成 io_uring 优化块设备读写CrimsonOSD:基于 Seastar 框架原生支持 io_uring

显著提升 OSD 吞吐量,降低延迟,适应高并发存储场景

TiDB (TiKV)

分布式数据库存储层

通过 RocksDB 启用 io_uring 异步 I/O,用于 WAL 日志写入、SSTable 读取和 Compaction

Compaction 写入时间减少 50%,整体 I/O 效率提升

RocksDB

单机 KV 存储引擎

官方实现 PosixRandomAccessFile::MultiRead() 支持 io_uring,优化批量读取

随机读取和 Compaction 性能显著提升,尤其在高并发场景

SPDK

用户态存储框架

深度整合 io_uring,实现零拷贝和异步 I/O 操作

极致降低 I/O 延迟,适用于 NVMe 存储和虚拟化环境

Netty

高性能网络通信

通过 netty-incubator-transport-io_uring 模块支持异步 Socket I/O

单 Worker 场景 QPS 提升 20%,长连接吞吐量优化

Redis

内存数据库

实验性支持 io_uring 作为事件循环后端(需内核配置)

高负载下 QPS 提升 8%~32%(开启 SQ Polling 时)

Nginx

Web 服务器

通过第三方模块实现静态文件异步读写

长连接场景 QPS 提升 20%,短连接性能波动

xynet

C++ 高性能网络库

基于 io_uring 和 C++20 协程,实现异步网络操作

减少动态内存分配和系统调用,适用于低延迟通信

PostgreSQL

关系型数据库

社区探索异步 WAL 日志写入和索引刷盘(实验性)

目标降低事务提交延迟,提升高并发 OLTP 性能

QEMU

虚拟化磁盘 I/O

virtio-blk 后端驱动集成 io_uring,加速虚拟机磁盘访问

虚拟机 I/O 吞吐量提升,延迟降低

一、这个技术出现的背景、初衷和要达到什么样的目标或是要解决什么样的问题

如何提升存储系统的性能是一个对存储工程师们来说是永恒的大命题,解决这个问题并没有一击即中的银弹,IO性能的优化都在细节里。

  • 今天我们来讲一讲性能和IO模型之间的关系。

我们先从本地磁盘的IO模型说起。 一方面,对本地磁盘来说, 传统机械磁盘HDD介质的IO性能比CPU指令和应用程序差了好几个数量级;

另一方面,新型的SATA SSD和NVMe SSD硬盘的性能大幅提升, 在硬盘内部,磁盘控制器芯片具有多个队列来处理并发的IO请求, 磁盘本身具备了更高程度并发的能力。

  • 那么如何解决磁盘交互慢,以及利用新型磁盘内部特性, 提升数据访问性能,降低系统开销呢? 由此系统工程师们引入了多种IO模型来应对这些问题

在网络编程中【6】 我们通常使用epoll] IO多路复用来处理网络IO, 然而epoll也并不是异步网络IO, 仅仅是内核提供了IO复用机制, epoll回调通知的是数据可以读取或者写入了,具体的读写操作仍然需要用户去做,而不是内核代替完成

  • 在存储IO栈中,做存储的同学大都使用过libaio, 然而那是一个巨难用啊Linux AIO这个奇葩。 首先只能在DIO下使用,用不了pagecache; 其次用户的数据地址空间起始地址和大小必须页大小对齐
二、 这个技术适用的场景。任何技术都有其适用的场景

文章:https://www.cnblogs.com/haoee/p/16209797.html

1 与 Linux AIO 的不同

io_uring 与 linux-aio 有着本质的不同:

  1. 在设计上是真正异步的(truly asynchronous)。只要 设置了合适的 flag,它在系统调用上下文中就只是将请求放入队列, 不会做其他任何额外的事情,保证了应用永远不会阻塞。
  2. 支持任何类型的 I/O:cached files、direct-access files 甚至 blocking sockets。 由于设计上就是异步的(async-by-design nature),因此无需 poll+read/write 来处理 sockets。 只需提交一个阻塞式读(blocking read),请求完成之后,就会出现在 completion ring。
  3. 灵活、可扩展:基于 io_uring 甚至能重写(re-implement)Linux 的每个系统调用
三、技术的组成部分和关键点

五、对比其他怎么实现的?

2.2 执行任务

译 How io_uring and eBPF Will Revolutionize Programming in Linux

https://thenewstack.io/how-io_uring-and-ebpf-will-revolutionize-programming-in-linux/

很多人可能还没意识到,Linux 内核在过去几年已经发生了一场革命。这场革命源于 **==两个激动人心的新接口的引入:eBPF 和 io_uring 我们认为,二者将会完全改变应用与内核交互的方式==**, 以及 应用开发者思考和看待内核的方式

But it’s a sure revolution, one that most people haven’t noticed yet. That’s because of two new, exciting interfaces: eBPF (or BPF for short) and io_uring, the latter added to Linux in 2019 and still in very active development. Those interfaces may look evolutionary, but they are revolutionary in the sense that they will — we bet — completely change the way applications work with and think about the Linux Kernel.

本文介绍 io_uring

Linux I/O 系统调用演进

  • 基于 fd 的阻塞式 I/O:read()/write()
  • 非阻塞式 I/O:select()/poll()/epoll()
单线程处理 ,一个io阻塞影响全部io
单线程处理 ,一个io阻塞影响全部io

单线程处理 ,一个io阻塞影响全部io

  • 1.3 线程池方式

参考

  • 现代异步存储访问API探索:libaio、io_uring和SPDK
  • https://cloud.tencent.com/developer/article/1748032
  • [译] Linux 异步 I/O 框架 io_uring:基本原理、程序示例与性能压测(2020)
  • https://arthurchiao.art/blog/intro-to-io-uring-zh/
  • https://stackoverflow.com/questions/13407542/is-there-really-no-asynchronous-block-i-o-on-linux
  • 【6】 # 浅析开源项目之io_uring https://zhuanlan.zhihu.com/p/361955546
  • 【7】 https://openinx.github.io/ppt/io-uring.pdf
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端开发成长指南 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、面试回顾青铜被虐
    • 岗位信息
    • 对话内容
  • 二、查缺补漏王者归来
    • 2.1 拆分任务
      • 五、对比其他怎么实现的?
    • 2.2 执行任务
      • 翻译 How io_uring and eBPF Will Revolutionize Programming in Linux
      • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档