io_uring
io_uring 是 Linux 内核自 5.1 引入。它的设计目标是减少系统调用开销、提升吞吐量、支持无锁提交/完成队列等,特别适合高并发、高性能场景(如数据库、网络服务器等)。
io_uring 核心机制概述(基于 Linux 5.15)
核心组件
- Submission Queue(SQ): 用户空间可见的循环队列,用于提交 I/O 请求。
- Completion Queue(CQ): 用户空间可见的循环队列,用于读取完成的请求信息。
- 内核环(uring)结构体: 管理 SQ、CQ 和相关资源。
io_kiocb: 每个 I/O 请求的内核表示,包含回调、状态、buffer 等。
基本流程
用户空间提交 I/O:
1. 将请求写入 SQ(SQE - Submission Queue Entry)
2. 调用 `io_uring_enter()` 通知内核处理
3. 内核处理请求,并在完成后写入 CQ(CQE - Completion Queue Entry)
4. 用户空间轮询 CQ 获取结果
性能设计亮点
- 无锁环形队列:内核与用户空间共享,支持并发高效访问
- 缓冲区注册(fixed buffers):避免多次内存映射和拷贝
- 注册文件描述符:减少内核文件结构查找成本
- 支持多种操作类型:
- READ, WRITE, SEND, RECV, ACCEPT, CONNECT
- FSYNC, OPENAT, CLOSE, STATX
- PROVIDE_BUFFERS, READ_FIXED(zero-copy)
- IORING_OP_TIMEOUT, POLL_ADD, CANCEL
示例代码(简化版本)
struct io_uring ring;
io_uring_queue_init(32, &ring, 0);
struct io_uring_sqe *sqe = io_uring_get_sqe(&ring);
io_uring_prep_read(sqe, fd, buf, len, offset);
io_uring_submit(&ring);
struct io_uring_cqe *cqe;
io_uring_wait_cqe(&ring, &cqe);
printf("read result: %d\n", cqe->res);
io_uring_cqe_seen(&ring, cqe);
应用场景
- 高并发网络服务(结合 send/recv)
- 零拷贝文件服务器(配合 fixed buffer)
- 高性能数据库(异步 fsync/write)
- 替代 epoll + thread pool 架构(更低 latency)
650

被折叠的 条评论
为什么被折叠?



