ZBLOG

详细介绍io_uring

好的,IO_uring(通常写作 io_uring)是 Linux 内核中一个革命性的异步 I/O 框架,由 Jens Axboe 在 2019 年(内核 5.1 版本)引入。它的目标是解决传统 Linux I/O 接口(如 aio)的缺陷,提供一种高性能、可扩展且易于使用的异步 I/O 机制。


1. 为什么需要 io_uring?

传统的 Linux AIO(libaio)存在许多局限性:

  • 仅支持直接 I/O:不支持缓冲 I/O 和文件系统元数据操作(如 open, stat 等)。
  • 内存开销大:每个 I/O 操作需要单独分配内存。
  • 系统调用开销:即使使用批量提交,仍需要频繁的系统调用。
  • 功能不完整:例如不支持 socket I/O。

io_uring 通过以下设计解决了这些问题:

  • 统一的异步接口:支持几乎所有类型的 I/O(存储、网络、管道等)。
  • 零拷贝机制:通过共享内存环缓冲区减少用户态与内核态的数据拷贝。
  • 批量和轮询模式:显著减少系统调用次数,甚至实现零系统调用。

2. 核心组件

io_uring 的核心是两个环形缓冲区(ring buffer):

  1. 提交队列(Submission Queue, SQ)

    • 用户态程序将 I/O 请求(称为 Submission Queue Entry, SQE)放入 SQ。
    • 内核从 SQ 读取请求并执行。
  2. 完成队列(Completion Queue, CQ)

    • 内核将已完成的 I/O 结果(称为 Completion Queue Event, CQE)放入 CQ。
    • 用户态程序从 CQ 读取结果。

这两个队列通过共享内存实现,用户态和内核态无需额外拷贝数据即可交换信息。


3. 工作流程

  1. 初始化 io_uring
    使用 io_uring_setup() 系统调用创建 SQ 和 CQ,并映射到用户空间。
  2. 提交请求
    • 用户程序将 SQE 写入 SQ。
    • 调用 io_uring_enter() 通知内核有新的请求(或依赖轮询模式避免系统调用)。
  3. 内核处理
    内核异步执行 I/O 操作,完成后将结果写入 CQ。
  4. 获取结果
    用户程序从 CQ 读取 CQE,处理完成状态。

4. 关键特性

(1) 高性能设计

  • 批处理操作:一次性提交多个 I/O 请求,减少系统调用次数。
  • 轮询模式(Polled Mode)
    • SQ Polling:内核主动检查 SQ,无需用户调用 io_uring_enter()
    • CQ Polling:用户程序主动检查 CQ,无需等待中断。
  • 固定资源(Fixed Resources)
    可以预注册缓冲区或文件描述符,避免每次操作重复注册。

(2) 丰富的操作类型

除了常规的 read/write,还支持:

  • Socket I/O (send, recv) -文件操作 (open, close, stat) -超时和事件通知 (timeout, poll_add) -链式操作(依赖顺序执行)。

(3) Proactor 模式

用户程序只需提交请求并处理完成事件,无需主动等待 I/O。


5. API示例(C语言)

#include <liburing.h>

int main() {
    struct io_uring ring;
    io_uring_queue_init(32, &ring, ); //初始化

    //准备SQE
    struct io_uring_sqe *sqe = io_uring_get_sqe(&ring);
    int fd = open("file.txt", O_RDONLY);
    char buffer[4096];
    io_uring_prep_read(sqe, fd, buffer, sizeof(buffer), );

    //提交请求
    io_uring_submit(&ring);

    //等待完成
    struct io_uring_cqe *cqe;
    io_uring_wait_cqe(&ring, &cqe);
    printf("Read %d bytes\n", cqe->res);

    io_uring_queue_exit(&ring); //清理
}

6.性能优势

  • 系统调用减少90%+:批处理和轮询模式极大降低上下文切换。
  • 低延迟:共享内存实现零拷贝通信。 -高吞吐量:适合NVMe SSD、高速网络等场景。

###7.应用场景 1云原生与数据库(如 ClickHouse、PostgreSQL) 2Web服务器(如 nginx) 3高频交易系统


###8.注意事项 兼容性需 Linux ≥5.1 (完整功能需≥5.11) 调试工具: io_uring 开源库: libURING (https://github.com/axboe/libURING)

总结来说,是Linux异步I/O的重大进化彻底改变了高性能应用的开发范式。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24277

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?