顛覆傳統、應用大爆發,eBPF 何以改變 Linux?

infoq 發佈 2024-04-09T02:57:51.519821+00:00

作者 | 凌敏eBPF 毫⽆疑問是當下最⽕的技術之⼀。2014 年,eBPF 首次出現在 Linux 內核中。經過社區不斷疊代,目前,eBPF 在技術上已經成熟,並在故障診斷、⽹絡優化、安全控制、性能監控等領域獲得⼤量應⽤,項⽬數量呈爆炸式增⻓。

作者 | 凌敏

eBPF 毫⽆疑問是當下最⽕的技術之⼀。2014 年,eBPF 首次出現在 Linux 內核中。經過社區不斷疊代,目前,eBPF 在技術上已經成熟,並在故障診斷、⽹絡優化、安全控制、性能監控等領域獲得⼤量應⽤,項⽬數量呈爆炸式增⻓。在此前的採訪中,有不少受訪專家對 InfoQ 表示,eBPF 的發展前景廣闊,屬於 eBPF 的時代已經來臨。


那麼,eBPF 技術到底為 Linux 帶來了哪些改變?為什麼近幾年突然爆火?國內外發展和落地情況如何?如何預防和處理 eBPF 帶來的安全問題?近期,InfoQ 採訪了⻄安郵電⼤學教授、⻰蜥社區 eBPF 技術探索 SIG Owner 陳莉君教授,以期進一步了解 eBPF 技術特性以及應⽤實踐。

從 BPF 到 eBPF


InfoQ:eBPF 是從 BPF 技術擴展⽽來的,您能簡要介紹下它的發展歷程嗎?


陳莉君教授:最早可以追溯到 1992 年。在 1992 年 USENIX 會議上,論文「The BSD Packet Filter: A New Architecture for User-level Packet Capture」提出了革命性的包過濾機制 BSD Packet Filter(簡稱為 BPF),這比當時最先進的數據包過濾技術還快 20 倍。這主要得益於 BPF 的兩大設計:第一,內核態引入一個新的虛擬機,所有指令都在內核虛擬機中運行;第二,用戶態使用 BPF 字節碼來定義過濾表達式,然後傳遞給內核,由內核虛擬機解釋執行。


在 Linux 2.1.75 中,首次引入了 BPF 技術。在 Linux 3.0 中,增加了 BPF 即時編譯器,它替換掉了原本性能更差的解釋器,進一步優化了 BPF 指令運行的效率。


2014 年,Alexei Starovoitov 將 BPF 擴展為一個通用的虛擬機,也就是 eBPF。eBPF 不僅擴展了寄存器的數量,引入了全新的 BPF 映射存儲,還在 4.x 內核中將原本單一的數據包過濾事件逐步擴展到了內核態函數、用戶態函數、跟蹤點、性能事件(perf_events)以及安全控制等。


eBPF 的誕生是 BPF 技術的一個轉折點,使得 BPF 不再僅限於網絡棧,而是成為內核的一個頂級子系統。


具體來看,eBPF 有以下幾個重要特性:


  • 性能優化:eBPF 允許在內核空間運行用戶空間代碼,它可以實現很多低級別的操作,而且執行速度非常快。
  • 安全:它可以限制程序執行的內存和 CPU 資源,防止惡意程序占用系統資源或對系統造成危害。
  • 功能豐富:支持網絡數據包過濾、路由、負載均衡、跟蹤、性能分析等,這使得它能夠在很多領域得到應用。
  • 開源社區的力量:隨著 eBPF 功能的不斷擴展,開源社區的開發者和用戶也在不斷增加,這為 eBPF 的發展創造了很多機會。


InfoQ:為什麼 eBPF 在近⼏年突然⽕了起來?背後有哪些因素助推?


陳莉君教授:eBPF 近幾年爆火的背後,有以下幾個因素助推:


  • eBPF 技術本身具有的優越性,能夠給內核帶來性能提升、擴展性、安全性等。
  • 越來越多的 SaaS 平台和應用程式的出現,需要實時監控和調優,而 eBPF 的實時性能分析可以很好的滿足此類需求。
  • eBPF 提供了一種新的靈活性,可以集中地管理和監控大量服務。這使得系統運維人員更容易應對許多運維問題,而不需要花費大量的時間進行調查和調整。
  • eBPF 可以收集、分析、運用巨量數據,為公司提供可視化的監控和預測,這將帶來前所未有的管理優勢。
  • 雲計算和容器化計算技術的普及,使得 eBPF 可以與容器技術緊密結合,更方便的收集容器內的性能和狀態數據;
  • 谷歌和其他巨頭公司使用 eBPF 作為它們的跟蹤技術和監控解決方案,這給它賦予了更大的價值和關注度。

eBPF 如何改變 Linux?


InfoQ:作為⼀項⾰命性的技術,eBPF 為 Linux 帶來了哪些改變?它是如何⼯作的?


陳莉君教授:eBPF 在 Linux 中有多項改變,如提高內核靈活性,可以在不需要重新編譯內核的情況下實現系統功能的快速修改和擴展;改善安全性,eBPF 應用可以進行精確的安全檢查,從而提供更好的內核安全性,以及檢測和防止內核攻擊;改善性能,eBPF 允許開發者構建內核性能數據採集程序,從而使內核性能數據採集變得更加簡單,可用於檢測內核性能問題,如異常、調試、性能分析等。


eBPF 是 Linux 內核中軟體實現的虛擬機,其工作原理是:用戶把 eBPF 程序編譯為 eBPF 指令,然後通過 bpf() 系統調用將 eBPF 指令加載到內核的特定掛載點,由特定的事件來觸發 eBPF 指令的執行。在掛載 eBPF 指令時內核會進行充分驗證,避免 eBPF 代碼影響內核的安全和穩定性。另外內核也會進行 JIT 編譯,把 eBPF 指令翻譯為本地指令,減少性能開銷。


內核在網絡處理路徑上中預置了很多 eBPF 的掛載點,例如 XDP、qdisc、tcp-bpf、socket 等。eBPF 程序可以加載到這些掛載點,並調用內核提供的特定 helper 函數來修改和控制網絡報文。eBPF 程序可以通過 map 數據結構來保存和交換數據。


InfoQ:⽬前 eBPF 主要有哪些成熟的應⽤場景?


陳莉君教授:eBPF 的性能和穩定性使它成為一種非常強大的內核性能調優工具,它的主要應用場景有:


  • 網絡跟蹤:eBPF 可以讓用戶在內核中捕獲和分析數據包,從而對網絡進行性能跟蹤。
  • 性能監控:eBPF 可以通過實時監控系統性能數據(如 CPU 利用率、內存使用情況等),幫助用戶診斷和解決系統問題。
  • 系統安全:eBPF 可以用於實現防火牆規則、安全監控等安全功能。
  • 資源分配:eBPF 可以用於動態分配系統資源,例如根據網絡流量動態調整網絡緩衝區大小。
  • 網絡優化:eBPF 可以用於實現網絡優化,例如通過讀取 TCP 連接信息來調整 TCP 參數以提高網絡性能,還有實現負載均衡、容器網絡管理等。


InfoQ:國內外 eBPF 技術發展和落地情況如何?有哪些值得關注的開源項⽬?


陳莉君教授:在國內外,eBPF 得到了快速發展,尤其是在網絡領域,它已經被廣泛應用於各種網絡設備、作業系統、容器平台、SDN 以及 NFV 等領域。


eBPF 的開源項目,最典型的就是 iovisor 帶來的 BCC、bpftrace 等工具,成為 eBPF 在跟蹤和診斷領域的最佳實踐。Cilium、Katran、Falco 等一系列基於 eBPF 優化網絡和安全的開源項目也逐步誕生。最流行的網絡解決方案之一 Calico,就在最近的版本中引入了 eBPF 數據面網絡,大大提升了網絡的性能。


開發者可以重點關注以下開源項目:


  • BCC:BCC 是一種開源的 eBPF ⽂件工具集,可以幫助開發者創建、分析和調試系統性能監控工具。BCC 還提供比 Tcpdump 和 iptables 更強大的數據包處理能力。
  • Cilium:用於透明地保護容器應用之間的網絡連接。Cilium 基於 eBPF 技術開發,因此集成了 eBPF 的大部分特性和優點,提供負載均衡和監控、排障等非常多的功能。
  • Falco:可以實現對調用行為的監控,並依賴於強大的規則引擎,對異常的系統調用行為進行告警。
  • Coolbpf:以 CO-RE(Compile Once--Run Everywhere)為基礎實現,保留了資源占用低、可移植性強等優點,還融合了 BCC 動態編譯的特性,適合在生產環境批量部署應用。支持在同一個 eBPF 程序,運行在 5.x、4.x,甚至 3.10 的內核上。
  • LMP 項目:LMP(Linux 顯微鏡)基於 eBPF 探索和孵化更多的創新項目,形成對 Linux 內核深入探索和細粒度觀察,給初學者探索和學習提供一種項目超市。


InfoQ:由您領銜成⽴了業界⾸個產學研 eBPF 技術探索 SIG,這個 SIG 組成⽴的初衷是什麼?⽬前取得了哪些研究進展?


陳莉君教授:eBPF 技術探索 SIG 致力於深入研究分析 BPF 前沿技術和產學研界發展,增強 Networking、Tracing、Observability、Security 四個緯度技術深度和落地效果,打造國內最有影響力的 BPF 項目和社區。SIG 成立的初衷是推動 eBPF 技術在國內的應用和發展,做國內領先者社區,國際上協同和對標 eBPF 知名社區。通過技術創新和技術合作,降低 eBPF 的學習和使用門檻,為高校師生、eBPF 技術愛好者、Linux 從業者提供工具和平台,打造創新的 eBPF 技術落地到 Linux 內核社區。


eBPF 技術探索 SIG 在以下幾方面取得了不錯的進展:


  • 首屆 eBPF 中國研討會誕生:為廣大 eBPF 愛好者提供了交流平台和前沿技術分享機會,各類開源項目集中亮相,為 eBPF 技術在國內的發展提供了無限可能。
  • 雲棲大會龍蜥作業系統峰會 eBPF 專場活動舉行:線下參與技術討論,助力 eBPF 技術的蓬勃發展。
  • 社區項目 Coolbpf 和 Eunomia 的結合,進一步推動低門檻和易部署的 eBPF 技術落地,同時 eBPF 和 WASM 技術的融合成果得到了落地,編寫和運行 eBPF 代碼將變得輕而易舉。
  • 提出遠程編譯和本地編譯的容器服務,以及低版本內核支持 eBPF 的能力,讓使用者更加專注自身 eBPF 功能開發,不必關注編譯和執行環境的複雜性。即將推出輕量級 BPF 字節碼生成方式,讓 Coolbpf 也支持腳本化的方式運行,卻不必安裝 LLVM/Clang 編譯依賴庫。
  • Linux 顯微鏡(LMP)項目在現有基於 eBPF 的 20 多個相關工具基礎上,探索和孵化更多的 eBPF 創新項目、相關工具;繼續深入產學研融合,進一步完善 ORAS 和 OCI 鏡像相關的支持;重構並遷移現有的 eBPF 工具,提供完整的、開箱即用的分析工具組件;在 eBPF 開 發積累的過程中,開發 eBPF 相關通用組件,在進程調度和文件系統方面,落地基於 eBPF 的 Linux 內核微內核化。


InfoQ:下⼀步,⻰蜥社區 eBPF 技術探索 SIG 有哪些探索和發展規劃?


陳莉君教授:龍蜥社區 eBPF 技術探索 SIG 將進一步致力於 eBPF 前沿技術的研究,以及把 eBPF 這項技術更多的應用於高校師生、eBPF 技術愛好者,降低學習和入門難度,以及部署的簡易化。


  • 將 eBPF 與其他技術(如微服務)集成,以便在複雜的應用場景中獲得更佳的效果,在可觀測領域有更多工具和平台湧現。
  • 實現更加高效和簡潔的 eBPF 編譯器,不需要安裝太多的依賴庫。
  • 針對內核領域,更多功能進行 eBPF 定製,如路由、Netfilter、流量管理等功能。
  • 開發一些易於使用的 eBPF 工具,以便用戶更好地理解和使用 eBPF 技術。
  • WASM 和 eBPF 兩個應用生態進一步完美結合。


SIG 將通過雙周會的形式,定期和大家匯報 eBPF 領域和 Linux 內核領域當前國內外的研究熱點和技術新聞;通過線上線下分享的形式,保持技術領先性和持續關注度;通過線下 Meetup 或者峰會的形式,拉進 SIG 成員的距離,形成良好的共同探討技術的氛圍。

如何預防和處理 eBPF 帶來的安全問題?


InfoQ:eBPF 是萬能的嗎?它存在哪些限制?是否也會給開發者帶來⼀些相應的挑戰?


陳莉君教授:eBPF 雖然強大,但不是萬能的,同開發普通的應用程式相比,它存在著很多的限制,往往會給開發者帶來一定的不便。比如,eBPF 指令集有限,這意味著它沒有辦法去完成某些複雜的任務,如複雜的字符串處理、循環等;eBPF 棧空間大小有限,而且只有 512 字節,帶來了開發上的不便;eBPF 能夠調用的函數比較有限,只能調用內核提供的 helper 函數,無法像開發其它應用程式一樣任意地調用三方庫;eBPF 程序調試功能較弱,導致無法快速定位編寫程序時出現的 bug。


InfoQ:eBPF 帶來的安全問題同樣值得關注,⽐如會有惡意程序利⽤ eBPF 進⾏偽裝,對於這種可能會發⽣安全事件,我們應當如何預防和解決呢?


陳莉君教授:eBPF 作為內核技術,具有很高的權限和擴展性,因此也需要相應的安全措施。一些常見的安全威脅包括:惡意代碼執行,通過構造惡意的 eBPF 程序,可以在內核環境中執行任意代碼,這是一個嚴重的安全問題;數據泄露,不當的 eBPF 程序可能會泄露系統敏感信息,這包括內存中的數據和網絡流量;內存損壞:eBPF 程序可以直接訪問內存,如果程序不正確,可能導致內存損壞,導致系統崩潰。


為了預防和處理這些威脅,應該採取以下措施:


  • 對 eBPF 程序進行審核:在加載 eBPF 程序之前,應該對其進行審核,確保它是安全的。eBPF 的 verifier 一直在做更多的權衡和考慮,對程序進行安全校驗。
  • 限制 eBPF 程序的權限:應該通過使用 eBPF 的安全模型,限制 eBPF 程序的權限,例如,限制它只能讀取特定的數據。
  • 使用沙盒技術:使用沙盒技術,隔離 eBPF 程序,防止它對系統造成危害。
  • 實施監控:通過實施監控,監測 eBPF 程序的行為。

開發者如何更好地學習 eBPF 技術?


InfoQ:對於開發者來說,如何才能更好地學習 eBPF?


陳莉君教授:首先要掌握 Linux 系統作業系統知識,再了解 eBPF 的大概原理,它是一種 Linux 內核可擴展性技術,它允許用戶探索系統行為,以便在內核中運行自己的程序。此外,還要了解 eBPF 的關鍵概念,包括 BPF 程序、套接字程序、文件和目錄程序、日誌程序、安全程序、跟蹤程序、XDP 程序,等等。


熟悉 eBPF 的程式語言,eBPF 程序使用 C 來編寫(用戶空間程序可以採用 Go、Rust 等語言),並且可以通過用戶空間庫調用它們的特定功能。可以使用 LLVM、clang、gcc 等編譯器來編譯 eBPF 程序。目前,龍蜥社區推出的 Coolbpf 項目,可以簡化這部分的開發工作。


了解 eBPF 調試工具,例如 BCC/bpftrace,Kprobes、bpftool 等,這些工具可以幫助開發者在使用 eBPF 時開發和調試程序。


根據開發者自身的情況,選擇合適的 eBPF 程序,然後開始學習並編寫自己的 eBPF 程序。此外,還可以查看其他開發者的代碼,以便獲得更多的靈感。


InfoQ:Linux 得以成功的關鍵是什麼?今年有哪些值得關注的 Linux 及 eBPF 動態?


陳莉君教授:Linux 得以成功,主要得益於其開源自由、社區參與貢獻、技術性能與安全性能兼備的特點。此外,Linux 發展在中國也吸引了眾多行業領域的參與,形成了一個良好的生態環境,這也是其成功的重要原因。


值得關注的一些 Linux 及 eBPF 動態:


  • Linux 支持 eBPF 調度策略的定製。eBPF 調度策略系列補丁將會進一步提升這個功能的穩定性,預計今年會有比較多的實際應用呈現。通過編寫 (e)BPF 程序對 Linux 內核的任務調度決策進行定製可以幫助開發人員更快地試驗和探索新的調度策略,使得內核的調度策略更貼近實際應用的需要。
  • eBPF 社區和 WASM 社區的融合:目前國內有很多項目在做這兩個技術的融合,例如 Eunomia 的 wasm-bpf 項目。
  • 開源 AI 和機器學習熱度繼續:更多開源 AI 和機器學習工具和項目的發展,以滿足對這些技術的需求。ChatGPT 風靡全球,更多的企業和個人投入到機器學習和人工智慧大潮中,加速更多平台和新的項目推出和演進,也將使 Linux 進一步得到加速和深度應用。
  • 雲原生和可觀測技術興起:雲原生技術的發展對 Linux 內核技術和 eBPF 技術具有很大的推動作用,基於 eBPF 的無侵入機制應用在可觀測領域,具有非常大的想像空間。


本文轉載來源:

https://www.infoq.cn/article/5xvC1Ic6BdLQYju6YWV0

關鍵字: