好的,阿杰 👍
我来给你整理一份 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):内核态完成后写入结果

工作流程:

  1. 用户态进程写入 SQ(一个 SQE – Submission Queue Entry
  2. 内核异步执行 I/O
  3. 内核写入 CQ(一个 CQE – Completion Queue Entry
  4. 用户态进程读取 CQ 获取结果

👉 特点:零拷贝 + 批量提交 + 异步完成


3. io_uring 系统调用

主要两个系统调用:

  1. io_uring_setup(entries, params)
    • 初始化 io_uring 实例,返回一个 fd
  2. 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;
}

流程:

  1. 初始化 io_uring 队列
  2. 获取一个 SQE,准备 read 请求
  3. 提交请求
  4. 等待并处理完成结果

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