LWN:BPF与io_uring的结合!

Linux News搬运工

共 2240字,需浏览 5分钟

 ·

2021-03-23 19:04

关注了就能看到更多这么棒的文章哦~

BPF meets io_uring

By Jonathan Corbet
March 4, 2021
DeepL assisted translation
https://lwn.net/Articles/847951/

过去几年,很多开发工作是围绕着 BPF 和 io_uring 的。BPF 虚拟机允许在 kernel 上下文中安全地运行来自用户空间的程序, 而 io_uring 则解决了长期以来异步运行系统调用的需求。随着这两个子系统的不断扩充,两者最终不可避免地发生了交汇。第一次交汇就发生在 2 月中旬,Pavel Begunkov 提出的 这组patch 增加了从 io_uring 内运行 BPF program 的功能。

这组 patch 本身比较简单,仅仅新增加了不到 300 行代码。它为那些需要在 io_uring 上下文中运行的 BPF program 创建了一个新的 BPF program type (BPF_PROG_TYPE_IOURING)。任何此类 program 都必须首先用 bpf() 系统调用来创建,然后使用新增的 IORING_ATTACH_BPF 命令将它们注册到 ring 中等待运行。完成了这些工作之后,IORING_OP_BPF 这个操作就会在 ring 内真正运行 program。这组 patch 最后一步增加了一个 helper function,BPF program 可以使用该函数向 ring 中提交新的操作。

这组 patch 展示了如何从 io_uring 中运行 BPF program,这给我们大家建立了直观的第一印象。不过,这组 patch 实际上并没有真正实现什么此前无法做到的新功能,这可能就是为什么在 mailing list 中没有任何回应的一部分原因了。异步运行一个 BPF program 来提交另一个操作,这种做法的价值不大,毕竟人们可以直接提交那个操作就好。正如 patch set 中所承认的,要想让这个功能对用户真正有用,还需要先实现更多的基础设施(infrastructure)。

BPF 在这种场景中,如果可以根据之前操作的结果来做出决策的话,就真正可以增加价值了。目前都是必须在用户空间中做决策的,这就会对受这个决策进程合适得到 schedule 以及执行的影响,从而可能增加延迟。当某个操作完成后,在不退出 kernel mode 的情况下由一个 BPF program 来决定接下来执行哪个操作,这就会很有用处了。"下一步做什么" 包括可以提交更多的 I/O 操作到 ring 中、继续处理一系列文件中的下一个、或者在发生意外情况时中止一系列命令。

要能做决策的话,就需要能够根据 ring 中的其他事件来相应地执行 BPF program。现在 io_uring 中已经具有的顺序执行机制足以保证在某个特定操作完成之后来运行某个 program,但这个 program 无法获得关于之前这个操作的完成情况的更多有用信息。正如 Begunkov 所指出的那样,要解决这个问题,就需要有一种方法能在在运行一个 BPF program 时,将上一个操作的结果传递给它。还有一种方案是将 program 与某个已经提交的操作绑定(而不是像补丁集中那样将它们变成单独的操作)起来从而在这些操作完成时运行到这个 BPF program。

等拥有了这个功能之后,加上 io_uring 内已经支持了越来越多的系统调用,那么就可以创建出复杂的、与 I/O 相关的、能在内核空间长时间运行的 program。运行 BPF program 看似是对 io_uring 的增强,但也可以看作是赋予了 BPF 执行 I/O 和各种系统调用的能力。这个组合很可能可以让人们利用它们来做出一些令人惊讶的事情。

当然,这不是一个会被广泛使用的功能。就其本身而言,io_uring 带来了一定程度的复杂性,只有对于那些可以从异步处理中获得显著性能提升的场景才会用到它。将 BPF 加入到这个组合中将大大增加复杂程度,而且很长一串系列操作以及 BPF program 在调试时会是非常具有挑战性的。最后,要加载 io_uring program 就需要拥有 CAP_BPF 或 CAP_SYS_ADMIN,这意味着在大多数环境中都需要 "root" 权限。只要目前对 unprivileged BPF program 的反对仍然存在,那么这里就是个死结。因此,只会有非常少的程序会利用这个功能。

不过,这两个子系统的结合还是为 Linux 未来的发展提供了一个有趣的前景。Linux(很可能)永远不会是一个 unikernel 系统,但用户空间和内核之间的界限似乎确实越来越模糊。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~



浏览 42
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报