eBPF Talk: eBPF 程序模块化与单测构想

文摘   2023-04-26 08:10   新加坡  

我们来复习一下以下两篇文章:

一个构想:使用 replace 实现 eBPF 程序的模块化,使用 BPF_PROG_TEST_RUN 对 eBPF 程序模块进行单测。

eBPF 程序模块化

当一个 eBPF 程序随着时间的推移变得越来越复杂后,我们就需要对其进行模块化,以便于维护。如果没有实现模块化,则 eBPF 程序的复杂度会随着时间的推移而不断增加,最终导致难以维护。

根据业界的经验,例如 xdp-tools/xdp-dispatcher[1],我们可以使用 freplace 实现 eBPF 程序的模块化。

模块化后的 eBPF 程序分为两部分:

  1. 作为主要部分的 feature 编排框架,它负责调用各个 feature 模块,并能够按需决定 feature 模块之间的调用顺序。
  2. 模块化后的 feature eBPF 程序,它只负责完成一个特定的功能。

由此衍生出不同风格的 feature 编排框架,例如:

  1. 流水线风格编排框架
  2. 树形风格编排框架

当然,参考软件架构设计,我们也可以实现更多风格的 feature 编排框架。

流水线风格编排框架

流水线风格编排框架的特点是:feature 模块之间的调用顺序是固定的。

顺序固定,意味着死板;可以根据 feature 模块的返回值,决定是否调用下一个 feature 模块;以此增加一定的灵活性。

这是一种比较实用的编排风格。

树形风格编排框架

不像流水线般死板,树形风格编排框架可以根据 feature 模块的返回值,决定调用哪个 feature 模块,从而像树木般开枝散叶。

再且,为了避免调用成环,该框架应禁止后面的 feature 模块调用前面的 feature 模块。

只有经过实战后,方知哪种风格的编排框架更适合自己的业务场景。

eBPF 程序单测

将复杂的 eBPF 程序拆分为多个功能较为单一的 feature 模块后,我们就可以对每个 feature 模块进行单测。

因为一个 feature 模块比较简单,所以所需的单测代码会比模块化前的简单许多,从而更容易实现,最终保障了 eBPF 程序的健壮性。

有了单测,才有信心对 feature 模块进行重构;而且 BPF_PROG_TEST_RUN 的结果里提供了当前运行 N 次的平均耗时,可以更精确地评估优化带来的性能提升。

小结

eBPF 程序模块化与单测构想,是一种理论思考,希望能给你带来启发。

参考资料

[1]

xdp-tools/xdp-dispatcher: https://github.com/xdp-project/xdp-tools/blob/master/lib/libxdp/xdp-dispatcher.c.in

eBPF Talk
专注于 eBPF 技术,以及 Linux 网络上的 eBPF 技术应用