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