Skip to content

增加Linux的io-uring模型支持 #188

Description

@hezihang12

io_uring 简单说就是linux下的iocp:

io_uring是 Linux 内核 5.1(2019 年)引入的‌高性能异步 I/O 接口‌,通过‌共享内存环形队列‌(提交队列 SQ+ 完成队列 CQ)实现‌零拷贝、批量提交‌的完成模型(Proactor),旨在替代传统 epoll(就绪模型)及原生 Linux AIO 的缺陷 。‌‌

核心机制与架构
‌双环共享内存‌:用户态与内核态通过 mmap 共享提交队列(SQ)和完成队列(CQ),‌无需每次 I/O 都进行系统调用‌,大幅减少上下文切换和数据拷贝 。
‌工作流程‌:应用向 SQ 写入请求(SQE)→ 内核异步执行 → 结果写入 CQ(CQE)→ 应用读取结果;支持单次 io_uring_enter 批量处理数千个请求 。
‌三大系统调用‌:仅依赖 io_uring_setup(初始化)、io_uring_enter(提交/获取)、io_uring_register(注册固定文件/缓冲区),配合 liburing 库可简化开发 。
‌高级特性‌:支持 ‌Multishot‌(单次提交触发多次完成,如 multishot_recv)、‌固定文件/缓冲区注册‌(减少重复映射开销)、‌内核轮询模式‌(SQPOLL/IOPOLL,进一步消除系统调用)。‌‌
关键优势与场景
‌性能提升‌:在高并发、高 IOPS 场景(如 NVMe SSD、百万级连接)下,相比 epoll 可减少‌30%-60% CPU 开销‌,显著降低尾延迟(p99),吞吐量提升明显 。
‌统一接口‌:同时支持‌文件磁盘 I/O‌和‌网络套接字 I/O‌,解决了原生 AIO 仅支持 Direct I/O 且无法使用页缓存的局限 。
‌适用边界‌:在‌高批量处理‌(Batch Size 大)场景优势极大;若单次 I/O 极小且无批量,早期版本网络性能可能持平或略低于 epoll,但 ‌Multishot 功能‌(Linux 5.19+/6.0+)已解决重复提交开销问题 。‌‌

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions