高效能網路框架之XDP技術

2023.11.02

高效能網路框架之XDP技術

XDP借助eBPF虛擬機技術在網卡驅動層實現高效能網路框架,且其原生運作在核心態可直通核心TCP/UDP協定堆疊。XDP作為一種資料面高效能框架技術為平衡高速資料處理和協定棧相容開闢了一個新的道路。

1.XDP的基本概念

XDP全名為eXpress Data Path,即快速資料路徑,是Linux核心提供的高效能、可程式化的網路封包處理框架。XDP會直接接管網卡的RX方向資料包,透過在核心執行eBPF指令快速的處理封包並無縫對接核心協定棧。

XDP不是核心旁路,是在網卡和核心協定棧之間增加了一個快速資料路徑。XDP借助於eBPF技術從而繼承了其可編程、即時實現、安全等優良特性。

XDP智慧網卡是XDP概念的延伸。在支援eBPF指令的智慧網路卡上,將CPU上XDP對應的eBPF指令下沉載入到智慧網路卡,這樣可以同時實作CPU資源節約和規則硬體卸載。

XDP借助eBPF技術提供了一個高效能網路處理框架,使用者根據標準eBPF程式指南來自訂網路處理行為。同時核心新增AF_XDP協定族,在核心XDP框架中被配對的資料包透過其送抵用戶態,這又將XDP的支援從核心拓展到用戶態應用場景。

2.XDP的整體框架

如下圖1,我們透過XDP整體框架圖來展示其在內核系統中的相對位置以及其如何滿足資料平面開發框架的要求。

圖1 XDP整體框架圖

圖1包含了網卡設備、XDP框架、TCP/IP協定棧、Socket介面、應用層等各個層面,涵蓋了網路封包從網卡到服務端的資料流全過程。圖1中間的灰色部分(XDP Packet Processor)是XDP框架,其資料面處理單元在核心中的相對位置處於網路卡驅動和協定堆疊之間,實際運作在驅動層。從網卡到CPU處理器的網路封包經由網卡驅動首先到達XDP框架,被運行在XDP框架中的用戶自訂eBPF程式處理,封包的處理結果為丟棄(Drop)、轉送(Forward)、本地接受(Receive Local)等,結果為本地接受的網路封包延續原有核心路徑繼續進入TCP/IP協定棧處理,結果為轉送或丟棄的網路封包則直接在XDP框架中直接處理(這部分流量在現實網路中佔據大頭,其執行路徑相對傳統的核心路徑被大大縮短)。圖1中間灰色部分(XDP Packet Processor)中的黑色虛線展示了上層控制對XDP框架中的eBPF程式進行載入/更新/配置等通道能力,核心提供對應的系統呼叫來實現控制面對資料面的管控。圖1XDP整體架構圖完整的展示了XDP作為一個高效能網路資料面和控制面集合的整體架構。

3.XDP應用開發介紹

XDP框架以eBPF技術為基礎。BPF是一個通用目的RISC指令集。1992年,BPF第一次在Berkeley實驗室被提出。2013年,BPF被加強從而得到eBPF,並在2014年正式併入Linux核心。eBPF提供了一種在各種核心和應用事件發生時運行一小段程式的機制。如下圖2,我們講述eBPF的開發/運作流程及在XDP上的具體應用。

圖2 典型eBPF開發、運作流程圖

圖2展示了一個典型的eBPF開發、運作全過程。開發者用C語言的子集(核心運行,不可用標準C函式庫)開發程序,然後用LLVM/clang編譯器將其編譯成eBPF指令(Bytecode),在eBPF驗證器(Verifier)檢驗通過後被核心中的即時編譯器(JIT Compiler)將eBPF指令映射成處理器的原生指令(opcode)再載入到核心各個模組預設的鉤子(Hooks)處。其中XDP框架是核心在網路卡驅動開啟的一個網路資料快速路徑的鉤子(Hooks)。核心其他典型鉤子(Hooks)分別為核心函數(kprobes)、用戶空間函數(uprobes)、系統呼叫、fentry/fexit、追蹤點、網路路由、TC、TCP擁塞演算法、套接字等模組。

XDP是核心基於eBPF實現對網路快速路徑的一個具體應用。下圖3我們羅列了核心中支援eBPF鉤子(Hooks)節點的典型應用。

圖3 eBPF支援眾多核心鉤子應用

相較於傳統的用戶態/內核態程序,eBPF/XDP有以下典型特徵:

(1)如下圖4所示,核心即時編譯器(in-kernel JIT Compiler)會將eBPF字節碼映射成效能更優的處理器原生指令以實現高效能,同時其程式校驗器(verifier)會校驗程式安全性並提供沙箱運作環境。其安全檢查包含判斷是否有循環,程式長度是否超過限制,程式記憶體存取是否越界,程式是否包含不可達的指令等。最強優勢是可以在不中斷工作負載下實現即時更新。

圖4 eBPF載入、檢驗、編譯示意圖

(2)eBPF程式的核心態與用戶態資料交換透過​​BPF maps來實現,其類似進程間通訊的共享記憶體存取。其支援的資料類型有Hash表、陣列、LRU快取(Least Recently Used)、 環形佇列、堆疊軌跡、LPM路由表(Longest Prefix match)。如下圖5所示,BPF Map承擔了使用者態和核心態的資料互動角色。

圖5 BFP Map銜接用戶態與內核態的資料交互

(3)eBPF透過提供輔助函數來彌補標準C函式庫的缺失。常見的如取得隨機數、取得目前時間、map存取、取得進程/cgroup上下文、處理網路封包和轉送、存取套接字資料、執行尾呼叫、存取進程堆疊、存取系統呼叫參數等,在實際開發中可透過man bpf-helpers指令取得更多協助資訊。下圖6展示了一個bpf命名開頭的獲取隨機數輔助函數。

圖6 BPF輔助函數範例-取得隨機數

(4)相較於純內核kmodule等開發模式,eBPF提供了獨特的尾呼叫和函數呼叫機制。因受核心堆疊空間寶貴及eBPF不支援循環,遞歸深度限制(最大32)等原因,eBPF引入尾呼叫和函數呼叫來實現eBPF程式間跳轉。尾呼叫和函數呼叫機制對效能最佳化做了充分設計,其中尾呼叫能重複使用目前的堆疊幀並跳轉至另外一個eBPF程序,具體細節請參考bpf_tail_call輔助函數使用手冊。由於eBPF程式彼此獨立,尾呼叫機制在事實上給了開發者以函數為單元的編排能力。從Linux 4.16和LLVM 6.0開始,eBPF開始支援函數調用,並且在核心5.9以後支援尾調用和函數調用的協同工作。尾呼叫的缺點是產生的程式鏡像大但是省記憶體;函數呼叫的優點是鏡像小但是記憶體消耗大。開發者可依實際需求靈活選擇不同的方式。下圖7展示了eBPF程式尾調用和函數調用的混合協作過程,其中tail call為尾調用,bpf2bpf call為函數調用。

圖7 eBPF程式尾呼叫和函數呼叫的混合協作圖7 eBPF程式尾呼叫和函數呼叫的混合協作

4.XDP的同類技術對比

以目前最廣泛使用的用戶態資料面開發框架DPDK為對標,我們透過以下資料流程圖來說明XDP和DPDK的實現差異。如下圖8,DPDK完全旁路核心且運行在用戶態,XDP在核心中運行在網卡和核心協定棧之間。DPDK是脫離核心的一個全新資料平面開發框架,而XDP則是依附於核心的一個快速資料路徑(相較於原先的核心網路慢路徑)。

圖8 資料流在XDP和DPDK資料平面上的走向差異

如下是XDP和DPDK具體的比較:

(1)DPDK會獨佔CPU資源且需要大頁記憶體。XDP對CPU不獨佔也不需要大頁記憶體。XDP對硬體的需求較DPDK更低。

(2)以DPDK為資料面架構的專案會是重開發人力資源投入,可參考典型專案FD.IO(VPP)和OVS-DPDK。XDP為核心原生自帶的快速資料通道,為輕量級資料面框架。

(3)DPDK需要網卡驅動和用戶態協定棧等各層面的程式碼支援和許可證支援。XDP直接由Linux基金會維護和發布,具體技術生態由其子專案IO Visor來維護。

(4)DPDK在大容量高吞吐等場景有優勢。XDP在雲端原生等場景有優勢。

目前XDP有以下應用場景的典型項目:

  • DDoS防禦
  • 防火牆
  • 基於XDP的負載平衡
  • 協定堆疊前處置
  • 雲端原生應用程式服務最佳化(如對K8S,OpenStack,Docker等服務改進專案)
  • 流量控制

5.基於eBPF/XDP的著名開源項目

Cilium是使用eBPF和XDP為容器提供快速的核心內網路和安全策略實施的開源專案。Cilium專案為Pod和外部服務之間的流量實現了分散式負載平衡,並且能夠完全取代kube-proxy,在eBPF中使用高效的雜湊表,允許幾乎無限的擴展。它還支援高級功能,如整合入口和出口網關、頻寬管理和服務網格,並提供深度網路和安全可見性和監控。

如下圖9所示,eBPF/XDP(小蜜蜂)處於容器、Pod等服務和網路卡之間,透過XDP技術來改善上層服務的效能和安全,其非常巧妙且安全的在內核資料流節點動態完成之前內核無法完成的工作。

圖9 Cilium專案組件分佈圖

圖10展示了Cilium專案中分別透過XDP和eBPF在內核網卡和Socket層實現功能改善的一個具體案例。圖10左邊是在網卡驅動層XDP框架植入用戶態網路處理程式碼,右邊是在Socket層插入套接字處理程式碼,這樣既可以在不修改內核的前提下實現功能動態拓展又實現了對上層容器、Pod等典型節點應用的無感知功能升級。

圖10 Cilium專案中透過XDP和eBPF對內核進行功能擴展示意圖


Cilium專案為雲端原生場景下的服務效能提升和安全性改進等方面提供了一個非常好的模範解決方案。如圖11,各類常見的雲端原生服務都得益於eBPF/XDP來實現效能提升與安全性改善。

圖11 eBPF/XDP在Cilium專案中的核心價值圖11 eBPF/XDP在Cilium專案中的核心價值

6.DP的發展前景

為實現靈活的資料平面和加速NFV應用,Linux基金會成立子項目IO Visor以實現基於Linux內核延伸出一個開放可編程的網絡數據面開源項目,XDP屬於IO Visor項目的子項目。Linux核心沒有虛擬化是IO Visor在NFV場景下最大的挑戰,XDP透過eBPF虛擬機器即時實現技術來彌補這個缺陷。但是幾乎所有的虛擬機器都運行在用戶空間,受制於eBPF虛擬機在內核運行的安全性要求,將虛擬化相關的任務移植到核心空間會是比較大的挑戰。

在效能改進方面, Sebastiano Miano等人於2019年使用XDP和TC鉤子掛載eBPF程式實現了Linux的防火牆iptable,在規則數量提高的情況下提供相比原始iptable高數倍甚至數十倍的效能。Yoann Ghigoff等人於2021年更是基於eBPF和XDP、TC在核心中實現了一層Memcached的緩存,達到了比DPDK核心旁路方案還要高的效能。

XDP計畫在傳統核心模型和全新用戶態框架之間開盤了新的道路,以填補新技術跨度過大帶來的資源投入陷阱。我們看到微軟在2022年宣布計畫在Windows平台開始支援XDP技術。隨著整個生態環境的逐步完善,XDP帶來的輕量級、即時實現、高性能通道、安全可靠等能力日益發揮更大的價值。

中國行動智慧家庭中心將保持對XDP技術的密切跟踪,從技術層面持續跟踪產業的發展方向,對新興技術保持開放的心態並積極擁抱新技術,推動產業界透過新興技術為廣大人民群眾帶來實實在在的數智化服務。