為什麼 eBPF 如此受歡迎?

語言: CN / TW / HK

eBPF 是一個基於暫存器的虛擬機器,最初是為過濾網路資料包而設計的,由於最初的 論文 [1] 是在伯克利實驗室(Lawrence Berkeley National Laboratory)寫的,所以被稱為 擴充套件的伯克利資料包過濾器(Extended Berkeley Packet Filter) ,也就是 eBPF。 本文將會用通俗易懂地語言給大家解釋 eBPF 為什麼這麼受歡迎。

eBPF 介紹

通俗地講,eBPF 是當有事件觸發時,在作業系統的核心中執行的自定義程式, 你可以把 eBPF 程式看成事件驅動的函式 (比如 AWS lamda, :point_right: OpenFunction )。eBPF 程式可以訪問核心函式的子集以及記憶體,當 eBPF 程式被載入到核心中時,會有一個驗證器來確保它是安全執行的,如果無法確認,就會被拒絕執行。也就是說, 即使是垃圾 eBPF 程式碼也不會讓核心崩潰

在容器世界裡,eBPF 正變得越來越流行,目前最流行的產品是 Cilium [2]Pixie [3] 。其中 Cilium 是基於 eBPF 的 CNI 外掛,同時還提供了 無需 Sidecar 的 Service Mesh [4]

而 Pixie 則專注於使用 eBPF 來實現可觀測性。

更多 eBPF 使用場景:

  • 除錯與追蹤:追蹤任意系統呼叫,核心函式,以及使用者空間的任意程序。代表工具: bpftrace [5]

  • 網路:監測、過濾、控制流量。使用者空間的程式可以在任意 Socket 上面附加一個過濾器,用來監測經過它的流量,並對其進行各種操作,比如允許通過、拒絕通過、重定向等等。

  • 安全監控與隔離:eBPF 程式可以監測並報告核心中發生的系統呼叫,也可以阻止應用在核心中執行某些系統呼叫(例如刪除檔案)。

儘管 Linux 早已支援上述的這些功能,但 eBPF 可以幫助我們更高效地執行這些任務,消耗的 CPU 和記憶體資源更少。

eBPF 為什麼這麼高效?

eBPF 程式比傳統程式“跑得”更快,因為它的程式碼是直接在核心空間中執行的。

設想這樣一個場景,假設一個程式想要統計其從 Linux 系統上傳送出去的位元組數,需要經過哪些步驟?

首先,網路活動發生時,核心會生成原始資料,這些原始資料包含了大量的資訊,而且大部分資訊都與“位元組數”這個資訊無關。所以,無論生成的原始資料是個啥,只要你想統計傳送出去的位元組數,就必須反覆過濾,並對其進行數學計算。這個過程每分鐘要重複數百次(甚至更多)。

傳統的監控程式都執行在使用者空間,核心生成的所有原始資料都必須從核心空間複製到使用者空間,這種資料複製和過濾的操作會對 CPU 造成極大的負擔。這就是為什麼 ptrace 很“慢”,而 bpftrace [6] 很”快“。

eBPF 無需將資料從核心空間複製到使用者空間,你可以直接在核心空間執行監控程式來聚合可觀測性資料,並將其傳送到使用者空間。eBPF 也可以直接在核心空間過濾資料以及建立 Histogram,這比在使用者空間和核心空間之間交換大量資料要快得多。

eBPF 對映(eBPF Map)

eBPF 還有一個黑科技,它會使用 eBPF 對映 (eBPF Map)來允許使用者空間和核心空間之間進行雙向資料交換。在 Linux 中,對映(Map)是一種通用的儲存型別,用於在使用者空間和核心空間之間共享資料,它們是駐留在核心中的鍵值儲存。

對於可觀測性這種應用場景,eBPF 程式會直接在核心空間進行計算,並將結果寫入使用者空間應用程式可以讀取/寫入的 eBPF 對映中。

現在你應該理解為什麼 eBPF 這麼高效了吧?主要還是 eBPF 提供了一種直接在核心空間執行自定義程式,並且避免了在核心空間和使用者空間之間複製無關資料的方法。

參考資料

  • What Is eBPF? [7]

引用連結

[1]

論文: https://www.tcpdump.org/papers/bpf-usenix93.pdf

[2]

Cilium: https://github.com/cilium/cilium

[3]

Pixie: https://github.com/pixie-io/pixie

[4]

無需 Sidecar 的 Service Mesh: https://cilium.io/blog/2021/12/01/cilium-service-mesh-beta

[5]

bpftrace: https://github.com/iovisor/bpftrace

[6]

bpftrace: https://github.com/iovisor/bpftrace

[7]

What Is eBPF?: https://www.oreilly.com/library/view/what-is-ebpf/9781492097266/

雲原生是一種信仰 

關注公眾號

後臺回覆◉k8s◉獲取史上最方便快捷的 Kubernetes 高可用部署工具,只需一條命令,連 ssh 都不需要!

點選  "閱讀原文"  獲取 更好的閱讀體驗!

發現朋友圈變“安靜”了嗎?