用途:引导在 Linux 5.1+ 上使用 io_uring 构建高吞吐网络或磁盘服务,用更少系统调用替代 epoll + 线程池,并评估 io_uring 与 epoll 的取舍。
主要能力:讲解提交队列(SQE)与完成队列(CQE)模型;liburing 基本用法(io_uring_queue_init、io_uring_get_sqe、io_uring_prep_read、io_uring_submit、io_uring_wait_cqe、io_uring_cqe_seen、io_uring_queue_exit);常用 prep 操作如 read/write、recv/send、accept/connect、poll_add、timeout;multi-shot accept 与 recv;提供缓冲区环(io_uring_setup_buf_ring、io_uring_buf_ring_add、io_uring_buf_ring_advance);固定文件与注册缓冲区(io_uring_register_files、io_uring_register_buffers、io_uring_prep_read_fixed);零拷贝发送 io_uring_prep_send_zc;Rust 侧 tokio-uring 用法。
用法要点:编译示例可用 gcc -o uring_read uring_read.c -luring 后运行;Rust 通过 cargo add tokio-uring 引入。批量提交 SQE 可减少系统调用;多 shot 操作需在 CQE 的 IORING_CQE_F_MORE 清除后重新武装。
限制与注意:io_uring 需 Linux 5.1+ 且特性随内核版本变化,零拷贝发送需 6.0+ 与网卡/驱动支持,不支持时回退为复制模式。它不是通用替代方案,简单应用或重视可移植性时仍建议用 epoll。部分发行版默认禁用非特权 io_uring,可用 sysctl kernel.io_uring_disabled 与 kernel.io_uring_group 配置,且 io_uring 曾是攻击面,应保持内核补丁并隔离不可信代码。
常见问题:-EINVAL 多因内核不支持该操作,可查 io_uring_get_probe();wait_cqe 挂起常因漏调 submit;提供缓冲区未回收需重新 add;SEND_ZC 未完成需等第二个 CQE。具体性能数据与更多细节暂未提供。