好的,IO_uring(通常写作 io_uring)是 Linux 内核中一个革命性的异步 I/O 框架,由 Jens Axboe 在 2019 年(内核 5.1 版本)引入。它的目标是解决传统 Linux I/O 接口(如 aio)的缺陷,提供一种高性能、可扩展且易于使用的异步 I/O 机制。
1. 为什么需要 io_uring?
传统的 Linux AIO(libaio)存在许多局限性:
- 仅支持直接 I/O:不支持缓冲 I/O 和文件系统元数据操作(如
open,stat等)。 - 内存开销大:每个 I/O 操作需要单独分配内存。
- 系统调用开销:即使使用批量提交,仍需要频繁的系统调用。
- 功能不完整:例如不支持 socket I/O。
io_uring 通过以下设计解决了这些问题:
- 统一的异步接口:支持几乎所有类型的 I/O(存储、网络、管道等)。
- 零拷贝机制:通过共享内存环缓冲区减少用户态与内核态的数据拷贝。
- 批量和轮询模式:显著减少系统调用次数,甚至实现零系统调用。
2. 核心组件
io_uring 的核心是两个环形缓冲区(ring buffer):
提交队列(Submission Queue, SQ)
- 用户态程序将 I/O 请求(称为 Submission Queue Entry, SQE)放入 SQ。
- 内核从 SQ 读取请求并执行。
完成队列(Completion Queue, CQ)
- 内核将已完成的 I/O 结果(称为 Completion Queue Event, CQE)放入 CQ。
- 用户态程序从 CQ 读取结果。
这两个队列通过共享内存实现,用户态和内核态无需额外拷贝数据即可交换信息。
3. 工作流程
- 初始化 io_uring
使用io_uring_setup()系统调用创建 SQ 和 CQ,并映射到用户空间。 - 提交请求
- 用户程序将 SQE 写入 SQ。
- 调用
io_uring_enter()通知内核有新的请求(或依赖轮询模式避免系统调用)。
- 内核处理
内核异步执行 I/O 操作,完成后将结果写入 CQ。 - 获取结果
用户程序从 CQ 读取 CQE,处理完成状态。
4. 关键特性
(1) 高性能设计
- 批处理操作:一次性提交多个 I/O 请求,减少系统调用次数。
- 轮询模式(Polled Mode)
- SQ Polling:内核主动检查 SQ,无需用户调用
io_uring_enter()。 - CQ Polling:用户程序主动检查 CQ,无需等待中断。
- SQ Polling:内核主动检查 SQ,无需用户调用
- 固定资源(Fixed Resources)
可以预注册缓冲区或文件描述符,避免每次操作重复注册。
(2) 丰富的操作类型
除了常规的 read/write,还支持:
- Socket I/O (
send,recv) -文件操作 (open,close,stat) -超时和事件通知 (timeout,poll_add) -链式操作(依赖顺序执行)。
(3) Proactor 模式
用户程序只需提交请求并处理完成事件,无需主动等待 I/O。
5. API示例(C语言)
#include <liburing.h>
int main() {
struct io_uring ring;
io_uring_queue_init(32, &ring, ); //初始化
//准备SQE
struct io_uring_sqe *sqe = io_uring_get_sqe(&ring);
int fd = open("file.txt", O_RDONLY);
char buffer[4096];
io_uring_prep_read(sqe, fd, buffer, sizeof(buffer), );
//提交请求
io_uring_submit(&ring);
//等待完成
struct io_uring_cqe *cqe;
io_uring_wait_cqe(&ring, &cqe);
printf("Read %d bytes\n", cqe->res);
io_uring_queue_exit(&ring); //清理
}
6.性能优势
- 系统调用减少90%+:批处理和轮询模式极大降低上下文切换。
- 低延迟:共享内存实现零拷贝通信。 -高吞吐量:适合NVMe SSD、高速网络等场景。
###7.应用场景 1云原生与数据库(如 ClickHouse、PostgreSQL) 2Web服务器(如 nginx) 3高频交易系统
###8.注意事项
兼容性需 Linux ≥5.1 (完整功能需≥5.11)
调试工具: io_uring
开源库: libURING (https://github.com/axboe/libURING)
总结来说,是Linux异步I/O的重大进化彻底改变了高性能应用的开发范式。
内容由零声教学AI助手提供,问题来源于学员提问




