一文讀懂Linux網絡新基石——XDP技術
Labs 導讀
隨著1000Mbps/10Gbps/40Gbps高速率網卡的普及,Linux內核協議棧在海量數據、低時延的場景下顯得力不從心,其復雜冗余的包處理邏輯,使得性能瓶頸變的尤為突出。故而針對內核協議棧的各種優化接踵而來,但實際效果卻不明顯,于是乎kernel bypass技術應運而生,而DPDK就是其高性能網絡應用開發解決方案中的佼佼者,并逐漸成為了獨樹一幟的成熟技術體系。但是DPDK并不能與Linux Kernel的技術生態很好的結合,與現有操作系統集成的難度較大。
Part 01、 XDP概述
XDP(eXpress Data Path,快速數據面)是近些年興起的網絡數據面技術,為Linux內核提供高性能、可編程的網絡數據包處理框架。本質上是Linux Kernel中的一個eBPF Hook(鉤子),可以動態掛載,使得ebpf程序能夠在數據報文到達網絡驅動層時提前進行針對性的高速處理。XDP可以與內核協同工作,既可以繞過繁瑣的TCP/IP協議棧,也可以復用TCP/IP協議棧以及內核基礎設施。由于其較早的收包路徑,對于快速識別丟棄報文具有很高的性能,廣泛應用于DDoS防御、防火墻、負載均衡等領域。
而AF_XDP作為一種內核的協議族可以與XDP進行交互,實現XDP收包重定向至AF_XDP指定的UMEM,使得用戶態應用可以通過AF_XDP Socket完成數據幀的讀取和寫入。
Part 02、 XDP架構設計
XDP系統主要有五個組成部分:
1??XDP driver hook
即網卡驅動中的一個XDP程序的掛載點,運行于網絡設備驅動中,由于其駐留在內核空間,無需上下文切換,更加安全、快速,每當網卡接收到一個數據包就會執行這個XDP程序。XDP程序可以對數據包進行逐層解析、按規則進行過濾,或者對數據包進行封裝、解封裝、轉發等。根據不同的工作模式其掛載點也不同,如下圖所示,根據網卡支持情況有三處掛載點(藍色方框內):
圖片
- Native XDP(默認):即驅動模式,在這種模式中,XDP BPF 程序直接運行在網絡驅動的早期接收路徑上,需要驅動支持。
- Offloaded XDP:在該模式下XDP BPF程序直接offload到網卡,相較于Native,具有更高的性能,需要網卡支持。
- Generic XDP:對于還沒有實現Native或Offloaded XDP的驅動,內核提供了一個Generic XDP選項。該模式下的XDP BPF Program運行于驅動程序之后的位置,無需驅動程序的支持,但性能較差,主要面向測試程序的開發者。
2??eBPF虛擬機
XDP程序通過Clang編譯成BPF字節碼,而BPF字節碼加載到內核中是運行在eBPF虛擬機上,eBPF VM支持XDP程序的動態加載和卸載。
3??BPF maps
內核中的key/value存儲,作為圖中各系統的主要通信通道,類似于進程間通信的共享內存訪問。用戶態程序可以在BPF Maps中預定義規則,XDP程序可以匹配Maps中的規則對數據包進行過濾等;XDP程序也可以將數據包統計信息等存入Maps,用戶態程序可訪問Maps獲取數據包統計信息。
4??eBPF verifier
由于eBPF代碼直接運行在內核地址空間,此它能直接訪問(破壞)任何內存。為防止這種情況發生,Verifier(程序校驗器)需要在XDP字節碼加載到內核之前對字節碼進行安全檢查。
5??XDP Action
XDP程序對于報文的處理有如下幾種方式:
- XDP_DROP:在驅動層丟棄報文,通常用于實現DDos或防火墻。
- XDP_PASS:允許報文上送到內核網絡棧,同時處理該報文的CPU會分配并填充一個skb,將其傳遞到內核協議棧。
- XDP_TX:從當前網卡發送出去。
- XDP_REDIRECT:將包重定向到其他網絡接口(包括虛擬機的虛擬網卡),或者通過AF_XDP socket重定向到用戶空間。
- XDP_ABORTED:表示程序產生了異常,其行為和XDP_DROP相同,但XDP_ABORTED會經過trace_xdp_exception tracepoint,因此可以通過tracing工具來監控這種非正常行為。
下圖基于XDP/AF_XDP系統數據流示例圖。實線為數據面流向,虛線的控制面流向。
網卡收到包之后,會先執行掛載的XDP eBPF程序,用戶態應用在此之前通過bpf map下放規則,XDP收到數據包之后讀取bpf map中的規則實現數據包的過濾分發,即xdp action處理,是DROP,重定向到AF_XDP,還是PASS到內核協議棧。
從圖中可以看出,不同eBPF程序之間可以通過BPF maps進行通信,并且內核態也可以通過BPF map與用戶態應用進行交互,從而實現數據共享。
Part 03、 VPP的擴展性
XDP專為高性能而設計,相較與DPDK來說,具有以下優點:
- 無需專門硬件,無需大頁內存,無需獨占CPU等資源,任何有Linux驅動的網卡都可以支持,無需引入第三方代碼庫。
- 兼容內核協議棧,可選擇性復用內核已有的功能。
- 保持了內核的安全邊界,提供與內核API一樣穩定的接口。
- 無需對網絡配置或管理工具做任何修改。
- 服務不中斷的前提下動態重新編程,這意味著可以按需加入或移除功能,而不會引起任何流量中斷,也能動態響應系統其他部分的的變化。
- 主流的發行版中,Linux內核已經內置并啟用了XDP,并且支持主流的高速網絡驅動,4.8+的內核已內置,5.4+能夠完全使用。
缺點:
- XDP不提供緩存隊列(qdisc),TX設備太慢時會直接丟包,因而不能在RX比TX快的設備上使用XDP。
- 由于不具備緩存隊列,對與IP分片不太友好。
- XDP程序是專用的,不具備網絡協議棧的通用性。
適用案例:
? 軟件路由(XDP routing)
Linux內核實現了一個功能完全的路由表,生態系統功能豐富,結合XDP包處理框架實現了一個完美的路由功能。其性能與常規的Linux內核網絡棧相比提升了2.5 - 3倍左右。
? ACL/DDoS防御
XDP可以直接在應用服務器上部署包過濾程序來防御此類攻擊,無須修改應用代碼。如果應用部署在虛擬機里,XDP程序還可以部署在宿主機上,保護機器上所有的虛擬機。其性能單核可以輕松處理10Gbps的最小包Dos流量。這種DDOS防御的部署更加靈活。
相比iptables相對較晚的hook點,XDP的丟包速率要比iptables高4倍左右。
? 負載均衡(load balancing)
其原理是通過對包頭進行哈希,以此選擇目標應用服務器,然后將數據包進行封裝,發送給應用服務器,應用解封,處理請求,會包給客戶端。在次過程中,XDP服務哈希,封包發送。通過bpf map進行配置,其性能比Linux內核IPVS高4倍左右。
Part 04、未來展望
ebpf/XDP作為Linux網絡革新技術正在悄悄的改變著Linux網絡發展模式,當前,XDP技術被OVS、Cilium、Polycube等用于網絡快速路徑的新選擇,DPDK也相應的做了AF_XDP PMD。XDP程序在CPU可用來處理的最早時間點被執行,尤其適合DDoS防御、防火墻、負載均衡。基于XDP+eBPF的的ACL解決方案也有望改善目前的性能瓶頸,有望取代iptables解決方案。
XDP作為一個安全、快速、可編程、集成到操作系統內核的包處理框架。XDP性能雖然與基于kernel bypass的DPDK仍有差距,但優異的可擴展性,可編程性等提供了非常有競爭力的優勢。相比于kernel bypass這種非此即彼、完全繞開內核的方式,我們相信XDP有更廣闊的的應用前景。