eBPF Talk: eBPF 程序模塊化與單測構想

一個構想:使用 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

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/juRF3q2EYPcgtPQZd94OCg