內核虛擬機原理|網絡可編程

自 3.15 以來,您可能一直在關注內核社區中擴展的 Berkeley 包過濾器 (eBPF) 的開發,或者您可能仍然將 Berkeley 包過濾器與 Van Jacobson 在 1992 年所做的工作聯繫在一起。您可能已經使用 BPF 和 tcpdump 多年,或者您可能已經開始在您的數據平面中使用!本文從網絡性能的角度描述其關鍵發展,以及爲什麼現在這對網絡運營商、系統管理員和企業解決方案提供商變得重要,就像它自成立以來就一直適用於運營商的大型數據中心和雲計算網絡。

BPF 或 eBPF——有什麼區別?

虛擬機

從根本上說,eBPF 仍然是 BPF:它是一個小型虛擬機,運行從用戶空間注入並附加到內核中特定掛鉤的程序。它可以對網絡數據包進行分類和操作。多年來,它一直在 Linux 上用於過濾數據包並避免對用戶空間進行昂貴的複製,例如使用 tcpdump。然而,虛擬機的範圍在過去幾年中已經發生了翻天覆地的變化。

Classic BPF (cBPF),舊版本,由一個 32 位寬的累加器、一個也可以在指令中使用的 32 位寬的 “X” 寄存器和 16 個用作暫存存儲器的 32 位寄存器組成. 這顯然導致了一些關鍵限制。顧名思義,經典的伯克利包過濾器主要限於(無狀態)包過濾。任何更復雜的事情都將在其他子系統中完成。

eBPF 通過使用擴展的寄存器和指令集、添加映射(沒有任何大小限制的鍵 / 值存儲)、512 字節堆棧、更復雜的查找、幫助程序,顯着擴展了 BPF 的用例集可從程序內部調用的函數,以及鏈接多個程序的可能性。現在可以進行狀態處理,與用戶空間程序的動態交互也是如此。由於這種改進的靈活性,使用 eBPF 處理的數據包的分類級別和可能的交互範圍已大大擴展。

但新功能不能以犧牲安全爲代價。爲確保正確行使 VM 增加的責任,內核中實現的驗證程序已被修訂和合並。這個驗證器檢查代碼中的任何循環(這可能導致可能的無限循環,從而掛起內核)和任何不安全的內存訪問。它拒絕任何不符合安全標準的程序。每次用戶嘗試注入程序時,都會在實時系統上執行此步驟,然後將 BPF 字節碼 JITed 到所選平臺的本機彙編指令中。

圖 2. 主機上 eBPF 程序的編譯流程。部分支持的 CPU 架構未顯示。

爲了允許在 eBPF 的限制內難以實現或優化的任何關鍵功能,有許多幫助程序旨在協助執行過程,例如地圖查找或隨機數的生成。

鉤子 - 數據包在哪裏分類?

由於其靈活性和實用性,eBPF 的鉤子數量正在激增。但是,我們將重點關注數據路徑低端的那些。這裏的關鍵區別在於 eBPF 在驅動程序空間中添加了一個額外的鉤子。此掛鉤稱爲 eXpress DataPath,或 XDP。這允許用戶在將 skb(套接字緩衝區)元數據結構添加到數據包之前丟棄、反射或重定向數據包。性能可以提高約 4-5 倍。

圖 3. 高性能網絡相關 eBPF 鉤子與簡單用例的性能比較

將 eBPF 卸載到 NFP

圖 4. 包含 NFP JIT 的編譯流程(未顯示一些支持的 CPU 架構)

這可能的關鍵原因是因爲 BPF 機器映射到我們在 NFP 上的流處理內核的能力非常好,這意味着運行在 15-25W 之間的基於 NFP 的 Agilio CX SmartNIC 可以從主機卸載大量處理. 在下面的負載平衡示例中,NFP 處理的數據包數量與來自主機的近 12 個 x86 內核的總和相同,由於 PCIe 帶寬限制,主機在物理上無法處理數量(使用的內核:Intel Xeon CPU E5-2630 v4 @ 2.20GHz)。

圖 5. NFP 和 x86 CPU (E5-2630 v4) 上示例負載均衡器的性能對比

性能是使用 BPF 硬件卸載是編程 SmartNIC 的正確技術的主要原因之一。但這不是唯一的:讓我們回顧一下其他一些激勵措施。

  1. 靈活性:BPF 在主機上提供的主要優勢之一是能夠即時重新加載程序。這可以在運行的數據中心中動態替換程序。否則可能是樹外內核代碼或插入到其他一些不太靈活的子系統中的代碼現在可以輕鬆加載或卸載。由於不需要重新啓動系統的錯誤,這爲數據中心提供了顯着優勢:相反,只需重新加載調整後的程序即可。

這個模型現在也可以擴展到卸載。用戶能夠在流量運行時在 NFP 上動態加載、卸載、重新加載程序。這種在運行時動態重寫固件提供了一個強大的工具,可以被動地使用 NFP 的靈活性和性能。

  1. 延遲:通過卸載 eBPF,延遲顯着減少,因爲數據包不必跨越 PCIe 邊界。這可以改善負載平衡或 NAT 用例的網絡性能。請注意,通過避免 PCIe 邊界,在 DDoS 預防案例中還有一個顯着的好處,因爲數據包不再跨越邊界,否則可能會在構造良好的 DDoS 攻擊下形成瓶頸。

圖 6. 驅動程序中卸載 XDP 與 XDP 的延遲,注意使用卸載時延遲的一致性

  1. 用於對 SmartNIC 數據路徑進行編程的接口:通過能夠使用 eBPF 對 SmartNIC 進行編程,這意味着非常容易實現諸如速率限制、數據包過濾、不良行爲緩解或其他傳統 NIC 必須在芯片中實現的特性等特性. 這可以針對最終用戶的特定用例進行定製。
好的 - 這一切都很棒 - 但我如何實際使用它?

首先要做的是將內核更新到 4.16 或更高版本。我會推薦 4.17(撰寫本文時的開發版本)或更高版本,以利用盡可能多的功能。請參閱用戶指南以獲取最新版本的功能,以及如何使用它們的示例。

此處不贅述,還可以注意到,與 eBPF 工作流相關的工具正在開發中,並且已經在遺留 cBPF 版本方面得到了很大的改進。用戶現在通常會用 C 編寫程序,並使用 clang-LLVM 提供的後端將它們編譯成 eBPF 字節碼。也可以使用其他語言,包括 Go、Rust 或 Lua。對 eBPF 架構的支持被添加到傳統工具中:llvm-objdump 可以以人類可讀的格式轉儲 eBPF 字節碼,llvm-mc 可以用作 eBPF 彙編器,strace 可以跟蹤對 bpf() 系統調用的調用。其他工具的一些工作仍在進行中:binutils 反彙編器應該很快支持 NFP 微碼,而 valgrind 即將獲得對系統調用的支持。還創建了新工具:特別是 bpftool。

bpfilter

對於企業系統管理員或 IT 架構師來說,目前仍然懸而未決的一個關鍵問題是,這如何適用於擁有經過多年完善和維護且基於 iptables 的設置的最終用戶。更改此設置的風險在於,很明顯,某些事情可能難以接受,必須修改編排層,應該構建新的 API,等等。要解決這個問題,請進入提議的 bpfilter 項目。正如昆汀今年早些時候所寫:

_“這項技術是針對 Linux 中 iptables 防火牆的基於 eBPF 的新後端的提議。在撰寫本文時,它還處於非常早期的階段:它是由 David Miller(網絡系統的維護者)、Alexei Starovoitov 和 Daniel 於 2018 年 2 月中旬左右在 Linux netdev 郵件列表上作爲 RFC(徵求意見稿)提交的 Borkmann(內核中 BPF 部分的維護者)。所以,請記住,後面的所有細節都可能改變,或者根本無法到達內核! _

_從技術上講,用於配置防火牆的 iptables 二進制文件將保持不變,而內核中的 xtables 部分可以被一組新的命令透明地替換,這些命令需要 BPF 子系統將防火牆規則轉換爲 eBPF 程序。然後可以將該程序附加到與網絡相關的內核掛鉤之一,例如在流量控制接口 (TC) 或驅動程序級別 (XDP) 上。規則轉換將發生在一種新型內核模塊中,該模塊介於傳統模塊和普通 ELF 用戶空間二進制文件之間。運行在具有完全權限但不能直接訪問內核的特殊線程中,因此提供的攻擊面較小,這種特殊類型的模塊將能夠直接與 BPF 子系統通信(主要通過系統調用)。同時,使用標準用戶空間工具來開發、調試甚至模糊它仍然非常容易!除了這個新的模塊對象之外,bpfilter 方法的好處還有很多。藉助 eBPF 驗證程序,預計會提高安全性。重用 BPF 子系統可能會使該組件的維護比傳統的 xtables 更容易,並且可能會在以後提供與同樣依賴 BPF 的內核其他組件的集成。當然,利用即時 (JIT) 編譯,或可能的程序硬件卸載,將大大提高性能!” 重用 BPF 子系統可能會使該組件的維護比傳統的 xtables 更容易,並且可能會在以後提供與同樣依賴 BPF 的內核其他組件的集成。當然,利用即時 (JIT) 編譯,或可能的程序硬件卸載,將大大提高性能!” _

正在開發 bpfilter 作爲該問題的解決方案,它允許最終用戶無縫遷移到這種新的高性能範例。只需看下面:比較內核和一系列簡單的 iptables 規則的卸載到 NFP 與 iptables (netfilter) 後端、較新的 nftables、主機上的 bpfilter 並卸載到 SmartNIC ,下圖清楚地顯示了性能區別所在.

圖 7. bpfilter 與舊 iptables 實現的性能比較

概括

因此,我們有它。就目前而言,內核社區內正在產生的是一個巨大的網絡轉變。eBPF 是一個強大的工具,它爲內核帶來了可編程性。它可以處理擁塞控制(TCP-BPF)、跟蹤(kprobes、tracepoints)和高性能網絡(XDP、cls_bpf)。由於它在社區中的成功,可能會出現其他用例。除此之外,這種過渡一直延伸到最終用戶,他們很快就能無縫地離開舊的 iptables 後端,轉而使用更新的、更高效的基於 XDP 的後端——使用與今天相同的工具。特別是,這將允許直接的硬件卸載,並在用戶遷移到 10G 及以上網絡時提供必要的靈活性。

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