使用 Rust 在 eBPF 中捕獲性能回歸:簡(jiǎn)介
開(kāi)發(fā)團(tuán)隊(duì)?wèi)?yīng)盡可能將性能回歸的檢測(cè)盡早進(jìn)行。以下是使用連續(xù)基準(zhǔn)測(cè)試工具 Bencher 的方法。
翻譯自 Catch Performance Regressions in eBPF with Rust: Intro 。

這是一個(gè)由五部分組成的系列文章的第一部分。在此閱讀第二部分。
擴(kuò)展伯克利數(shù)據(jù)包過(guò)濾器(eBPF)在不需要維護(hù)內(nèi)核模塊的麻煩情況下,用于擴(kuò)展Linux內(nèi)核的功能。從高層次來(lái)看,eBPF 是 Linux 內(nèi)核中運(yùn)行特殊類型字節(jié)碼的虛擬機(jī)。要?jiǎng)?chuàng)建一個(gè) eBPF 程序,需要將諸如 C、C++ 和 Rust 等語(yǔ)言的源代碼編譯為 eBPF 字節(jié)碼,然后將該字節(jié)碼加載到內(nèi)核中。然后,內(nèi)核使用 eBPF 驗(yàn)證器對(duì)字節(jié)碼進(jìn)行檢查。
eBPF 驗(yàn)證器評(píng)估 eBPF 字節(jié)碼;它基本上需要解決其中的停機(jī)問(wèn)題。這是非常重要的一步。驗(yàn)證確保 eBPF 程序不會(huì)使內(nèi)核崩潰。因此, eBPF 在其允許執(zhí)行的操作上有一些限制。所有程序都限制為一百萬(wàn)條指令;沒(méi)有無(wú)限循環(huán),也沒(méi)有在 eBPF 內(nèi)部等待用戶空間事件的方式。
一旦 eBPF 字節(jié)碼經(jīng)過(guò)驗(yàn)證,就可以將其加載到 eBPF 虛擬機(jī)中,在內(nèi)核中運(yùn)行。eBPF 程序可以在內(nèi)核中執(zhí)行多種不同的任務(wù):跟蹤系統(tǒng)調(diào)用,探測(cè)用戶空間,探測(cè)內(nèi)核函數(shù),對(duì) Linux 安全模塊(LSM)進(jìn)行工具化,以及過(guò)濾數(shù)據(jù)包,其中最初的用例是最后一個(gè)。當(dāng)時(shí)它只是伯克利數(shù)據(jù)包過(guò)濾器(BPF)。隨著時(shí)間的推移,隨著添加了新的用例,它變得被稱為擴(kuò)展BPF。現(xiàn)在,由于存在眾多可能的應(yīng)用程序,該縮寫(xiě)已被廢棄,取而代之的是 eBPF ,現(xiàn)在只是一堆字母,表示 eBPF 。

有幾種不同的語(yǔ)言和工具集可用于使用 eBPF 。一個(gè)基礎(chǔ)性的工具是 libbpf ,它是用 C 編寫(xiě)的,并在 Linux 內(nèi)核源代碼樹(shù)的 tools/lib/bpf 目錄下開(kāi)發(fā)。它是處理 eBPF 的標(biāo)準(zhǔn)工具。然而,?libbpf
?相當(dāng)?shù)图?jí),因此添加了額外的工具來(lái)幫助更輕松地編寫(xiě) eBPF 程序及其相應(yīng)的用戶空間程序。
一個(gè)名為 bcc 的工具允許使用 C 編寫(xiě) eBPF 程序,并使用 Python 和 lua 編寫(xiě)用戶空間程序。還有 ebpf-go) ,它允許使用 C 編寫(xiě) eBPF 程序,并使用 Go 編寫(xiě)用戶空間程序。最后,還有 Rust 的 eBPF 生態(tài)系統(tǒng)。libbpf-rs 是?libbpf
?的官方 Rust 封裝。然而,?libbpf-rs
?仍然要求使用 C 編寫(xiě) eBPF 程序。為了在 Rust 中編寫(xiě) eBPF 程序,創(chuàng)建了一個(gè)名為 RedBPF 的工具。后來(lái),這被 Aya 取代。Aya 完全擺脫了對(duì)?libbpf
?的依賴,采用純粹的本地 Rust 實(shí)現(xiàn)。
我們將使用 Rust 進(jìn)行工作,這是一種專注于性能、可靠性和生產(chǎn)力的現(xiàn)代編程語(yǔ)言。這使得它成為進(jìn)行系統(tǒng)編程的優(yōu)秀語(yǔ)言,這也導(dǎo)致它最近作為 Linux 內(nèi)核中的第一種新語(yǔ)言與 C 并存。在接下來(lái)的系列文章中,我們將使用 Aya 工具集來(lái)同時(shí)編寫(xiě) eBPF 和用戶空間程序。
在編寫(xiě) eBPF 程序時(shí),性能至關(guān)重要。由于 eBPF 程序在內(nèi)核中運(yùn)行,如果它們運(yùn)行緩慢,可能會(huì)拖慢整個(gè)系統(tǒng)。單次調(diào)用 eBPF 程序可能會(huì)給調(diào)用添加高達(dá) 100 毫秒的延遲。這種性能回歸水平在開(kāi)發(fā)中是可以檢測(cè)到的。然而,除非開(kāi)發(fā)人員已經(jīng)密切關(guān)注,否則很少發(fā)生這種情況。大多數(shù)開(kāi)發(fā)團(tuán)隊(duì)沒(méi)有建立檢測(cè) CI 中性能回歸的基礎(chǔ)設(shè)施,就像對(duì)功能回歸一樣。這使得性能錯(cuò)誤只能在生產(chǎn)環(huán)境中檢測(cè)到,此時(shí)它們已經(jīng)影響到用戶,并且修復(fù)它們的代價(jià)最高。
性能錯(cuò)誤是錯(cuò)誤,開(kāi)發(fā)團(tuán)隊(duì)?wèi)?yīng)盡可能將性能回歸的檢測(cè)盡早移至開(kāi)發(fā)周期的左側(cè)。依靠開(kāi)發(fā)人員在每次更改時(shí)手動(dòng)運(yùn)行基準(zhǔn)測(cè)試是不可行的。與運(yùn)行單元測(cè)試以防止功能回歸的原因相同,應(yīng)該在 CI 中運(yùn)行基準(zhǔn)測(cè)試以防止性能回歸。這將需要一個(gè)連續(xù)的基準(zhǔn)測(cè)試工具,例如 Bencher 來(lái)跟蹤基準(zhǔn)測(cè)試并捕獲性能回歸。
在這個(gè)系列的博客文章中,我們將涵蓋以下內(nèi)容:
在Rust中編寫(xiě)基本的eBPF程序
在Rust中演進(jìn)eBPF程序
在Rust中進(jìn)行基準(zhǔn)測(cè)試eBPF程序
在Rust中進(jìn)行連續(xù)基準(zhǔn)測(cè)試eBPF程序
該項(xiàng)目的所有源代碼都是開(kāi)源的,可以在 GitHub 上獲取。
本文使用 文章同步助手 同步