我们来复习一下以下两篇文章:
一个构想:使用 replace
实现 eBPF 程序的模块化,使用 BPF_PROG_TEST_RUN
对 eBPF 程序模块进行单测。
eBPF 程序模块化
当一个 eBPF 程序随着时间的推移变得越来越复杂后,我们就需要对其进行模块化,以便于维护。如果没有实现模块化,则 eBPF 程序的复杂度会随着时间的推移而不断增加,最终导致难以维护。
根据业界的经验,例如 xdp-tools/xdp-dispatcher[1],我们可以使用 freplace
实现 eBPF 程序的模块化。
模块化后的 eBPF 程序分为两部分:
作为主要部分的 feature 编排框架,它负责调用各个 feature 模块,并能够按需决定 feature 模块之间的调用顺序。 模块化后的 feature eBPF 程序,它只负责完成一个特定的功能。
由此衍生出不同风格的 feature 编排框架,例如:
流水线风格编排框架 树形风格编排框架
当然,参考软件架构设计,我们也可以实现更多风格的 feature 编排框架。
流水线风格编排框架
流水线风格编排框架的特点是:feature 模块之间的调用顺序是固定的。
顺序固定,意味着死板;可以根据 feature 模块的返回值,决定是否调用下一个 feature 模块;以此增加一定的灵活性。
这是一种比较实用的编排风格。
树形风格编排框架
不像流水线般死板,树形风格编排框架可以根据 feature 模块的返回值,决定调用哪个 feature 模块,从而像树木般开枝散叶。
再且,为了避免调用成环,该框架应禁止后面的 feature 模块调用前面的 feature 模块。
只有经过实战后,方知哪种风格的编排框架更适合自己的业务场景。
eBPF 程序单测
将复杂的 eBPF 程序拆分为多个功能较为单一的 feature 模块后,我们就可以对每个 feature 模块进行单测。
因为一个 feature 模块比较简单,所以所需的单测代码会比模块化前的简单许多,从而更容易实现,最终保障了 eBPF 程序的健壮性。
有了单测,才有信心对 feature 模块进行重构;而且 BPF_PROG_TEST_RUN
的结果里提供了当前运行 N 次的平均耗时,可以更精确地评估优化带来的性能提升。
小结
eBPF 程序模块化与单测构想,是一种理论思考,希望能给你带来启发。
参考资料
xdp-tools/xdp-dispatcher: https://github.com/xdp-project/xdp-tools/blob/master/lib/libxdp/xdp-dispatcher.c.in