<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

eBPF的前世今生?eBPF在使用中遇到的問題有哪些?

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2023-08-12 15:10 ? 次閱讀

前世BPF

在介紹eBPF (Extended Berkeley Packet Filter)之前,我們先來了解一下它的前身-BPF (Berkeley Packet Filter)伯克利數據包過濾器。

b5cee8e6-3847-11ee-9e74-dac502259ad0.png

BPF最早由Van Jacobson在1992年開發,用于在Unix操作系統中過濾和捕獲網絡數據包。它運行在內核中,通過提供一個簡單而強大的虛擬機,可以在網絡協議層上進行高效的數據包處理操作。BPF通過把過程轉換成指令序列來實現,這些指令直接在內核中執行,從而避免了用戶空間和內核空間之間頻繁的切換。

基于BPF開發的工具庫有libpcap、tcpdump等工具。

BPF在網絡性能監測和安全策略實施方面具有廣泛的應用。然而,由于其指令集的限制和功能的局限性,它無法支持更加復雜和靈活的數據包處理需求。

今生eBPF

正是為了克服BPF的限制,eBPF應運而生。eBPF于2014年(3.18版本)年首次引入Linux內核,并在此后的幾年中經歷了快速的發展和完善。

eBPF是一個高度可擴展的、運行在內核中的虛擬機,具備與傳統BPF相似的指令集,但功能更加強大且更加靈活。eBPF可以在運行時即時編譯,從而能夠處理更加復雜和動態的數據包處理任務,如網絡流量分析、安全檢測和性能優化等。

b5e3bdac-3847-11ee-9e74-dac502259ad0.png

eBPF的靈活性和可擴展性體現在它可以與各種用戶空間程序(如tcpdump、Wireshark、Suricata等)和工具(如網絡監控、調試器等)無縫集成。eBPF還可以與系統的其他組件(如網絡協議棧、調度器等)交互,從而實現更加細粒度的性能優化和安全策略。

此外,eBPF的開發和使用也得到了廣泛的支持和推動。社區中有許多致力于eBPF的開發者和貢獻者,他們不斷改進和擴展eBPF的功能。同時,一些知名的大型技術公司,如Facebook、Netflix和Google等,也在其產品和基礎設施中廣泛使用eBPF。

eBPF的發展史

2014 年初,Alexei Starovoitov 實現了eBPF。新的設計針對現代硬件進行了優化,所以eBPF生成的指令集比舊的 BPF 解釋器生成的機器碼執行得更快。擴展版本也增加了虛擬機中的寄存器數量,將原有的 2 個 32 位寄存器增加到10 個 64 位寄存器。由于寄存器數量和寬度的增加,開發人員可以使用函數參數自由交換更多的信息,編寫更復雜的程序??傊?,這些改進使eBPF版本的速度比原來的 BPF 提高了 4 倍。

eBPF是一項具有革命性的技術,源自于Linux內核,可以在特權環境中運行受沙盒保護的程序,例如操作系統內核。它被用于安全有效地擴展內核的功能,而無需更改內核源代碼或加載內核模塊。

在歷史上,操作系統一直是實現可觀察性、安全性和網絡功能的理想場所,這是因為內核具有特權能力,可以監督和控制整個系統。與此同時,由于內核在系統中的核心地位以及對穩定性和安全性的高要求,操作系統內核的演進往往很困難。因此,與操作系統外部實現的功能相比,操作系統層面的創新速度傳統上較低。

b6110226-3847-11ee-9e74-dac502259ad0.png

eBPF從根本上改變了這個共識。通過在操作系統內運行受沙盒保護的程序,應用開發人員可以在運行時運行eBPF程序,為操作系統添加額外的功能。操作系統會利用即時編譯器和驗證引擎的幫助來保證安全性和執行效率,就像本地編譯一樣。這導致了一系列基于eBPF的項目的涌現,涵蓋了各種用例,包括下一代網絡、可觀測性和安全功能。

如今,eBPF被廣泛應用于驅動各種用例:在現代數據中心和云原生環境中提供高性能的網絡和負載均衡,以低開銷提取細粒度的安全可觀測性數據,幫助應用開發人員追蹤應用程序、提供性能故障排除的見解,進行預防性應用程序和容器運行時安全執行等等??赡苄允菬o限的,eBPF正在釋放出的創新力量才剛剛開始。

Hook Overview

eBPF程序是事件驅動的,當內核或應用程序通過某個掛鉤點時運行。預定義的掛鉤點包括系統調用、函數入口/退出、內核追蹤點、網絡事件等等。

b6363d5c-3847-11ee-9e74-dac502259ad0.png

eBPF使用中遇到的問題

1

內核適應性,老版本是否某些功能不可用?

eBPF 最低要求版本為LInux 4.1,eBPF的最低內核版本要求是 Linux 4.1,這是在 2015 年發布的內核版本。在這個版本之前的內核不支持 eBPF。

對于Linux4.1版本之前的監控

擎創對于Linux 4.1.0 之前的版本采用BPF采集HTTP 1數據以及DNS解析請求,進行可觀測統計。

對于Linux4.1版本之后的監控

為了保證eBPF程序在各個linux內核版本之間的可移植性,我們編寫eBPF程序的時候采用了CORE技術,CORE技術目前只有在 Linux 4.9.0 之后才會支持。

如果用戶內核版本低于4.9.0或者內核未開啟CO-RE, 我們能夠提供linux內核升級包。

2

權限、安全要求

eBPF權限

需要具備root權限或CAP_SYS_ADMIN能力,這意味著只有能夠加載內核模塊的用戶才能加載eBPF程序。

eBPF執行安全

在執行安全方面,eBPF 在加載之前會通過eBPF驗證器對要執行的字節碼文件進行校驗,包括但不限于以下方面:

(1)程序不包含控制循環

(2)程序不會執行超過內核允許的最大指令數

(3)程序不包含任何無法到達的指令

(4)程序不會跳轉到程序界限之外

3

uprobe 和 kprobe 差異

kprobe的優劣分析

優勢:

(1)更簡單實現和更易維護。它不依賴于其他庫的具體實現細節

劣勢:

(1)用戶程序可能會將單個請求分割成多個系統調用,重新組裝這些請求會帶來一些復雜性

(2)與TLS不兼容, 無法解包TLS

uprobe的優劣分析

優勢:

(1)我們可以訪問和捕獲應用程序上下文,如堆棧跟蹤

(2)我們可以構建uprobes以在解析完成后捕獲數據,避免在跟蹤器中重復工作

(3)可以比較容易捕獲https 請求,對TLS兼容性較好

劣勢:

(1)對于使用的底層庫版本敏感。無法在剝離了符號的二進制文件上運行

(2)需要為每個庫實現不同的探針(每種編程語言可能都有自己的一組庫)

(3)會導致額外的調用性能開銷

4

性能消耗

雖然內核社區已經對 eBPF 做了很多的性能調優,跟蹤用戶態函數(特別是鎖爭用、內存分配之類的高頻函數)還是有可能帶來很大的性能開銷。因此,我們在使用 uprobe,kprobe 時,應該盡量避免長時間跟蹤高頻函數。

我們以監控一個Golang 程序HTTP 1通信過程為例子,在分別開啟uprobe和kprobe時候對該程序進行壓力測試:

b693f532-3847-11ee-9e74-dac502259ad0.pngb6c8c262-3847-11ee-9e74-dac502259ad0.png

從結果可以看出,如果HTTP延遲大于1毫秒,引入的開銷可以忽略不計,在大多數情況下只是噪音。這對于kprobes和uprobes都是類似的,盡管我們重新解析了所有數據,但kprobes的性能稍微好一些。請注意,開銷有時是負值,這很可能只是測量中的噪音。在這里的關鍵要點是,如果您的HTTP處理程序正在進行任何實際的工作(大約1毫秒計算時間),引入的開銷基本上可以忽略不計。

5

能否追蹤所有用戶態/內核態函數

調用的入參和返回值

用戶態

eBPF可以追蹤指定函數調用入參和返回值。hook點可以為指定函數名稱或者地址。如果可執行文件的符號被優化,則需要使用一些逆向手段定位指定函數的地址。

內核態

我們可以使用bpftrace -l了解可以hook的鉤子點。

bpftrace是通過讀?。ㄏ路酱a)獲取kernel層所有的可跟蹤點。

/sys/kernel/debug/tracing/available_filter_functions

6

是否有丟失事件的風險

kprobe和uprobe本身的事件觸發并不會丟失

kprobe是一種內核探測機制,它允許用戶在內核函數執行前或執行后插入代碼。uprobe是一種對用戶空間函數進行探測的機制,它允許用戶在用戶空間函數的入口或出口處插入代碼。

eBPF通過將用戶編寫的處理邏輯加載到內核中,在事件發生時執行此邏輯,以實現用戶級的觀察和處理。由于eBPF的虛擬機技術提供了一種安全可隔離的方式來在內核中執行用戶代碼,因此kprobe和uprobe事件不會丟失。

bpf_perf_event會有丟失事件的風險

內核態的eBPF代碼將收集到的事件寫入 bpf_perf_event 環形緩沖區,用戶態程序進行收集上報。當讀寫速度不匹配時,就會丟失事件:

(1)寫速度過快:例如每個HTTP transaction都作為一個event寫入緩沖區,這樣比批量寫的風險更高。

(2)讀速度過慢:例如用戶態代碼沒有在專門線程中讀取緩沖區,或者系統負載過高。

bpf_map會有丟失事件的風險

eBPF map有大小限制,當map被寫滿的時,將無法寫入新的數據

(1)丟失數據:由于map已滿,新的寫入操作將無法成功,導致數據丟失。這可能會影響到程序的正確性和完整性。

(2)性能下降:當map寫滿時,寫入操作將被阻塞,導致系統的性能下降。這會影響到整體的系統響應時間和吞吐量。

展望

隨著eBPF的不斷發展和壯大,我們可以看到它在網絡和系統領域的巨大潛力。eBPF已經被證明是一種強大且高效的工具,可以用于實現各種高級網絡和系統功能。

在未來,我們有理由相信eBPF將繼續發展,并被越來越多的開發者和組織使用。隨著eBPF功能的不斷擴展和完善,我們可以期待更多創新的網絡應用和系統工具的出現,從而推動整個行業向前發展。

總之,eBPF的前世今生令人振奮,它不僅繼承了BPF的優點,還擁有更強大和靈活的功能。我們期待看到eBPF為網絡和系統帶來更多的創新和改進,為我們的數字化世界帶來更強大的支撐。





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • UNIX操作系統

    關注

    0

    文章

    13

    瀏覽量

    15271
  • 虛擬機
    +關注

    關注

    1

    文章

    866

    瀏覽量

    27486
  • 過濾器
    +關注

    關注

    1

    文章

    413

    瀏覽量

    19137
  • LINUX內核
    +關注

    關注

    1

    文章

    312

    瀏覽量

    21407
  • 調度器
    +關注

    關注

    0

    文章

    96

    瀏覽量

    5169

原文標題:聊聊eBPF的前世今生

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    實戰eBPF kprobe函數插樁

    本文作者為團隊小伙伴阿松,在Linux文件監控領域實戰經驗豐富。本次引入eBPF在文件監控上應用,提升文件變更的關聯進程信息等。在實現過程中,分享了eBPF kbproe時,被插樁函數超多參數獲取的解決方案。
    發表于 11-29 09:03 ?1571次閱讀

    解構內核源碼eBPF樣例編譯過程

    了解和掌握純c語言的ebpf編譯和使用,有助于我們加深對于eBPF技術原理的進一步掌握,也有助于開發符合自己業務需求的高性能的ebpf程序。
    的頭像 發表于 04-17 14:05 ?1197次閱讀

    基于ebpf的性能工具-bpftrace腳本語法

    bpftrace 通過高度抽象的封裝來使用 eBPF,大多數功能只需要寥寥幾筆就可以運行起來,可以很快讓我們搞清楚 eBPF 是什么樣的,而暫時不關心 eBPF 復雜的內部機理。由于
    的頭像 發表于 09-04 16:04 ?607次閱讀
    基于<b class='flag-5'>ebpf</b>的性能工具-bpftrace腳本語法

    芯片春秋——ARM前世今生

    芯片春秋 ARM前世今生
    發表于 05-25 15:05

    關于 eBPF 安全可觀測性,你需要知道的那些事兒

    非常復雜的話題,牽一發而動全身,防御機制、加固配置、漏洞利用等等挑戰性的技術。進行加固防御的過程,又會產生性能或者系統穩定性相關的影響。從 eBPF + LSM 的角度可以更加可視化、數據豐富的觀測內核
    發表于 09-08 15:31

    openEuler 倡議建立 eBPF 軟件發布標準

    擴展到了網絡、內核、安全、跟蹤等,而且它的功能特性還在快速發展,早期的 BPF 被稱為經典 BPF,簡稱 cBPF,正是這種功能擴展,使得現在的 BPF 被稱為擴展 BPF,簡稱 eBPF。如今
    發表于 12-23 16:21

    eBPF是什么以及eBPF能干什么

    一、eBPF是什么 eBPF是extended BPF的縮寫,而BPF是Berkeley Packet Filter的縮寫。對linux網絡比較熟悉的伙伴對BPF應該比較了解,它通過特定的語法
    的頭像 發表于 07-05 15:17 ?1w次閱讀
    <b class='flag-5'>eBPF</b>是什么以及<b class='flag-5'>eBPF</b>能干什么

    eBPF深入理解和實現原理

    簡單來說,wBPF 是一個在硬件上直接執行 eBPF 程序的系統。
    的頭像 發表于 06-14 09:25 ?3009次閱讀

    介紹eBPF針對可觀測場景的應用

    隨著eBPF推出,由于具有高性能、高擴展、安全性等優勢,目前已經在網絡、安全、可觀察等領域廣泛應用,同時也誕生了許多優秀的開源項目,如Cilium、Pixie等,而iLogtail 作為阿里內外千萬實例可觀測數據的采集器,eBPF 網絡可觀測特性也預計會在未來8月發布。
    的頭像 發表于 08-11 09:10 ?1255次閱讀

    openEuler倡議建立eBPF軟件發布標準

    eBPF 是一個能夠在內核運行沙箱程序的技術,提供了一種在內核事件和用戶程序事件發生時安全注入代碼的機制,使得非內核開發人員也可以對內核進行控制。隨著內核的發展,eBPF 逐步從最初的數據包過濾
    的頭像 發表于 12-06 10:29 ?408次閱讀

    Linux 內核:eBPF優勢和eBPF潛力總結

    Express Data Path (XDP):網絡驅動程序是最早可以附加 XDP BPF 鉤子的點。當收到一個數據包時,eBPF 程序就會被觸發運行。
    發表于 01-10 11:37 ?2112次閱讀

    什么是eBPF,eBPF為何備受追捧?

    用云杉網絡 VP 向陽的話來說:“ eBPF 最重要(沒有之一)的特點是安全性” 。他表示,以往必須編寫內核模塊才能做到的工作現在基本都能做到。
    的頭像 發表于 05-06 11:41 ?1893次閱讀

    基于ebpf的性能工具-bpftrace

    在前面我已經分享了關于ebpf入門的文章: 基于ubuntu22.04-深入淺出 eBPF 。 這篇文章介紹一個基于ebpf技術的強大工具--bpftrace。 在現代計算機系統中,了解系統的內部
    的頭像 發表于 09-04 16:02 ?390次閱讀
    基于<b class='flag-5'>ebpf</b>的性能工具-bpftrace

    ebpf的快速開發工具--libbpf-bootstrap

    基于ubuntu22.04-深入淺出 eBPF 基于ebpf的性能工具-bpftrace 基于ebpf的性能工具-bpftrace腳本語法 基于ebpf的性能工具-bpftrace實戰
    的頭像 發表于 09-25 09:04 ?455次閱讀
    <b class='flag-5'>ebpf</b>的快速開發工具--libbpf-bootstrap

    eBPF動手實踐系列三:基于原生libbpf庫的eBPF編程改進方案簡析

    在上一篇文章《eBPF動手實踐系列二:構建基于純C語言的eBPF項目》中,我們初步實現了脫離內核源碼進行純C語言eBPF項目的構建。libbpf庫在早期和內核源碼結合的比較緊密,如今的libbpf庫更加成熟,已經完全脫離內核源碼
    的頭像 發表于 03-19 14:19 ?331次閱讀
    <b class='flag-5'>eBPF</b>動手實踐系列三:基于原生libbpf庫的<b class='flag-5'>eBPF</b>編程改進方案簡析
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>