io_uring:从内核异步 I/O 到生产级高性能存储引擎的全链路实战

Linux 5.1 引入的 io_uring 彻底改变了 Linux 平台上高性能 I/O 的编程范式。它不仅是一个新的系统调用接口,更是内核与用户态协作机制的一次深刻演进。

一、被 AIO 辜负的十年

在 io_uring 出现之前,Linux 原生异步 I/O(KAIO)已经存在多年,但其设计局限让高性能场景的开发者倍感痛苦。

AIO 的核心限制包括:

  • 仅支持 O_DIRECT 裸设备 I/O,无法用于普通文件系统
  • 提交/完成事件需要多次系统调用,上下文切换开销大
  • 不支持 sockets 异步操作,无法统一网络 I/O 模型
  • 内核实现分散,竞态条件频发,bug 层出不穷

正因如此,DPDK、SPDK 这类用户态驱动框架才会大行其道——既然内核靠不住,那就绕过内核。但绕过内核意味着丧失 VFS、丧失标准 POSIX 接口,系统复杂度陡增。

二、io_uring 的架构设计

2.1 核心思想:双环形队列

io_uring 的真正创新在于共享内存环形队列(Shared Ring Buffers)。它创建了两个uffer:

┌─────────────────────────────────────────────┐
│                   io_uring                    │
│                                               │
│  ┌─────────────┐    ┌──────────────────┐    │
│  │  SQ (提交队列) │    │  CQ (完成队列)    │    │
│  │  SQE Array    │    │  CQE Array        │    │
│  │  Head ← User  │    │  Head ← Kernel    │    │
│  │  Tail ← Kernel │    │  Tail ← User      │    │
│  └─────────────┘    └──────────────────┘    │
│         ↑                    ↓               │
│     用户态提交            内核态通知           │
└─────────────────────────────────────────────┘
  • SQ(Submission Queue):用户态将 SQE(Submission Queue Entry)写入 SQ 尾部内核可见的位置
  • CQ(Completion Queue):内核将 CQE(Completion Queue Entry)写入 CQ 尾部用户态可见的位置

关键设计:SQ 的 head 由用户态更新,tail 由内核消费后更新;CQ 则相反。这样通过 memory barrier 即可实现无锁同步。

2.2 三个核心系统调用

// 1. 初始化 io_uring 实例
int io_uring_setup(unsigned entries, struct io_uring_params *p);

// 2. 提交并等待完成(合并为一个 syscall)
int io_uring_enter(unsigned int fd, unsigned int to_submit,
                   unsigned int min_complete, unsigned int flags,
                   sigset_t *sig);

// 3. Linux 5.11 :工作线程模式,彻底消除 syscall
// 通过 IORING_SETUP_SQPOLL 标志在 setup 时启用

2.3 零提交模式(SQPOLL)

Linux 5.11 引入的 SQPOLL 模式让内核线程主动 polling SQ,用户态写入 SQE 后甚至不需要调用 io_uring_enter——内核会自动发现新提交并执行。

struct io_uring_params params = {0};
params.flags |= IORING_SETUP_SQPOLL;
// 内核线程在 sq_thread 中循环检查 SQ tail 更新
params.sq_thread_idle = 2000; // idle 2s 后线程休眠

io_uring_setup(QUEUE_DEPTH,                        
                    
点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部