導(dǎo)讀
eBPF是Linux內(nèi)核革命性技術(shù),能夠安全高效地?cái)U(kuò)展內(nèi)核能力,應(yīng)用廣泛,尤其是在云原生可觀測(cè)性領(lǐng)域的應(yīng)用已經(jīng)成為行業(yè)熱點(diǎn)。在滴滴云原生環(huán)境中,eBPF技術(shù)進(jìn)行了業(yè)務(wù)實(shí)踐和內(nèi)源共建,HuaTuo eBPF 平臺(tái)快速落地并取得初步收益,目前已經(jīng)支持云原生關(guān)鍵組件,諸如服務(wù)訪問關(guān)系拓?fù)洹⑷萜靼踩⑺拗鳈C(jī)安全、網(wǎng)絡(luò)診斷、根因定位等業(yè)務(wù),HuaTuo也是滴滴開源委員會(huì)的精品孵化項(xiàng)目。希望本文為業(yè)界開發(fā)者提供一種如何將eBPF 技術(shù)快速應(yīng)用到云原生場(chǎng)景的落地方式,共同提升云原生系統(tǒng)深度可觀測(cè)性。
1?
BPF 技術(shù)的前世
Berkeley Packet Filter BPF 伯克利報(bào)文過濾器,最初構(gòu)想提出于 1993 年,Steven McCanne 和 Van Jacobson 的論文《The BSD packet filter: a new architecture for user-level packet capture》。其目標(biāo)提供一種新的高效過濾網(wǎng)絡(luò)報(bào)文的方法。最初BPF 只附著在Linux 內(nèi)核網(wǎng)絡(luò)套接字上,當(dāng)套接字綁定BPF字節(jié)碼后,每接收一次報(bào)文都會(huì)執(zhí)行該字節(jié)。內(nèi)核根據(jù)BPF字節(jié)碼返回值決定是否允許網(wǎng)絡(luò)報(bào)文通過。
從指令集角度,BPF 起初的架構(gòu)比較簡單,只有一個(gè)32位寬度累加器A,一個(gè)32位寬度寄存器X,以及16x32bit 數(shù)組內(nèi)存空間。但BPF 實(shí)現(xiàn)了加載、存儲(chǔ)、跳轉(zhuǎn)、運(yùn)算四類指令。BPF 起初還沒有即時(shí)編譯器JIT,所有這些指令完全在內(nèi)核小巧的虛擬機(jī)中運(yùn)行,即便如此性能已經(jīng)完全碾壓其他報(bào)文過濾器。
BPF使用起來也比較方便,我們可以通過tcpdump、libpcap或者bpf_asm 生成BPF字節(jié)碼,通過setsockopt SO_ATTACH_FILTER加載到內(nèi)核。如下所示實(shí)現(xiàn)ICMP報(bào)文過濾,只需要根據(jù)L2/L3報(bào)文頭漂移量判斷協(xié)議號(hào)是否符合條件。
BPF 最先在sk_filter 落地使用,后續(xù)在netfilter、seccomp、team 驅(qū)動(dòng)等網(wǎng)絡(luò)子系統(tǒng)都有應(yīng)用,但應(yīng)用方向依舊在網(wǎng)絡(luò)報(bào)文處理。
2?
BPF 技術(shù)的今生
BPF 最核心的思想實(shí)現(xiàn)了內(nèi)核可編程,即在不改動(dòng)源碼,重新編譯內(nèi)核的情況下,實(shí)現(xiàn)高效擴(kuò)展內(nèi)核能力。2013 年,Alexei Starovoitov 對(duì) BPF 進(jìn)行改造,增加新特性,改善其性能。BPF 的進(jìn)一步發(fā)展,為內(nèi)核帶來了巨大的改變,使內(nèi)核具備了更加強(qiáng)大、可編程的動(dòng)態(tài)變化的能力。這種能力在各種需要定制化的應(yīng)用場(chǎng)景中,將發(fā)揮巨大的價(jià)值,既可以用于擴(kuò)展功能,也可以用于優(yōu)化性能。新版本被命名為 eBPF (“extended BPF”),以前的 BPF 變成 cBPF(“classic” BPF),后續(xù)篇章中BPF特指該項(xiàng)技術(shù)。
首先指令集角度,eBPF 是一種精簡指令集,支持R0-R9 10個(gè)64bit 通用寄存器。其中R0寄存器用于內(nèi)核函數(shù)的返回值,R1-R5寄存器用于內(nèi)核函數(shù)的參數(shù)傳遞,這和x86_64、aarch64 類似。eBPF 支持兩種指令集編碼格式,64位寬度的基礎(chǔ)編碼,128位寬度的寬指令編碼(該指令編碼在基礎(chǔ)編碼之后附加64位立即數(shù)實(shí)現(xiàn))。此外,eBPF 也豐富了四類指令集。
Just In Time, ?JIT 編譯器,BPF 指令會(huì)被內(nèi)核的 JIT 編譯器動(dòng)態(tài)編譯為物理機(jī)原生指令,實(shí)現(xiàn)運(yùn)行效率的“零”損耗。該特性在cBPF 時(shí)期由Eric Dumazet 實(shí)現(xiàn),只支持x86-64架構(gòu)。eBPF 根據(jù)自身指令特點(diǎn)再次擴(kuò)展該編譯器,eBPF 指令不僅僅可以JIT 成物理機(jī)CPU原生指令,同時(shí)可以翻譯成一些設(shè)備如某些智能網(wǎng)卡的特定指令。這樣諸如智能網(wǎng)卡的設(shè)備可以通過eBPF的方式實(shí)現(xiàn)可編程。
除了對(duì)指令層面豐富和擴(kuò)展,eBPF 也增加了基于鍵值對(duì)的數(shù)據(jù)存儲(chǔ)機(jī)制,可用于實(shí)現(xiàn)內(nèi)核用戶態(tài)的數(shù)據(jù)存儲(chǔ)和交換。eBPF 新增比較豐富的BPF Helper函數(shù),這使 BPF 程序可以訪問內(nèi)核功能,擴(kuò)展BPF 能力,同時(shí)保持 BPF 程序和內(nèi)核的安全隔離。?
隨著BPF 功能增強(qiáng),該技術(shù)不再局限于在內(nèi)核網(wǎng)絡(luò)子系統(tǒng),也逐步應(yīng)用于動(dòng)態(tài)追蹤、事件檢測(cè)、性能分析優(yōu)化、IO 子系統(tǒng)、進(jìn)程調(diào)度、文件子系統(tǒng)等等。應(yīng)用場(chǎng)景也從具體的點(diǎn)擴(kuò)展到面:可觀測(cè)性、Tracing、安全、性能分析和根因分析等等。同時(shí)也涌現(xiàn)出大批優(yōu)秀的開源項(xiàng)目如Bcc、Cilium、bpftrace、Falco、Katran、Pixie。
3?
滴滴生產(chǎn)環(huán)境的業(yè)務(wù)痛點(diǎn)
在數(shù)據(jù)中心有很多基礎(chǔ)服務(wù),這些服務(wù)在穩(wěn)定性、生產(chǎn)效能、可擴(kuò)展性、安全等發(fā)揮著重要作用,這些基礎(chǔ)設(shè)施在實(shí)際落地時(shí)都面臨著不同程度的挑戰(zhàn)。
流量回放測(cè)試
云原生的規(guī)模越來越大,承載的業(yè)務(wù)種類,業(yè)務(wù)流量和規(guī)模也都在急劇地?cái)U(kuò)大,軟件測(cè)試也面臨極大的挑戰(zhàn),包括測(cè)試環(huán)境搭建和測(cè)試用例的編寫和維護(hù)等。流量回放測(cè)試是一種全新的測(cè)試方法。通過在線下測(cè)試環(huán)境進(jìn)行回放,實(shí)現(xiàn)回歸測(cè)試,流量回放能夠完整的復(fù)現(xiàn)線上復(fù)雜的業(yè)務(wù)訪問場(chǎng)景,極大地提高項(xiàng)目迭代效率、加速業(yè)務(wù)回歸測(cè)試進(jìn)度,保證業(yè)務(wù)研發(fā)質(zhì)量提升。項(xiàng)目面臨的挑戰(zhàn):
業(yè)務(wù)編程語言繁多,基礎(chǔ)庫種類版本繁多。
業(yè)務(wù)網(wǎng)絡(luò)模型不統(tǒng)一(php單進(jìn)程處理,golang協(xié)程處理,其他編程語言多線程/進(jìn)程)。
對(duì)特定業(yè)務(wù)定制化,難以提升覆蓋度,并且成本較高。
業(yè)務(wù)有感,在穩(wěn)定性上較難保障。?
服務(wù)訪問拓?fù)?/strong>
隨著微服務(wù)架構(gòu)的興起,服務(wù)數(shù)量日漸增多,服務(wù)之間的依賴關(guān)系變得越來越復(fù)雜。服務(wù)鏈路的可觀測(cè)性對(duì)業(yè)務(wù)穩(wěn)定性保障有很重要的意義。它能夠清晰地展示服務(wù)接口之間的訪問關(guān)系,以及諸如性能、延遲、超時(shí)等業(yè)務(wù)指標(biāo)。線上出現(xiàn)問題的時(shí)候,依據(jù)服務(wù)拓?fù)潢P(guān)系能夠快速地定位問題節(jié)點(diǎn)。項(xiàng)目面臨的挑戰(zhàn):
業(yè)務(wù)種類量大,人工梳理成本高易出錯(cuò)。
通過推廣特定SDK依靠 metric 以及日志中服務(wù)調(diào)用關(guān)系進(jìn)行串聯(lián)的方式推動(dòng)難度大,在生產(chǎn)環(huán)境中容易出現(xiàn)斷鏈的情況。?
容器安全
在云原生的大勢(shì)所趨下,越來越多的企業(yè)選擇擁抱云原生,容器已經(jīng)成為應(yīng)用交付的標(biāo)準(zhǔn),也是云原生時(shí)代計(jì)算資源和配套設(shè)施的交付單元。容器的使用日益普及,容器安全問題日益凸顯。滴滴針對(duì)容器安全有一套完整的方案,其中一些核心的痛點(diǎn)就通過eBPF 技術(shù)解決。?
內(nèi)核根因定位
滴滴云原生平臺(tái)的容器部署密度、超賣比都較高,在共享內(nèi)核容器虛擬化場(chǎng)景下容易出現(xiàn)資源不合理使用導(dǎo)致的問題。傳統(tǒng)的內(nèi)核指標(biāo)偏向于基本、整體、粗粒度層面的統(tǒng)計(jì)檢測(cè),同時(shí)傳統(tǒng)的定位工具資源消耗較多,性能影響較大。因此徹底確定內(nèi)核根因,需要對(duì)內(nèi)核子系統(tǒng)進(jìn)行深度觀測(cè),以及實(shí)現(xiàn)常態(tài)化觀測(cè),解決事中事后出現(xiàn)的突發(fā)、超時(shí)、毛刺等棘手問題。
4?
滴滴HuaTuo eBPF 平臺(tái)實(shí)踐
eBPF 技術(shù)能夠很好的解決上述出現(xiàn)的語言依賴痛點(diǎn),同時(shí)eBPF 和動(dòng)態(tài)追蹤技術(shù)結(jié)合對(duì)實(shí)現(xiàn)深度觀測(cè)內(nèi)核提供支撐。但實(shí)際落地過程中需要回答如下問題:
在需求多的情況下,如何快速的滿足這些需求,提升研發(fā)效能快速落地?
目前行業(yè)中雖有落地案例,但規(guī)模相對(duì)較小,如何實(shí)現(xiàn)從點(diǎn)到面的落地,如何保證宿主機(jī)穩(wěn)定性?
如何統(tǒng)一觀測(cè)和保障插樁點(diǎn)性能損耗,出現(xiàn)問題如何快速回退、降級(jí)、止損??
平臺(tái)建設(shè)
基于如上考慮我們研發(fā)了eBPF 平臺(tái),業(yè)務(wù)可以直接使用平臺(tái)提供的通用能力,只需要關(guān)注自身邏輯實(shí)現(xiàn)即可。平臺(tái)建設(shè)過程中重點(diǎn)圍繞著提升研發(fā)效能,提供業(yè)務(wù)視角,保障穩(wěn)定性和保障性能等維度。
提升研發(fā)效能
早期用戶需要關(guān)心如何解析BPF 字節(jié)碼,如何加載到內(nèi)核,創(chuàng)建KV Map 以及將特定的Section 代碼附著到特定的運(yùn)行節(jié)點(diǎn)。最后用戶還需要關(guān)注如何從內(nèi)核獲取數(shù)據(jù)。平臺(tái)重要的功能是將底層的技術(shù)細(xì)節(jié)屏蔽,類似的上述功能只需要調(diào)用bpfload和bpfmap 接口即可。
提供業(yè)務(wù)視角
業(yè)務(wù)和平臺(tái),業(yè)務(wù)和業(yè)務(wù)之間的發(fā)布規(guī)律不同。最終我們采用BPF Obj字節(jié)碼的方式將業(yè)務(wù)的邏輯和平臺(tái)解耦,業(yè)務(wù)根據(jù)需求調(diào)用平臺(tái)接口即可。同時(shí)平臺(tái)需要考慮標(biāo)準(zhǔn)化,支持其他開源組件定義的SEC,這樣就能夠兼容已有的BPF字節(jié)碼,直接在平臺(tái)運(yùn)行。
保障穩(wěn)定性
作為新的技術(shù)落地,需要重點(diǎn)關(guān)注宿主穩(wěn)定性問題。穩(wěn)定的保障主要從內(nèi)核層,框架側(cè),以及和業(yè)務(wù)感知的方面建立。
保障性能
所有的BPF 代碼都是運(yùn)行在內(nèi)核態(tài),因此過多的耗時(shí)依然會(huì)對(duì)系統(tǒng)造成影響。事件驅(qū)動(dòng),共享內(nèi)存,ringbuf 生產(chǎn)消費(fèi)等方式在該平臺(tái)都有應(yīng)用。
平臺(tái)組成
BPF字節(jié)碼管理
首先是解析ELF能力,包括SEC、Map、變量、結(jié)構(gòu)體的定義。通過SEC能夠清楚BPF Prog 類型以及可以自動(dòng)加載的Hook 附著點(diǎn)等。通過Map的定義解析出其類型,大小,Key 類型,Value 類型等信息。
高性能數(shù)據(jù)處理
平臺(tái)支持業(yè)務(wù)類型較多,因此需要從各個(gè)維度考慮性能保障。首先在內(nèi)核側(cè)對(duì)probe hook點(diǎn)動(dòng)態(tài)評(píng)測(cè),提供熔斷機(jī)制。在平臺(tái)側(cè)提供高性能數(shù)據(jù)通信,ringbuf 生產(chǎn)消費(fèi)方式減低延遲。
穩(wěn)定性管理
平臺(tái)設(shè)計(jì)初衷是解決線上問題保證業(yè)務(wù)穩(wěn)定性,因此平臺(tái)自身實(shí)現(xiàn)了事件熔斷和自愈功能。當(dāng)檢測(cè)到宿主BPF 出現(xiàn)異常,平臺(tái)會(huì)自動(dòng)unload bpf從而避免當(dāng)前BPF造成過高的負(fù)載。除了實(shí)現(xiàn)事件的熔斷和自愈,同時(shí)限制平臺(tái)使用的系統(tǒng)資源如cpu、mem。
容器信息管理
實(shí)現(xiàn)該功能主要基于如下因素:1. 所有業(yè)務(wù)運(yùn)行在容器,參數(shù)的傳遞,業(yè)務(wù)的識(shí)別都需要該信息。2. 內(nèi)核cgroup信息需要和容器信息進(jìn)行聚合。
平臺(tái)使用
平臺(tái)除了API 接口,還提供了命令行方式,這樣非常態(tài)運(yùn)行BPF OBJ或者調(diào)試OBJ 都可以在該平臺(tái)運(yùn)行。
代碼示例如下:
編譯:
?
?
clang -O2 -g -target bpf -c $(NAME).bpf.c -o $(NAME).o
?
?
運(yùn)行:平臺(tái)自動(dòng)解析BPF 定義的結(jié)構(gòu)體并打印到stdout。
5?
滴滴業(yè)務(wù)落地實(shí)踐
在滴滴很多業(yè)務(wù)已經(jīng)接入HuaTuo eBPF 平臺(tái),例如服務(wù)測(cè)試回歸、容器安全、主機(jī)安全、服務(wù)訪問拓?fù)洹⒕W(wǎng)絡(luò)診斷,內(nèi)核根因定位等等。下面主要以內(nèi)核根因定位為例進(jìn)行講解。?
內(nèi)核根因定位背景
現(xiàn)今,降本增效是廣大互聯(lián)網(wǎng)公司的主題,在滴滴容器部署密度,超賣比都較高,共享內(nèi)核容器技術(shù)在這種情景下很難避免由于資源不合理使用影響到其他業(yè)務(wù)的情況。在發(fā)生故障時(shí)第一舉措是止損,容器漂移,這樣問題現(xiàn)場(chǎng)就丟失了,線下復(fù)現(xiàn)問題的難度大,人力機(jī)器的成本很高。此外,線上偶發(fā)的毛刺、耗時(shí)和超時(shí)等問題沒有規(guī)律可循,綜上原因常態(tài)觀測(cè)是一個(gè)非常強(qiáng)的需求。
內(nèi)核根因定位思路
根據(jù)可觀測(cè)性三大支柱(如下圖所示),首先我們建立起內(nèi)核深度觀測(cè)指標(biāo),這些指標(biāo)更加細(xì)粒度,能夠反映出內(nèi)核各子系統(tǒng)健康狀態(tài)。建立這些指標(biāo)時(shí)會(huì)從不同的角度評(píng)測(cè)合理性、性能影響,最終實(shí)現(xiàn)常態(tài)觀測(cè)。其次,事件驅(qū)動(dòng)實(shí)現(xiàn)獲取內(nèi)核異常日志上下文,我們關(guān)心內(nèi)核各子系統(tǒng)在異常路徑,慢路徑等出錯(cuò)狀態(tài)收集。異常事件是解決內(nèi)核問題根因的關(guān)鍵。隨著底層基礎(chǔ)能力的建立,我們可以將這些信息就行匯總、分析、最終給出分析報(bào)告。
內(nèi)核根因定位平臺(tái)
我們將內(nèi)核根因定位平臺(tái)分為四部分:
內(nèi)核數(shù)據(jù)采集。該部分主要實(shí)現(xiàn)內(nèi)核核心指標(biāo)采集,以及內(nèi)核異常上下文的收集。
內(nèi)核數(shù)據(jù)聚合。該部分主要實(shí)現(xiàn)將內(nèi)核觀測(cè)數(shù)據(jù)和容器/Pod信息進(jìn)行匯總并上傳到存儲(chǔ)設(shè)備。
數(shù)據(jù)分析層。該部分主要將收集到的數(shù)據(jù)進(jìn)行處理,對(duì)上提供分析服務(wù)。
數(shù)據(jù)展示層。主要分析診斷中心、觀測(cè)中心、日志中心、分析報(bào)告、以及報(bào)警中心等。
6?
未來規(guī)劃展望
eBPF內(nèi)核技術(shù)在滴滴云原生場(chǎng)景進(jìn)行了大規(guī)模多場(chǎng)景的落地實(shí)踐,未來HuaTuo eBPF平臺(tái)會(huì)服務(wù)更多的業(yè)務(wù)線。如今,我們正尋求合適的基金會(huì)進(jìn)行項(xiàng)目孵化,一起和行業(yè)開發(fā)者共建、共享。最近幾年,eBPF 技術(shù)雖然有比較大的發(fā)展,但在某些場(chǎng)景中的功能還不夠完善,比如在性能上進(jìn)行優(yōu)化、CPU調(diào)度等在離線混部場(chǎng)景中深入探索等,期待后續(xù)與大家持續(xù)交流探討。
編輯:黃飛
?
評(píng)論