基于 io_uring 和 kqueue 的程序员友好的 I/O 抽象
考虑一下这个 I/O 和性能的故事。我们将从阻塞 I/O 开始,探索 io_uring 和 kqueue,并带回家一个与您可能熟悉的某些软件非常相似的事件循环。 这是金在演讲中的一个转折 您会爱上 Milan ’22 的软件。 当您想要从文件中读取数据时,您可以 open() ,然后根据需要多次调用 read() 来填充文件中的字节缓冲区。相反,您可以根据需要多次调用 write() ,直到所有内容都被写入。它与带有套接字的 TCP 客户端类似,但您首先调用 socket(),然后调用 connect() 到服务器,而不是 open()。有趣的东西。 但在现实世界中,您并不总是能够立即从文件描述符中读取您想要的所有内容。您也不能总是立即将所需的所有内容写入文件描述符。 你可以 将文件描述符切换为非阻塞模式 因此,当您请求的数据不可用时,调用不会被阻止。但系统调用仍然很昂贵,会导致上下文切换和缓存未命中。事实上,网络和磁盘变得如此之快,以至于这些成本已经开始接近执行 I/O 本身的成本。在文件描述符无法读取或写入的持续时间内,您不想浪费时间不断重试读取或写入系统调用。 因此,您在 Linux 上切换到 io_uring,在 FreeBSD/macOS 上切换到 kqueue。 (我跳过了 epoll/select 用户的生成。)这些 API 允许您向内核提交请求以了解准备情况:文件描述符何时准备好读取或写入。您可以批量发送就绪请求(也称为队列)。完成事件(每个提交的请求都有一个)在单独的队列中可用。 对于想要为多个连接的客户端进行多路复用读取和写入的 TCP 服务器来说,能够像这样批量 I/O 尤为重要。 然而,在 io_uring 中,您甚至可以更进一步。您可以请求内核使用您提供的缓冲区自行执行 read() 或 write() […]
欢迎来到 io_uring 之主 — io_uring 之主 文档
io_uring 是在 Linux 下进行异步 I/O 编程的一种强大的新方法。摆脱了上一代I/O子系统的各种限制, io_uring 拥有巨大的希望。有关什么的更多详细信息 io_uring 带到桌面上,请参阅本章 什么是 io_uring?。 关于 这 io_uring 该指南由 Shuveb Hussain 创建,他也是专注于 Linux 的博客 unixism.net 的作者。你可以 在 Twitter 上关注我 我的帖子主要与技术相关,重点关注 Linux、性能、可扩展性和云。 贡献 本指南的源代码存储库是 在 Github 上。如果您想做出贡献,请向我发送拉取请求。如果您在文档或包含的源代码示例中发现任何错误,请在 GitHub 上提出问题。示例程序的存储库是单独维护的。请参阅下面的详细信息。 示例源代码 本指南中所有示例程序的源代码均可用 在 Github 上。如果您在示例中发现错误,请在 Github 上提出问题。我想让这些例子简单明了。由于这个原因,我很多不会合并添加功能的拉取请求。欢迎修复错误的拉取请求。
