原文: Notes on io-uring 地址: https://boats.gitlab.io/blog/post/io-uring/ 时间: 2020-05-06 作者: Withoutboats 这篇文章假定你对 io-uring API 有一定了解。这个文档(https://kernel.dk/io_uring.pdf)提供了关于 io-uring 的高级概述。 现在有很多人在 io-uring 中寻找类似文件系统 IO 之类的东西,在该处阻塞 IO 似乎是合理的。但是 io-uring 是 Linux 上所有 IO 的未来,包括网络 IO。 还有更多有趣的问题 所以我觉得这就是我们都应采用并继续为之努力的解决方案:由 io-uring 控制 buffer,io-uring 上最快的接口就是 缓冲接口(buffered interfaces) 我们应该仅对文件系统 IO 进行 io-uring 并等待 epoll 实例完成,还是将所有内容移至 io-uring?我们如何与仍在使用 epoll 的库集成在一起?
tokio-uring - tokio 基于 io-uring 版的异步运行时 tokio 今天发布了新的 RFC,提出了新的支持 io-uring 异步运行时的计划。 比较io-uring与epoll的benchmark会发现提升还是很显著的;一个TCP echo客户端和服务器显示出高达60%的改进。 虽然还没有测试过,但使用io-uring代替Tokio的线程池策略将会显著的改善 IO 操作。 由于io-uring与epoll有很大的不同,Tokio必须提供一套新的API来充分利用减少的开销。 此外,io-uring API还在不断发展,计划在不久的将来推出新功能。 与其等待io-uring的成熟和Tokio 2.0的发布,tokio 将发布一个独立的 crate,专门用于暴露io-uring的API。
为了这个目标,CloudWeGo Rust Team 探索基于 io-uring 为 Rust 提供异步支持,并在此基础上研发通用网关。 第二种是 io-uring 的模式,它是一个基于“完成通知”的模式。 在基于就绪状态的模式下,任务会通过 epoll 等待并感知 IO 就绪,并在就绪时再执行 syscall。
发现这个漏洞的是 `tokio-rs/io-uring`[6] 作者 quininer。 internals.rust-lang.org/t/synchronized-ffi-access-to-posix-environment-variable-functions/15475 [6] tokio-rs/io-uring : https://github.com/tokio-rs/io-uring [7] no time for chrono: https://passcod.name/technical/no-time-for-chrono.html
Failover 功能 冗余数据的定时删除 元数据接口的请求重定向 未来可能实现的功能: 支持纠删码(高优先级) 支持 Filer 服务(高优先级,以支持 S3,HDFS,Fuse 等 proxy) 支持 io-uring
https://www.abetterinternet.org/careers/le-sre-sw2/ 深入了解Ringbahn的drivers Ringbahn是无船同志(without boats)基于io-uring
不要还没说基础过,本质一样, The complexity and nuanced control to adopt different I/O stacks (such as epoll, linux-aio, io-uring 采用不同 I/O 堆栈(如 epoll、linux-aio、io-uring、DPDK 等)的复杂性和细微控制对应用程序代码是透明的。 疑问:什么意思 ,用户不用管只调用相关接口 Seastar 在内部会根据内核版本和配置,自动选择使用 linux-aio、io-uring 或者回退到基于 epoll 的异步实现。 Seastar 内部可基于 DPDK(在配置启用时)或内核 epoll/io-uring 实现高性能用户态/内核态 I/O。
它使用相对较新的Linux特定io-uring API进行I / O,因此它需要Linux版本5.10或更高版本。Debian/Bullseye,Ubuntu 20.04.4或更高版本符合这些要求。
openssl-sys 要链接、ring 要折腾目标三元组、tokio 的 mio 还得处理不同架构的 io-uring。
不要还没说基础过,本质一样,The complexity and nuanced control to adopt different I/O stacks (such as epoll, linux-aio, io-uring , DPDK, etc) are transparent to the application code.采用不同 I/O 堆栈(如 epoll、linux-aio、io-uring、DPDK 等)的复杂性和细微控制对应用程序代码是透明的 疑问:什么意思 ,用户不用管只调用相关接口Seastar 在内部会根据内核版本和配置,自动选择使用 linux-aio、io-uring 或者回退到基于 epoll 的异步实现。 Seastar 内部可基于 DPDK(在配置启用时)或内核 epoll/io-uring 实现高性能用户态/内核态 I/O。
Unix/Linux系统对纯异步的支持有限,应用事件驱动的主流还是通过select/epoll来实现, 另外, Linux支持 AIO吧实现上是模拟多线程依然问题很多, 直到最近Kernel 5.1的 io-uring
实现的类似go语法的嵌入式脚本语言 https://github.com/soasis/text 实现了text encoding https://github.com/robn/yoctochat 一个用io-uring
我们也希望看到围绕 io-uring 的工作带来巨大的性能改进,同时不至于造成生态系统的进一步分裂。 在工具链方面,Cargo 和 Rustup 大大简化了设置和编译项目的工作。
我们也希望看到围绕 io-uring 的工作带来巨大的性能改进,同时不至于造成生态系统的进一步分裂。 在工具链方面,Cargo 和 Rustup 大大简化了设置和编译项目的工作。
其他活跃维护的库和框架 上篇介绍过 monoio[53],是字节跳动开源的一个基于 io-uring 的 Thread-per-core 模型的异步 Runtime,详细介绍参见:《Rust 异步运行时的设计与实现 Glommio[55],是 DataDog 开源的另一款 基于 io-uring 的 Thread-per-core 模型的异步 Runtime ,目前该作者已经自己创业。
其中比较出色的可用于云原生项目的有: monoio[64],是一个基于 io-uring 的 Thread-per-core 模型的异步 Runtime,详细介绍参见:《Rust 异步运行时的设计与实现