对io_uring的理解(1)

发布时间:2026/7/11 2:30:25

对io_uring的理解(1) 一、先搞懂背景传统 Linux 文件 IO 有多慢Linux 传统读写文件/磁盘有两种模式都有巨大开销阻塞IOread/write 调用 read() 时线程直接卡住内核和用户态来回切换系统调用频繁切换CPU成本极高。异步IO aiolibaio 早期Linux异步IO限制多只能支持裸磁盘不支持普通文件、管道、socketAPI难用坑很多。核心痛点每次IO操作都要用户态 ↔ 内核态来回切换切换很贵。二、io_uring 核心思路减少切换批量干活io_uring 是 Linux 5.1 正式引入的新一代高性能异步IO框架核心设计一句话用户程序和内核共用两块环形队列内存共享不用频繁拷贝数据、不用频繁系统调用一次提交一批IO请求一次拿回一批结果。两块环形缓冲区ring 环形队列名字由来SQ 提交队列Submission Queue 用户程序把要做的IO任务读文件、写文件、读写网络、缓存刷新等塞进去。CQ 完成队列Completion Queue 内核处理完IO后把完成结果塞回来用户程序从这里拿返回状态。两块队列是内核、用户态共享同一片内存不需要每次操作都拷贝数据。三、完整工作流程超通俗程序初始化创建 io_uring内核分配共享内存生成 SQ/CQ 环形队列用户程序批量往 SQ 填入一堆IO任务读10个文件、发10条网络数据只调用一次系统调用通知内核“队列里有活快去处理”内核在后台并发处理所有IO请求完成后把结果写入CQ用户程序一次系统调用从CQ取出所有IO完成结果循环复用队列不用反复创建销毁任务。对比传统 read/write 每一次读写 一次系统调用1000次IO就要1000次切换 io_uring1000次IO只需要2次系统调用提交一次、取结果一次性能差距巨大。四、io_uring 能干哪些事覆盖极广碾压老aio不只是磁盘文件读写几乎所有IO操作都支持普通文件读写、随机读写、大文件批量读写socket 网络收发TCP/UDP管道、字符设备文件操作open、stat、unlink、fsync 刷新缓存轮询模式、零拷贝IO五、关键优势系统调用极少CPU开销暴跌 批量提交、批量回收大量减少用户/内核切换高并发场景CPU占用大幅下降全能无老式aio的限制 libaio 只能裸盘io_uring 普通文件、网络、目录操作全都支持纯异步线程不阻塞 发起IO时线程不会卡住可以同时提交上万IO并发拉满内存拷贝少 SQ/CQ 共享内存不需要内核、用户态来回复制任务描述支持高级特性轮询IOpolling完全不中断CPU极致低延迟固定缓冲区减少页表映射开销链式IO、批量文件打开、取消IO任务六、适用场景只要追求高IO并发、低延迟的软件现在基本都在用 io_uring数据库RocksDB、MySQL、PostgreSQL 新版本开启 io_uring 提升吞吐高性能存储、对象存储服务高性能网络代理、游戏服务器高性能日志、消息队列Rust/Go/C 高性能IO框架底层如 tokio、uring-rs。七、举个生活化类比把内核当成仓库管理员你的程序是老板传统read/write老板每要一件货单独跑一趟仓库喊管理员拿来回跑累死libaio仓库只放硬盘货物快递、文件不给拿限制大io_uring老板拿一张共享清单环形队列一次性写下100件要拿/存放的货只喊管理员一次管理员全部处理完把结果写回同一张清单老板再看一次清单就行不用来回跑。八、总结io_uring Linux 官方新一代、全能、高性能异步IO接口通过共享环形队列大幅减少内核切换开销解决了老式同步IO慢、旧异步aio功能残缺的问题是现在高并发IO程序的底层标配。0voice · GitHub

相关新闻