日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線(xiàn)咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

Linux eBPF解析

 

今天,我們來(lái)了解下 linux 系統(tǒng)的革命性通用執(zhí)行引擎-eBPF,之所以聊著玩意,因?yàn)樗_實(shí)牛逼,作為一項(xiàng)底層技術(shù),在現(xiàn)在的云原生生態(tài)領(lǐng)域中起著舉足輕重的作用。截至目前,業(yè)界使用范圍最廣的 K8S CNI 網(wǎng)絡(luò)方案 Calico 已宣布支持 eBPF,而作為第一個(gè)實(shí)現(xiàn)了Kube-Proxy 所有功能的 K8S 網(wǎng)絡(luò)方案——Cilium 也是基于 eBPF 技術(shù)。因此,只有了解其底層機(jī)制,才能有助于更好、更易地融入容器生態(tài)中。

作為一種顛覆性技術(shù),eBPF 最早出現(xiàn)在 3.18 內(nèi)核中,eBPF 新的設(shè)計(jì)針對(duì)現(xiàn)代硬件進(jìn)行了優(yōu)化,所以 eBPF 生成的指令集比舊的 BPF 解釋器生成的機(jī)器碼執(zhí)行得更快。擴(kuò)展版本也增加了虛擬機(jī)中的寄存器數(shù)量,將原有的 2 個(gè) 32 位寄存器增加到 10 個(gè) 64 位寄存器。由于寄存器數(shù)量和寬度的增加,開(kāi)發(fā)人員可以使用函數(shù)參數(shù)自由交換更多的信息,編寫(xiě)更復(fù)雜的程序。總之,這些改進(jìn)使得 eBPF 版本的速度比原來(lái)的 BPF 提高了 4 倍。

基于原本的想法,eBPF 實(shí)現(xiàn)的最初目標(biāo)是優(yōu)化處理網(wǎng)絡(luò)過(guò)濾器的內(nèi)部 BPF 指令集。然而,作為 BPF 技術(shù)的轉(zhuǎn)折點(diǎn),eBPF 已經(jīng)開(kāi)始擴(kuò)展至用戶(hù)空間。使得 eBPF 不再局限于網(wǎng)絡(luò)棧,已經(jīng)成為內(nèi)核頂級(jí)的子系統(tǒng)。eBPF 程序架構(gòu)強(qiáng)調(diào)安全性和穩(wěn)定性,看上去更像內(nèi)核模塊,但與內(nèi)核模塊不同,eBPF 程序不需要重新編譯內(nèi)核,并且可以確保 eBPF 程序運(yùn)行完成,而不會(huì)造成系統(tǒng)的崩潰。

具體參考如下示意圖:

Linux eBPF解析

 

eBPF 是一套通用執(zhí)行引擎,提供了可基于系統(tǒng)或程序事件高效安全執(zhí)行特定代碼的通用能力,通用能力的使用者不再局限于內(nèi)核開(kāi)發(fā)者,除此之外,eBPF 可由執(zhí)行字節(jié)碼指令、存儲(chǔ)對(duì)象和 Helper 幫助函數(shù)組成,字節(jié)碼指令在內(nèi)核執(zhí)行前必須通過(guò) BPF 驗(yàn)證器 Verfier 的驗(yàn)證,同時(shí)在啟用 BPF JIT 模式的內(nèi)核中,會(huì)直接將字節(jié)碼指令轉(zhuǎn)成內(nèi)核可執(zhí)行的本地指令運(yùn)行。

同時(shí),eBPF 也逐漸在觀測(cè)(跟蹤、性能調(diào)優(yōu)等)、安全和網(wǎng)絡(luò)等領(lǐng)域發(fā)揮重要的角色。Facebook、NetFlix 、CloudFlare 等知名互聯(lián)網(wǎng)公司內(nèi)部廣泛采用基于 eBPF 技術(shù)的各種程序用于性能分析、問(wèn)題排查、負(fù)載均衡、DDoS 攻擊預(yù)防等等,據(jù)相關(guān)信息顯示,在 Facebook 的機(jī)器上內(nèi)置一系列基于 eBPF 的相關(guān)工具集。

相對(duì)于系統(tǒng)的性能分析和觀測(cè),eBPF 技術(shù)在網(wǎng)絡(luò)技術(shù)中的表現(xiàn),更為搶眼,BPF 技術(shù)與 XDP(eXpress Data Path) 和 TC(Traffic Control) 組合可以實(shí)現(xiàn)功能更加強(qiáng)大的網(wǎng)絡(luò)功能,更可為 SDN 軟件定義網(wǎng)絡(luò)提供基礎(chǔ)支撐。XDP 只作用與網(wǎng)絡(luò)包的 Ingress 層面,BPF 鉤子位于網(wǎng)絡(luò)驅(qū)動(dòng)中盡可能早的位置,無(wú)需進(jìn)行原始包的復(fù)制就可以實(shí)現(xiàn)最佳的數(shù)據(jù)包處理性能,掛載的 BPF 程序是運(yùn)行過(guò)濾的理想選擇,可用于丟棄惡意或非預(yù)期的流量、進(jìn)行 DDOS 攻擊保護(hù)等場(chǎng)景;而 TC Ingress 比 XDP 技術(shù)處于更高層次的位置,BPF 程序在 L3 層之前運(yùn)行,可以訪(fǎng)問(wèn)到與數(shù)據(jù)包相關(guān)的大部分元數(shù)據(jù),是本地節(jié)點(diǎn)處理的理想的地方,可以用于流量監(jiān)控或者 L3/L4 的端點(diǎn)策略控制,同時(shí)配合 TC egress 則可實(shí)現(xiàn)對(duì)于容器環(huán)境下更高維度和級(jí)別的網(wǎng)絡(luò)結(jié)構(gòu)。關(guān)于 XDP 技術(shù)架構(gòu),可參考如下結(jié)構(gòu)示意圖:

Linux eBPF解析

 

基于 Linux 系統(tǒng)生態(tài)體系,eBPF 有著得天獨(dú)厚的優(yōu)勢(shì),高效、生產(chǎn)安全且內(nèi)核中內(nèi)置,特別的可以在內(nèi)核中完成數(shù)據(jù)分析聚合比如直方圖,與將數(shù)據(jù)發(fā)送到用戶(hù)空間分析聚合相比,能夠節(jié)省大量的數(shù)據(jù)復(fù)制傳遞帶來(lái)的 CPU 消耗。在解析 eBPF 之前,首先,我們先看下BPF 架構(gòu)示意圖,具體如下所示:

Linux eBPF解析

 

接下來(lái)基于上述架構(gòu)圖,我們可以清晰的看到,BPF 主要工作在內(nèi)核層,其本質(zhì)是類(lèi) Unix 系統(tǒng)上數(shù)據(jù)鏈路層的一種原始接口,提供原始鏈路層封包的收發(fā)。BPF 在數(shù)據(jù)包過(guò)濾上引入了兩大革新:

  • 全新的虛擬機(jī) (VM) 設(shè)計(jì)模型,能夠有效地工作在基于寄存器結(jié)構(gòu)的 CPU 之上
  • 應(yīng)用程序使用緩存只復(fù)制與過(guò)濾數(shù)據(jù)包相關(guān)的數(shù)據(jù),不會(huì)復(fù)制數(shù)據(jù)包的所有信息。這樣可以最大程度地減少BPF 處理的數(shù)據(jù)量

基于這些巨大的改進(jìn),目前,幾乎所有的 (類(lèi))Unix 系統(tǒng)都選擇采用 BPF 作為網(wǎng)絡(luò)數(shù)據(jù)包過(guò)濾技術(shù),直到今天,許多 Unix 內(nèi)核的派生系統(tǒng)中(包括 Linux 內(nèi)核)仍基于此實(shí)現(xiàn)方式。舉個(gè)簡(jiǎn)單的示例,Linux 操作系統(tǒng)上的 Tcpdump 底層采用的就是 BPF 作為包過(guò)濾技術(shù)。

接下來(lái),我們?cè)倭私庀?eBPF 的整體架構(gòu),具體如下圖所示:

Linux eBPF解析

 

基于上述架構(gòu)圖,我們可以看到,整個(gè) eBPF 主要分為 2 部分組件:User Program (用戶(hù)空間程序)和 Kernel (內(nèi)核程序)。針對(duì)兩部分組件,簡(jiǎn)要介紹如下:

User Program (用戶(hù)空間程序):負(fù)責(zé)加載 BPF 字節(jié)碼至內(nèi)核,基于特殊場(chǎng)景需求,也可能需要負(fù)責(zé)讀取內(nèi)核回傳的統(tǒng)計(jì)信息或者事件詳情。

Kernel (內(nèi)核程序):內(nèi)核中的 BPF 字節(jié)碼負(fù)責(zé)在內(nèi)核中執(zhí)行特定事件,基于特定場(chǎng)景需要,也會(huì)將執(zhí)行的結(jié)果通過(guò) Maps 或者 Perf-Event 事件發(fā)送至用戶(hù)空間。

在此架構(gòu)參考示意圖中,用戶(hù)空間程序與內(nèi)核 BPF 字節(jié)碼程序可以基于 Map 結(jié)構(gòu)實(shí)現(xiàn)雙向通信,這為內(nèi)核中運(yùn)行的 BPF 字節(jié)碼程序提供了更加靈活的控制。

我們?cè)倏聪?User Program (用戶(hù)空間程序)與 Kernel (內(nèi)核程序)的 BPF 字節(jié)碼交互的流程,具體如下所示:

1、在User Program (用戶(hù)空間程序)中,基于LLVM 或者 GCC 工具將編寫(xiě)的 BPF 代碼程序編譯成 BPF 字節(jié)碼

2、使用加載程序 Loader 將字節(jié)碼加載至內(nèi)核,內(nèi)核使用驗(yàn)證器(Verfier) 組件保證執(zhí)行字節(jié)碼的安全性,以避免對(duì)內(nèi)核造成災(zāi)難,在確認(rèn)字節(jié)碼安全后將其加載對(duì)應(yīng)的內(nèi)核模塊執(zhí)行;BPF 觀測(cè)技術(shù)相關(guān)的程序類(lèi)型可能是
Kprobes/Uprobes/Tracepoint/Perf_events 中的一個(gè)或多個(gè)。

針對(duì) BPF 相關(guān)的程序類(lèi)型進(jìn)行簡(jiǎn)要解析,具體如下:

Kprobes:實(shí)現(xiàn)內(nèi)核中動(dòng)態(tài)跟蹤。Kprobes 可以跟蹤到 Linux 內(nèi)核中的導(dǎo)出函數(shù)入口或返回點(diǎn),但是不是穩(wěn)定 ABI 接口,可能會(huì)因?yàn)閮?nèi)核版本變化導(dǎo)致,導(dǎo)致跟蹤失效。

Uprobes:用戶(hù)級(jí)別的動(dòng)態(tài)跟蹤。與 Kprobes 類(lèi)似,只是跟蹤用戶(hù)程序中的函數(shù)。

Tracepoints:內(nèi)核中靜態(tài)跟蹤。tracepoints 是內(nèi)核開(kāi)發(fā)人員維護(hù)的跟蹤點(diǎn),能夠提供穩(wěn)定的 ABI 接口,但是由于是研發(fā)人員維護(hù),數(shù)量和場(chǎng)景可能受限。

Perf_events:定時(shí)采樣和 PMC。

3、內(nèi)核中運(yùn)行的 BPF 字節(jié)碼程序可以使用兩種方式將測(cè)量數(shù)據(jù)回傳至用戶(hù)空間,具體,Maps 方式可用于將內(nèi)核中實(shí)現(xiàn)的統(tǒng)計(jì)摘要信息(比如測(cè)量延遲、堆棧信息)等回傳至用戶(hù)空間;Perf-event 則用于將內(nèi)核采集的事件實(shí)時(shí)發(fā)送至用戶(hù)空間,用戶(hù)空間程序?qū)崟r(shí)讀取分析。

從本質(zhì)上來(lái)講,eBPF 催生了一種全新的軟件開(kāi)發(fā)方式。基于這種方式,我們不僅能夠?qū)?nèi)核行為進(jìn)行編程,而且依據(jù)場(chǎng)景需求還能編寫(xiě)跨多個(gè)子系統(tǒng)的處理邏輯,而傳統(tǒng)上這些子系統(tǒng)是完全獨(dú)立、 無(wú)法用一套邏輯來(lái)處理的。

當(dāng)前,市面上eBPF 相關(guān)的知名的開(kāi)源項(xiàng)目包括但不限于以下:

1、Facebook 高性能 4 層負(fù)載均衡器 Katran。

2、Cilium 為下一代微服務(wù) ServiceMesh 所打造的具備 API 感知和安全高效的容器網(wǎng)絡(luò)方案,底層主要使用 XDP 和 TC 等相關(guān)技術(shù)。

3、CloudFlare 公司開(kāi)源的 eBPF Exporter 和 bpf-tools:eBPF Exporter 將 eBPF 技術(shù)與監(jiān)控 Prometheus 緊密結(jié)合起來(lái),而bpf-tools 可用于網(wǎng)絡(luò)問(wèn)題分析和排查。

4、IO Visor 項(xiàng)目開(kāi)源的 BCC、 BPFTrace 和 Kubectl-Trace:BCC 提供了更高階的抽象,可以讓用戶(hù)采用 Python、C++ 和 Lua 等高級(jí)語(yǔ)言快速開(kāi)發(fā) BPF 程序;BPFTrace 采用類(lèi)似于 awk 語(yǔ)言快速編寫(xiě) eBPF 程序;Kubectl-Trace 則提供了在 kubernetes 集群中使用 BPF 程序調(diào)試的方便操作。

由于 eBPF 還在快速發(fā)展期,內(nèi)核中的功能也日趨增強(qiáng)及完善,因此,在實(shí)際的業(yè)務(wù)場(chǎng)景中,我們一般推薦基于 Linux 4.4+ (4.9 以上效能會(huì)更佳) 內(nèi)核的來(lái)使用 eBPF。部分 Linux Event 和 BPF 版本支持見(jiàn)下圖:

Linux eBPF解析

 

除上述較為知名的 eBPF 相關(guān)的開(kāi)源項(xiàng)目外,還有越來(lái)越多的新興項(xiàng)目如雨后脆筍一樣開(kāi)始蓬勃發(fā)展,并逐步在各種社區(qū)布局、開(kāi)發(fā)以及優(yōu)化完善,成為一股暖流,沖向廣闊的市場(chǎng)。

接下來(lái),我們針對(duì) eBPF 所涉及的各方面進(jìn)行簡(jiǎn)要解析,主要從網(wǎng)絡(luò)、安全、性能追蹤以及觀測(cè)及監(jiān)控等4個(gè)維度進(jìn)行,具體如下所示。

網(wǎng)絡(luò)

其實(shí),剛才前面針對(duì)網(wǎng)絡(luò)這部分已經(jīng)有所描述,現(xiàn)在對(duì)其進(jìn)行簡(jiǎn)要概括,具體,eBPF 的兩大特色:可編程和高性能,使它能滿(mǎn)足所有的網(wǎng)絡(luò)包處理需求。可編程意味著無(wú)需離開(kāi)內(nèi)核中的包處理上下文,就能添加額外的協(xié)議解析器或任何轉(zhuǎn)發(fā)邏輯, 以滿(mǎn)足不斷變化的需求。高性能的 JIT 編譯器使 eBPF 程序能達(dá)到幾乎與原生編譯的內(nèi)核態(tài)代碼一樣的執(zhí)行性能。

安全

eBPF 能夠觀測(cè)和理解所有的系統(tǒng)調(diào)用的能力,以及在 Packet 層和 Socket 層審視所有的網(wǎng)絡(luò)操作的能力,基于此兩者相結(jié)合,為系統(tǒng)安全提供了革命性的新思路。在此革命未發(fā)生之前,傳統(tǒng)模式是基于系統(tǒng)調(diào)用過(guò)濾、網(wǎng)絡(luò)層過(guò)濾和進(jìn)程上下文跟蹤是在完全獨(dú)立的系統(tǒng)中完成的,而 eBPF 的出現(xiàn)則統(tǒng)一了可觀測(cè)性和各層面的控制能力,使得我們有更加豐富的上下文和更精細(xì)的控制能力, 因而能創(chuàng)建更加安全的系統(tǒng)。

性能追蹤

eBPF 程序能夠加載到 Trace points、內(nèi)核及用戶(hù)空間應(yīng)用程序中的 Probe points, 這種能力使我們對(duì)應(yīng)用程序的運(yùn)行時(shí)行為(Runtime Behavior)和系統(tǒng)本身 (System Itself)提供了史無(wú)前例的可觀測(cè)性。應(yīng)用端和系統(tǒng)端的這種觀測(cè)能力相結(jié)合, 能在排查系統(tǒng)性能問(wèn)題時(shí)提供強(qiáng)大的能力和獨(dú)特的信息。BPF 使用了很多高級(jí)數(shù)據(jù)結(jié)構(gòu), 因此能非常高效地導(dǎo)出有意義的可觀測(cè)數(shù)據(jù),而不是像很多同類(lèi)系統(tǒng)一樣導(dǎo)出海量的原始采樣數(shù)據(jù)。

觀測(cè)及監(jiān)控

相比于操作系統(tǒng)提供的靜態(tài)計(jì)數(shù)器(Counters、Gauges),eBPF 能在內(nèi)核中收集和聚合自定義 Metric, 并能從不同數(shù)據(jù)源來(lái)生成可觀測(cè)數(shù)據(jù)。這既擴(kuò)展了可觀測(cè)性的深度,也顯著減少了整體系統(tǒng)開(kāi)銷(xiāo), 因?yàn)楝F(xiàn)在可以選擇只收集需要的數(shù)據(jù),并且后者是直方圖或類(lèi)似的格式,而非原始采樣數(shù)據(jù)。

上面講述了 eBPF 的相關(guān)特性以及優(yōu)點(diǎn),最后,我們?cè)倭私庀略诨诋?dāng)前的技術(shù)以及業(yè)務(wù)場(chǎng)景下,eBPF 應(yīng)用的局限性,具體如下:

1、現(xiàn)有的環(huán)境下,eBPF 程序不能調(diào)用任意的內(nèi)核參數(shù),只限于內(nèi)核模塊中列出的 BPF Helper 函數(shù)。

2、eBPF 字節(jié)碼大小最初被限制為 4096 條指令,截止到內(nèi)核 Linux 5.8 版本, 當(dāng)前已將放寬至 100 萬(wàn)指令(
BPF_COMPLEXITY_LIMIT_INSNS),可參考源碼所示:include/linux/bpf.h,對(duì)于無(wú)權(quán)限的BPF程序,仍然保留 4096 條限制 ( BPF_MAXINSNS );新版本的 eBPF 也支持了多個(gè) eBPF 程序級(jí)聯(lián)調(diào)用,雖然傳遞信息存在某些限制,但是可以通過(guò)組合實(shí)現(xiàn)更加強(qiáng)大的功能。

3、eBPF 堆棧大小被限制在 MAX_BPF_STACK,截止到內(nèi)核 Linux 5.8 版本,被設(shè)置為 512;可參考源碼所示: include/linux/filter.h,這個(gè)限制特別是在棧上存儲(chǔ)多個(gè)字符串緩沖區(qū)時(shí):一個(gè)char[256]緩沖區(qū)會(huì)消耗這個(gè)棧的一半。目前沒(méi)有計(jì)劃增加這個(gè)限制,解決方法是改用 bpf 映射存儲(chǔ),它實(shí)際上是無(wú)限的。

4、eBPF 程序不允許包含無(wú)法到達(dá)的指令,防止加載無(wú)效代碼,延遲程序的終止。

5、eBPF 程序中循環(huán)次數(shù)限制且必須在有限時(shí)間內(nèi)結(jié)束,這主要是用來(lái)防止在 kprobes 中插入任意的循環(huán),導(dǎo)致鎖住整個(gè)系統(tǒng);解決辦法包括展開(kāi)循環(huán),并為需要循環(huán)的常見(jiàn)用途添加輔助函數(shù)。Linux 5.3 在 BPF 中包含了對(duì)有界循環(huán)的支持,它有一個(gè)可驗(yàn)證的運(yùn)行時(shí)間上限。

綜上所述,雖然 eBPF 技術(shù)在當(dāng)前的環(huán)境下影響力強(qiáng)大,但是為了保證內(nèi)核的處理安全和及時(shí)響應(yīng),內(nèi)核中的 eBPF 技術(shù)也被進(jìn)行著諸多的限制,或許,隨著技術(shù)的發(fā)展和內(nèi)核演進(jìn),基于 eBPF,我們可能會(huì)找出一個(gè)更為性?xún)r(jià)比的綜合解決方案。

- EOF -

分享到:
標(biāo)簽:eBPF
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定