Post

io_uring

io_uring的原理和使用场景

io_uring 是 2019 年 5 月发布的 Linux 5.1 加入的一个重大特性 —— Linux 下的全新的异步 I/O 支持,希望能彻底解决长期以来 Linux AIO 的各种不足。

原理介绍和分析

io_uring基于两个无锁环形缓冲区构建,即提交队列和完成队列,这些缓冲区在用户空间和内核空间之间共享。用户将新的提交队列条目(SQE),如接收(recv)和发送操作,插入到提交队列中。插入到队列中不需要任何系统调用。为了通知内核提交队列中的新条目,io_uring_enter系统调用在内核端以非阻塞方式处理这些条目,直到请求被传输到网络或存储设备。该设备使用中断请求(IRQ)通知内核操作已完成。请求在中断期间被处理,并放置在完成队列中。为了检查请求是否成功,用户定期查看可用的完成队列条目(CQE)。研究发现,io_uring在存储应用程序中非常高效,但在网络任务中的研究较少。

io_uring 实现异步 I/O 的方式其实是一个生产者-消费者模型:

  • 用户进程生产 I/O 请求,放入提交队列(Submission Queue,后续简称 SQ);
  • 内核消费 SQ 中的 I/O 请求,完成后将结果放入完成队列(Completion Queue,后续简称 CQ);
  • 用户进程从 CQ 中收割 I/O 结果。

SQ 和 CQ 是内核初始化 io_uring 实例的时候创建的。为了减少系统调用和减少用户进程与内核之间的数据拷贝,io_uring 使用 mmap 的方式让用户进程和内核共享 SQ 和 CQ 的内存空间。

使用场景和性能

使用

This post is licensed under CC BY 4.0 by the author.