eBPF Talk: eBPF 程序模塊化與單測構想
一個構想:使用 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 程序模塊化與單測構想,是一種理論思考,希望能給你帶來啓發。
參考資料
[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