好的,阿杰 👍
我来给你整理一份 Linux io_uring 详解,从概念、原理、接口到应用场景,帮你快速理解。
io_uring 详解
1. 背景
在 Linux 中,I/O 模型经历了几个阶段:
- 阻塞 I/O (
read
/write
):调用进程阻塞,直到数据准备好 - 非阻塞 I/O (
O_NONBLOCK
):需要不断轮询 - I/O 多路复用 (
select
,poll
,epoll
):统一等待多个 fd 的 I/O 事件 - AIO (Linux AIO):异步 I/O,但只对文件有限支持,API 繁琐
- io_uring:Linux 5.1 引入的新一代异步 I/O 框架,性能优于 epoll + 非阻塞 I/O
👉 核心目标:高性能、低延迟的异步 I/O,减少内核与用户态的系统调用开销。
2. 基本原理
io_uring 主要依赖 共享内存环形队列 (ring buffer) 实现用户态与内核态的高效通信:
- SQ (Submission Queue):用户态提交 I/O 请求
- CQ (Completion Queue):内核态完成后写入结果
工作流程:
- 用户态进程写入 SQ(一个 SQE – Submission Queue Entry)
- 内核异步执行 I/O
- 内核写入 CQ(一个 CQE – Completion Queue Entry)
- 用户态进程读取 CQ 获取结果
👉 特点:零拷贝 + 批量提交 + 异步完成
3. io_uring 系统调用
主要两个系统调用:
io_uring_setup(entries, params)
- 初始化 io_uring 实例,返回一个 fd
io_uring_enter(fd, to_submit, min_complete, flags, sigset)
- 提交请求到内核
- 等待至少
min_complete
个完成事件
👉 用户态通过 mmap
映射到 ring buffer,避免频繁的系统调用。
4. 基本 API 使用
Linux 提供了 liburing
库来简化 io_uring 的使用。
示例:异步读文件
#include <liburing.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main() {
struct io_uring ring;
io_uring_queue_init(8, &ring, 0);
int fd = open("test.txt", O_RDONLY);
char buf[128];
struct io_uring_sqe *sqe = io_uring_get_sqe(&ring);
io_uring_prep_read(sqe, fd, buf, sizeof(buf)-1, 0);
io_uring_submit(&ring);
struct io_uring_cqe *cqe;
io_uring_wait_cqe(&ring, &cqe);
if (cqe->res >= 0) {
buf[cqe->res] = '\0';
printf("Read: %s\n", buf);
}
io_uring_cqe_seen(&ring, cqe);
io_uring_queue_exit(&ring);
close(fd);
return 0;
}
流程:
- 初始化 io_uring 队列
- 获取一个 SQE,准备
read
请求 - 提交请求
- 等待并处理完成结果
5. 优势
- 更少的系统调用:批量提交/获取结果,减少
epoll_wait
开销 - 更高吞吐量:适合高并发场景(数据库、网络服务器)
- 统一接口:支持文件、socket、缓冲区操作
- 内核直接完成:避免用户态/内核态频繁切换
6. 应用场景
- 高性能网络服务(替代
epoll
) - 数据库存储引擎(MySQL、PostgreSQL 新版本已开始尝试集成)
- 高并发日志/消息系统
- 文件系统工具(如
fio
已支持 io_uring) - Web 服务器(Nginx / Envoy 正在探索 io_uring 版本)
7. 发展与现状
- Linux 5.1:引入 io_uring
- Linux 5.5:支持
accept
,connect
等网络操作 - Linux 5.6:支持
sendmsg
,recvmsg
- Linux 5.11+:支持 IORING_OP_PROVIDE_BUFFERS 等高级功能
目前 io_uring 被认为是 未来 Linux 异步 I/O 的主流方案。
8. 小结
- io_uring 提供 异步 + 高性能 的 I/O 机制
- 核心:共享环形队列 + 批量提交/完成
- 相比
epoll
,减少了系统调用开销,更适合高并发场景 - 应用:数据库、Web 服务器、消息队列、日志处理
速查表已整理好 ✅
这里是下载链接:
📂 io_uring_cheatsheet.pdf
发表回复