www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 程序喵大人
[導(dǎo)讀]hi,大家好,歡迎來(lái)到極客重生的世界,今天給大家分享的是Linux網(wǎng)絡(luò)新技術(shù),當(dāng)前正流行網(wǎng)絡(luò)技是什么?那就是eBPF和XDP技術(shù),CiliumeBPF超級(jí)火熱,GoogleGCP也剛剛?cè)孓D(zhuǎn)過(guò)來(lái)。新技術(shù)出現(xiàn)的歷史原因廉頗老矣,尚能飯否iptables/netfilteriptab...


hi,大家好,歡迎來(lái)到極客重生的世界,今天給大家分享的是Linux 網(wǎng)絡(luò)新技術(shù),當(dāng)前正流行網(wǎng)絡(luò)技是什么?那就是eBPF和XDP技術(shù),Cilium eBPF超級(jí)火熱,Google GCP也剛剛?cè)孓D(zhuǎn)過(guò)來(lái)。


新技術(shù)出現(xiàn)的歷史原因

廉頗老矣,尚能飯否


iptables/netfilter


iptables/netfilter 是上個(gè)時(shí)代Linux網(wǎng)絡(luò)提供的優(yōu)秀的防火墻技術(shù),擴(kuò)展性強(qiáng),能夠滿(mǎn)足當(dāng)時(shí)大部分網(wǎng)絡(luò)應(yīng)用需求,如果不知道iptables/netfilter是什么,請(qǐng)參考之前文章:一個(gè)奇葩的網(wǎng)絡(luò)問(wèn)題,把技術(shù)磚家"搞蒙了"里面對(duì)iptables/netfilter技術(shù)有詳細(xì)介紹。


但該框架也存在很多明顯問(wèn)題:


  • 路徑太長(zhǎng)

netfilter 框架在IP層,報(bào)文需要經(jīng)過(guò)鏈路層,IP層才能被處理,如果是需要丟棄報(bào)文,會(huì)白白浪費(fèi)很多CPU資源,影響整體性能;

  • O(N)匹配

如上圖所示,極端情況下,報(bào)文需要依次遍歷所有規(guī)則,才能匹配中,極大影響報(bào)文處理性能;

  • 規(guī)則太多

netfilter 框架類(lèi)似一套可以自由添加策略規(guī)則專(zhuān)家系統(tǒng),并沒(méi)有對(duì)添加規(guī)則進(jìn)行合并優(yōu)化,這些都嚴(yán)重依賴(lài)操作人員技術(shù)水平,隨著規(guī)模的增大,規(guī)則數(shù)量n成指數(shù)級(jí)增長(zhǎng),而報(bào)文處理又是0(n)復(fù)雜度,最終性能會(huì)直線(xiàn)下降。


內(nèi)核協(xié)議棧



隨著互聯(lián)網(wǎng)流量越來(lái)愈大, 網(wǎng)卡性能越來(lái)越強(qiáng),Linux內(nèi)核協(xié)議棧在10Mbps/100Mbps網(wǎng)卡的慢速時(shí)代是沒(méi)有任何問(wèn)題的,那個(gè)時(shí)候應(yīng)用程序大部分時(shí)間在等網(wǎng)卡送上來(lái)數(shù)據(jù)。


現(xiàn)在到了1000Mbps/10Gbps/40Gbps網(wǎng)卡的時(shí)代,數(shù)據(jù)被很快地收入,協(xié)議棧復(fù)雜處理邏輯,效率捉襟見(jiàn)肘,把大量報(bào)文堵在內(nèi)核里。


各類(lèi)鏈表在多CPU環(huán)境下的同步開(kāi)銷(xiāo)。

不可睡眠的軟中斷路徑過(guò)長(zhǎng)。

sk_buff的分配和釋放。

內(nèi)存拷貝的開(kāi)銷(xiāo)。

上下文切換造成的cache miss。


于是,內(nèi)核協(xié)議棧各種優(yōu)化措施應(yīng)著需求而來(lái):


網(wǎng)卡RSS,多隊(duì)列。

中斷線(xiàn)程化。

分割鎖粒度。

Busypoll。


但卻都是見(jiàn)招拆招,治標(biāo)不治本。問(wèn)題的根源不是這些機(jī)制需要優(yōu)化,而是這些機(jī)制需要推倒重構(gòu)。蒸汽機(jī)車(chē)剛出來(lái)的時(shí)候,馬車(chē)夫?yàn)榱吮3指?jìng)爭(zhēng)優(yōu)勢(shì),不是去換一匹昂貴的快馬,而是賣(mài)掉馬去買(mǎi)一臺(tái)蒸汽機(jī)裝上。基本就是這個(gè)意思。


重構(gòu)的思路很顯然有兩個(gè):


upload方法別讓?xiě)?yīng)用程序等內(nèi)核了,讓?xiě)?yīng)用程序自己去網(wǎng)卡直接拉數(shù)據(jù)。

offload方法別讓內(nèi)核處理網(wǎng)絡(luò)邏輯了,讓網(wǎng)卡自己處理。


總之,繞過(guò)內(nèi)核就對(duì)了,內(nèi)核協(xié)議棧背負(fù)太多歷史包袱。


DPDK讓用戶(hù)態(tài)程序直接處理網(wǎng)絡(luò)流,bypass掉內(nèi)核,使用獨(dú)立的CPU專(zhuān)門(mén)干這個(gè)事。


XDP讓灌入網(wǎng)卡的eBPF程序直接處理網(wǎng)絡(luò)流,bypass掉內(nèi)核,使用網(wǎng)卡NPU專(zhuān)門(mén)干這個(gè)事。


如此一來(lái),內(nèi)核協(xié)議棧就不再參與數(shù)據(jù)平面的事了,留下來(lái)專(zhuān)門(mén)處理諸如路由協(xié)議,遠(yuǎn)程登錄等控制平面和管理平面的數(shù)據(jù)流。


改善iptables/netfilter的規(guī)模瓶頸,提高Linux內(nèi)核協(xié)議棧IO性能,內(nèi)核需要提供新解決方案,那就是eBPF/XDP框架,讓我們來(lái)看一看,這套框架是如何解決問(wèn)題的。

eBPF到底是什么?

?????eBPF的歷史


BPF 是 Linux 內(nèi)核中高度靈活和高效的類(lèi)似虛擬機(jī)的技術(shù),允許以安全的方式在各個(gè)掛鉤點(diǎn)執(zhí)行字節(jié)碼。它用于許多 Linux 內(nèi)核子系統(tǒng),最突出的是網(wǎng)絡(luò)、跟蹤和安全(例如沙箱)。


BPF架構(gòu)


BPF 是一個(gè)通用目的 RISC 指令集,其最初的設(shè)計(jì)目標(biāo)是:用 C 語(yǔ)言的一個(gè)子集編 寫(xiě)程序,然后用一個(gè)編譯器后端(例如 LLVM)將其編譯成 BPF 指令,稍后內(nèi)核再通 過(guò)一個(gè)位于內(nèi)核中的(in-kernel)即時(shí)編譯器(JIT Compiler)將 BPF 指令映射成處理器的原生指令(opcode ),以取得在內(nèi)核中的最佳執(zhí)行性能。


BPF指令


盡管 BPF 自 1992 年就存在,擴(kuò)展的 Berkeley Packet Filter (eBPF) 版本首次出現(xiàn)在 Kernel3.18中,如今被稱(chēng)為“經(jīng)典”BPF (cBPF) 的版本已過(guò)時(shí)。許多人都知道 cBPF是tcpdump使用的數(shù)據(jù)包過(guò)濾語(yǔ)言?,F(xiàn)在Linux內(nèi)核只運(yùn)行 eBPF,并且加載的 cBPF 字節(jié)碼在程序執(zhí)行之前被透明地轉(zhuǎn)換為內(nèi)核中的eBPF表示。除非指出 eBPF 和 cBPF 之間的明確區(qū)別,一般現(xiàn)在說(shuō)的BPF就是指eBPF。


eBPF總體設(shè)計(jì)


? ??

  • BPF 不僅通過(guò)提供其指令集來(lái)定義自己,而且還通過(guò)提供圍繞它的進(jìn)一步基礎(chǔ)設(shè)施,例如充當(dāng)高效鍵/值存儲(chǔ)的映射、與內(nèi)核功能交互并利用內(nèi)核功能的輔助函數(shù)、調(diào)用其他 BPF 程序的尾調(diào)用、安全加固原語(yǔ)、用于固定對(duì)象(地圖、程序)的偽文件系統(tǒng),以及允許將 BPF 卸載到網(wǎng)卡的基礎(chǔ)設(shè)施。

  • LLVM 提供了一個(gè) BPF后端,因此可以使用像 clang 這樣的工具將 C 編譯成 BPF 目標(biāo)文件,然后可以將其加載到內(nèi)核中。BPF與Linux 內(nèi)核緊密相連,允許在不犧牲本機(jī)內(nèi)核性能的情況下實(shí)現(xiàn)完全可編程。


eBPF總體設(shè)計(jì)包括以下幾個(gè)部分:

eBPF Runtime


  • 安全保障?:?eBPF的verifier?將拒絕任何不安全的程序并提供沙箱運(yùn)行環(huán)境

  • 持續(xù)交付:?程序可以更新在不中斷工作負(fù)載的情況下

  • 高性能:JIT編譯器可以保證運(yùn)行性能

eBPF Hooks

  • 內(nèi)核函數(shù) (kprobes)、用戶(hù)空間函數(shù) (uprobes)、系統(tǒng)調(diào)用、fentry/fexit、跟蹤點(diǎn)、網(wǎng)絡(luò)設(shè)備 (tc/xdp)、網(wǎng)絡(luò)路由、TCP 擁塞算法、套接字(數(shù)據(jù)面)


eBPF Maps


Map 類(lèi)型

- Hash tables, Arrays

- LRU (Least Recently Used)

- Ring Buffer

- Stack Trace

- LPM (Longest Prefix match)


作用

  • 程序狀態(tài)

  • 程序配置

  • 程序間共享數(shù)據(jù)

  • 和用戶(hù)空間共享狀態(tài)、指標(biāo)和統(tǒng)計(jì)


eBPF Helpers


有哪些Helpers?

  • 隨機(jī)數(shù)

  • 獲取當(dāng)前時(shí)間

  • map訪(fǎng)問(wèn)

  • 獲取進(jìn)程/cgroup 上下文

  • 處理網(wǎng)絡(luò)數(shù)據(jù)包和轉(zhuǎn)發(fā)

  • 訪(fǎng)問(wèn)套接字?jǐn)?shù)據(jù)

  • 執(zhí)行尾調(diào)用

  • 訪(fǎng)問(wèn)進(jìn)程棧

  • 訪(fǎng)問(wèn)系統(tǒng)調(diào)用參數(shù)

  • ...


eBPF Tail and Function Calls


尾調(diào)用有什么用?

● 將程序鏈接在一起

● 將程序拆分為獨(dú)立的邏輯組件

● 使 BPF 程序可組合


函數(shù)調(diào)用有什么用?

● 重用內(nèi)部的功能程序

● 減少程序大?。ū苊鈨?nèi)聯(lián))


eBPF JIT Compiler

  • 確保本地執(zhí)行性能而不需要了解CPU

  • 將 BPF字節(jié)碼編譯到CPU架構(gòu)特定指令集



eBPF可以做什么?




eBPF 開(kāi)源 Projects



Cilium


????



  • Cilium 是開(kāi)源軟件,用于Linux容器管理平臺(tái)(如 Docker 和 Kubernetes)部署的服務(wù)之間的透明通信和提供安全隔離保護(hù)。

  • Cilium基于微服務(wù)的應(yīng)用,使用HTTP、gRPC、Kafka等輕量級(jí)協(xié)議API相互通信。

?

  • Cilium 的基于 eBPF 的新 Linux 內(nèi)核技術(shù),它能夠在 Linux 本身中動(dòng)態(tài)插入強(qiáng)大的安全可見(jiàn)性和控制邏輯。由于 eBPF 在 Linux 內(nèi)核中運(yùn)行,因此可以在不更改應(yīng)用程序代碼或容器配置的情況下應(yīng)用和更新 Cilium 安全策略。


Cilium在它的 datapath 中重度使用了 BPF 技術(shù)


  • Cilium 是位于 Linux kernel 與容器編排系統(tǒng)的中間層。向上可以為容器配置網(wǎng)絡(luò),向下可以向 Linux 內(nèi)核生成 BPF 程序來(lái)控制容器的安全性和轉(zhuǎn)發(fā)行為。

  • 利用 Linux BPF,Cilium 保留了透明地插入安全可視性 強(qiáng)制執(zhí)行的能力,但這種方式基于服務(wù) /pod/ 容器標(biāo)識(shí)(與傳統(tǒng)系統(tǒng)中的 IP 地址識(shí)別相反),并且可以根據(jù)應(yīng)用層進(jìn)行過(guò)濾 (例如 HTTP)。因此,通過(guò)將安全性與尋址分離,Cilium 不僅可以在高度動(dòng)態(tài)的環(huán)境中應(yīng)用安全策略,而且除了提供傳統(tǒng)的第 3 層和第 4 層分割之外,還可以通過(guò)在 HTTP 層運(yùn)行來(lái)提供更強(qiáng)的安全隔離。

  • BPF 的使用使得 Cilium 能夠以高度可擴(kuò)展的方式實(shí)現(xiàn)以上功能,即使對(duì)于大規(guī)模環(huán)境也不例外。


對(duì)比傳統(tǒng)容器網(wǎng)絡(luò)(采用iptables/netfilter):


  • eBPF主機(jī)路由允許繞過(guò)主機(jī)命名空間中所有的 iptables 和上層網(wǎng)絡(luò)棧,以及穿過(guò)Veth對(duì)時(shí)的一些上下文切換,以節(jié)省資源開(kāi)銷(xiāo)。網(wǎng)絡(luò)數(shù)據(jù)包到達(dá)網(wǎng)絡(luò)接口設(shè)備時(shí)就被盡早捕獲,并直接傳送到Kubernetes Pod的網(wǎng)絡(luò)命名空間中。在流量出口側(cè),數(shù)據(jù)包同樣穿過(guò)Veth對(duì),被eBPF捕獲后,直接被傳送到外部網(wǎng)絡(luò)接口上。eBPF直接查詢(xún)路由表,因此這種優(yōu)化完全透明。

  • 基于eBPF中的kube-proxy網(wǎng)絡(luò)技術(shù)正在替換基于iptables的kube-proxy技術(shù),與Kubernetes中的原始kube-proxy相比,eBPF中的kuber-proxy替代方案具有一系列重要優(yōu)勢(shì),例如更出色的性能、可靠性以及可調(diào)試性等等。



BCC(BPF Compiler Collection)


BCC 是一個(gè)框架,它使用戶(hù)能夠編寫(xiě)嵌入其中的 eBPF 程序的 Python 程序。該框架主要針對(duì)涉及應(yīng)用程序和系統(tǒng)分析/跟蹤的用例,其中 eBPF 程序用于收集統(tǒng)計(jì)信息或生成事件,用戶(hù)空間中的對(duì)應(yīng)部分收集數(shù)據(jù)并以人類(lèi)可讀的形式顯示。運(yùn)行 python 程序?qū)⑸?eBPF 字節(jié)碼并將其加載到內(nèi)核中。

bpftrace

bpftrace 是一種用于 Linux eBPF 的高級(jí)跟蹤語(yǔ)言,可在最近的 Linux 內(nèi)核 (4.x) 中使用。bpftrace 使用 LLVM 作為后端將腳本編譯為 eBPF 字節(jié)碼,并利用 BCC 與 Linux eBPF 子系統(tǒng)以及現(xiàn)有的 Linux 跟蹤功能進(jìn)行交互:內(nèi)核動(dòng)態(tài)跟蹤 (kprobes)、用戶(hù)級(jí)動(dòng)態(tài)跟蹤 (uprobes) 和跟蹤點(diǎn). bpftrace 語(yǔ)言的靈感來(lái)自 awk、C 和前身跟蹤器,例如 DTrace 和 SystemTap。


eBPF Go 庫(kù)

eBPF Go 庫(kù)提供了一個(gè)通用的 eBPF 庫(kù),它將獲取 eBPF 字節(jié)碼的過(guò)程與 eBPF 程序的加載和管理解耦。eBPF 程序通常是通過(guò)編寫(xiě)高級(jí)語(yǔ)言創(chuàng)建的,然后使用 clang/LLVM 編譯器編譯為 eBPF 字節(jié)碼。


libbpf C/C 庫(kù)

libbpf 庫(kù)是一個(gè)基于 C/C 的通用 eBPF 庫(kù),它有助于解耦從 clang/LLVM 編譯器生成的 eBPF 目標(biāo)文件加載到內(nèi)核中,并通過(guò)提供易于使用的庫(kù) API 來(lái)抽象與 BPF 系統(tǒng)調(diào)用的交互應(yīng)用程序。



那XDP又是什么?

XDP的全稱(chēng)是:?eXpress Data Path


XDP 是Linux 內(nèi)核中提供高性能、可編程的網(wǎng)絡(luò)數(shù)據(jù)包處理框架。


XDP整體框架

  • 直接接管網(wǎng)卡的RX數(shù)據(jù)包(類(lèi)似DPDK用戶(hù)態(tài)驅(qū)動(dòng))處理;

  • 通過(guò)運(yùn)行BPF指令快速處理報(bào)文;

  • 和Linux協(xié)議棧無(wú)縫對(duì)接;


XDP總體設(shè)計(jì)

XDP總體設(shè)計(jì)包括以下幾個(gè)部分:


XDP驅(qū)動(dòng)

網(wǎng)卡驅(qū)動(dòng)中XDP程序的一個(gè)掛載點(diǎn),每當(dāng)網(wǎng)卡接收到一個(gè)數(shù)據(jù)包就會(huì)執(zhí)行這個(gè)XDP程序;XDP程序可以對(duì)數(shù)據(jù)包進(jìn)行逐層解析、按規(guī)則進(jìn)行過(guò)濾,或者對(duì)數(shù)據(jù)包進(jìn)行封裝或者解封裝,修改字段對(duì)數(shù)據(jù)包進(jìn)行轉(zhuǎn)發(fā)等;


BPF虛擬機(jī)

并沒(méi)有在圖里畫(huà)出來(lái),一個(gè)XDP程序首先是由用戶(hù)編寫(xiě)用受限制的C語(yǔ)言編寫(xiě)的,然后通過(guò)clang前端編譯生成BPF字節(jié)碼,字節(jié)碼加載到內(nèi)核之后運(yùn)行在eBPF虛擬機(jī)上,虛擬機(jī)通過(guò)即時(shí)編譯將XDP字節(jié)碼編譯成底層二進(jìn)制指令;eBPF虛擬機(jī)支持XDP程序的動(dòng)態(tài)加載和卸載;


BPF maps

存儲(chǔ)鍵值對(duì),作為用戶(hù)態(tài)程序和內(nèi)核態(tài)XDP程序、內(nèi)核態(tài)XDP程序之間的通信媒介,類(lèi)似于進(jìn)程間通信的共享內(nèi)存訪(fǎng)問(wèn);用戶(hù)態(tài)程序可以在BPF映射中預(yù)定義規(guī)則,XDP程序匹配映射中的規(guī)則對(duì)數(shù)據(jù)包進(jìn)行過(guò)濾等;XDP程序?qū)?shù)據(jù)包統(tǒng)計(jì)信息存入BPF映射,用戶(hù)態(tài)程序可訪(fǎng)問(wèn)BPF映射獲取數(shù)據(jù)包統(tǒng)計(jì)信息;


BPF程序校驗(yàn)器

XDP程序肯定是我們自己編寫(xiě)的,那么如何確保XDP程序加載到內(nèi)核之后不會(huì)導(dǎo)致內(nèi)核崩潰或者帶來(lái)其他的安全問(wèn)題呢?程序校驗(yàn)器就是在將XDP字節(jié)碼加載到內(nèi)核之前對(duì)字節(jié)碼進(jìn)行安全檢查,比如判斷是否有循環(huán),程序長(zhǎng)度是否超過(guò)限制,程序內(nèi)存訪(fǎng)問(wèn)是否越界,程序是否包含不可達(dá)的指令;


XDP Action

XDP用于報(bào)文的處理,支持如下action:

enum xdp_action { XDP_ABORTED = 0, XDP_DROP, XDP_PASS, XDP_TX, XDP_REDIRECT,};
  • XDP_DROP:在驅(qū)動(dòng)層丟棄報(bào)文,通常用于實(shí)現(xiàn)DDos或防火墻

  • XDP_PASS:允許報(bào)文上送到內(nèi)核網(wǎng)絡(luò)棧,同時(shí)處理該報(bào)文的CPU會(huì)分配并填充一個(gè)skb,將其傳遞到GRO引擎。之后的處理與沒(méi)有XDP程序的過(guò)程相同。

  • XDP_TX從當(dāng)前網(wǎng)卡發(fā)送出去

  • XDP_REDIRECT從其他網(wǎng)卡發(fā)送出去。

  • XDP_ABORTED:表示程序產(chǎn)生了異常,其行為和 XDP_DROP相同,但 XDP_ABORTED 會(huì)經(jīng)過(guò) trace_xdp_exception tracepoint,因此可以通過(guò) tracing 工具來(lái)監(jiān)控這種非正常行為。



AF_XDP

AF_XDP 是為高性能數(shù)據(jù)包處理而優(yōu)化的地址族,AF_XDP 套接字使 XDP 程序可以將幀重定向到用戶(hù)空間應(yīng)用程序中的內(nèi)存緩沖區(qū)。



XDP設(shè)計(jì)原則


  • XDP 專(zhuān)為高性能而設(shè)計(jì)。它使用已知技術(shù)并應(yīng)用選擇性約束來(lái)實(shí)現(xiàn)性能目標(biāo)

  • XDP 還具有可編程性。無(wú)需修改內(nèi)核即可即時(shí)實(shí)現(xiàn)新功能

  • XDP 不是內(nèi)核旁路。它是內(nèi)核協(xié)議棧的快速路徑

  • XDP 不替代TCP/IP 協(xié)議棧。與協(xié)議棧協(xié)同工作

  • XDP 不需要任何專(zhuān)門(mén)的硬件。它支持網(wǎng)絡(luò)硬件的少即是多原則


XDP技術(shù)優(yōu)勢(shì)


及時(shí)處理

  • 在網(wǎng)絡(luò)協(xié)議棧前處理,由于 XDP 位于整個(gè) Linux 內(nèi)核網(wǎng)絡(luò)軟件棧的底部,能夠非常早地識(shí)別并丟棄攻擊報(bào)文,具有很高的性能。可以改善 iptables 協(xié)議棧丟包的性能瓶頸

  • DDIO

  • Packeting steering

  • 輪詢(xún)式


高性能優(yōu)化

  • 無(wú)鎖設(shè)計(jì)

  • 批量I/O操作

  • 不需要分配skbuff

  • 支持網(wǎng)絡(luò)卸載

  • 支持網(wǎng)卡RSS


指令虛擬機(jī)

  • 規(guī)則優(yōu)化,編譯成精簡(jiǎn)指令,快速執(zhí)行

  • 支持熱更新,可以動(dòng)態(tài)擴(kuò)展內(nèi)核功能

  • 易編程-高級(jí)語(yǔ)言也可以間接在內(nèi)核運(yùn)行

  • 安全可靠,BPF程序先校驗(yàn)后執(zhí)行,XDP程序沒(méi)有循環(huán)


可擴(kuò)展模型

  • 支持應(yīng)用處理(如應(yīng)用層協(xié)議GRO)

  • 支持將BPF程序卸載到網(wǎng)卡

  • BPF程序可以移植到用戶(hù)空間或其他操作系統(tǒng)


可編程性

  • 包檢測(cè),BPF程序發(fā)現(xiàn)的動(dòng)作

  • 靈活(無(wú)循環(huán))協(xié)議頭解析

  • 可能由于流查找而有狀態(tài)

  • 簡(jiǎn)單的包字段重寫(xiě)(encap/decap)



XDP 工作模式


XDP 有三種工作模式,默認(rèn)是?native(原生)模式,當(dāng)討論 XDP 時(shí)通常隱含的都是指這 種模式。

  • Native XDP

    默認(rèn)模式,在這種模式中,XDP BPF 程序直接運(yùn)行在網(wǎng)絡(luò)驅(qū)動(dòng)的早期接收路徑上( early receive path)。

  • Offloaded XDP

    在這種模式中,XDP BPF程序直接 offload 到網(wǎng)卡。

  • Generic XDP

    對(duì)于還沒(méi)有實(shí)現(xiàn) native 或 offloaded XDP 的驅(qū)動(dòng),內(nèi)核提供了一個(gè) generic XDP 選 項(xiàng),這種設(shè)置主要面向的是用內(nèi)核的 XDP API 來(lái)編寫(xiě)和測(cè)試程序的開(kāi)發(fā)者,對(duì)于在生產(chǎn)環(huán)境使用XDP,推薦要么選擇native要么選擇offloaded模式?????。


XDP vs DPDK




相對(duì)于DPDK,XDP:


優(yōu)點(diǎn)

  • 無(wú)需第三方代碼庫(kù)和許可

  • 同時(shí)支持輪詢(xún)式和中斷式網(wǎng)絡(luò)

  • 無(wú)需分配大頁(yè)

  • 無(wú)需專(zhuān)用的CPU

  • 無(wú)需定義新的安全網(wǎng)絡(luò)模型


缺點(diǎn)

注意XDP的性能提升是有代價(jià)的,它犧牲了通用型和公平性

  • XDP不提供緩存隊(duì)列(qdisc),TX設(shè)備太慢時(shí)直接丟包,因而不要在RX比TX快的設(shè)備上使用XDP

  • XDP程序是專(zhuān)用的,不具備網(wǎng)絡(luò)協(xié)議棧的通用性


如何選擇?

  • 內(nèi)核延伸項(xiàng)目,不想bypass內(nèi)核的下一代高性能方案;

  • 想直接重用內(nèi)核代碼;

  • 不支持DPDK程序環(huán)境;


XDP適合場(chǎng)景

  • DDoS防御

  • 防火墻

  • 基于XDP_TX的負(fù)載均衡

  • 網(wǎng)絡(luò)統(tǒng)計(jì)

  • 流量監(jiān)控

  • 棧前過(guò)濾/處理

  • ...


XDP例子


下面是一個(gè)最小的完整 XDP 程序,實(shí)現(xiàn)丟棄包的功能(xdp-example.c):

#include


  • #ifndef __section
    # define __section(NAME) \
    __attribute__((section(NAME), used))
    #endif

    __section("prog")
    int xdp_drop(struct xdp_md *ctx)
    {
    return XDP_DROP;
    }

    char __license[] __section("license") = "GPL";

    用下面的命令編譯并加載到內(nèi)核:

    $ clang -O2 -Wall -target bpf -c xdp-example.c -o xdp-example.o
    $ ip link set dev em1 xdp obj xdp-example.o

    以上命令將一個(gè) XDP 程序 attach 到一個(gè)網(wǎng)絡(luò)設(shè)備,需要是 Linux 4.11 內(nèi)核中支持 XDP 的設(shè)備,或者 4.12 版本的內(nèi)核。

    最后

    eBPF/XDP 作為L(zhǎng)inux網(wǎng)絡(luò)革新技術(shù)正在悄悄改變著Linux網(wǎng)絡(luò)發(fā)展模式。


    eBPF正在將Linux內(nèi)核轉(zhuǎn)變?yōu)槲?nèi)核,越來(lái)越多的新內(nèi)核功能采用eBPF實(shí)現(xiàn),讓新增內(nèi)核功能更加快捷高效。


    ?????????????????????????體而言,基于業(yè)界基準(zhǔn)測(cè)試結(jié)果,eBPF 顯然是解決具有挑戰(zhàn)性的云原生需求的最佳技術(shù)。

    參考

  • 本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀(guān)點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
    關(guān)閉
    關(guān)閉