【发布时间】:2020-11-30 14:22:23
【问题描述】:
显然,Linux 已经有了一个 Asyn-IO (AIO) API。我相信它不是完全异步的。那么 AIO 的问题是什么? io_uring 如何克服它?
PS:我尝试阅读 https://kernel.dk/io_uring.pdf 但无法完全理解,因为我与 C 语言脱节。
【问题讨论】:
显然,Linux 已经有了一个 Asyn-IO (AIO) API。我相信它不是完全异步的。那么 AIO 的问题是什么? io_uring 如何克服它?
PS:我尝试阅读 https://kernel.dk/io_uring.pdf 但无法完全理解,因为我与 C 语言脱节。
【问题讨论】:
显然,Linux 已经有一个 Asyn[c]-IO (AIO) API。我相信它不是完全异步的。那么 AIO 的问题是什么?
如果您格外小心并匹配其所有约束,“旧”Linux AIO 接口将异步运行。但是,如果您“破坏”任何(隐藏的)规则 submission 可能会突然(并且默默地)以同步方式运行(即,提交阻止不确定性和不方便的长时间)。许多“规则”中的一些在asynchronous IO io_submit latency in Ubuntu Linux 的答案中给出(总体问题也列在您链接的io_uring document 的第 1.0 节中)。
io_uring 如何克服它?
IORING_SETUP_SQPOLL),您可以在其中 don't even have to make syscalls to submit/retrieve results。如果您“只是”操纵内存内容,那么在您从未拨打过的电话上将很难被阻止!io_uring 内部如何工作?
有两个环形缓冲区,其中第一个环形缓冲区用于排队提交,当工作完成时,“结果”通过第二个环形缓冲区(包含完成)宣布。如果您对 C 结构/C 函数接口之类的东西感到不舒服,很难给您提供比非常高级别的东西更多的东西,但您可能会喜欢这个video by Jens presenting io_uring,并在https://www.scylladb.com/2020/05/05/how-io_uring-and-ebpf-will-revolutionize-programming-in-linux/ 和https://mattermost.com/blog/iouring-and-go/ 中找到更易于理解的解释.
io_uring 相对于 Linux AIO 的优势并不仅限于更好的异步性!有关其他好处的列表,请参阅上述"Is there really no asynchronous block I/O on Linux?" 的链接...
【讨论】: