天天看點

Linux未來監控tracing架構——eBPF 1.   運作監測 2.   架構 3.   bcc

eBPF源于早年間的成型于 BSD

之上的傳統技術 BPF(Berkeley Packet Filter)。BPF 的全稱是 Berkeley

Packet Filter,顧名思義,這是一個用于過濾(filter)網絡封包(packet)的架構。

BPF 是在 1997 年首次被引入 Linux 的,Linux 核心中的封包過濾機制其實是有自己的名字的:Linux Socket Filter,簡稱 LSF。

從 3.15 開始,一個套源于 BPF 的全新設計開始,在3.17被添置到了

kernel/bpf 下。全新設計最終被命名為了 extended BPF(eBPF);為了後向相容,傳統的 BPF 仍被保留了下來,并被重命名為 classical BPF(cBPF)。相對于 cBPF,eBPF 帶來的改變可謂是革命性的:一方面,它已經為核心追蹤(Kernel Tracing)、應用性能調優/監控、流控(Traffic Control)等領域帶來了激動人心的變革;另一方面,在接口的設計以及易用性上,eBPF 也有了較大的改進。

cBPF 所覆寫的功能範圍很簡單,就是網絡監控和 seccomp 兩塊,資料接口設計的粗放;而 eBPF 的利用範圍要廣的多,性能調優、核心監控、流量控制什麼的,資料接口的多樣性設計。

由一個檔案(net/core/filter.c)進化到一個目錄(kernel/bpf)

目前,支援生成 BPF 僞代碼的編譯器隻有

llvm 一家,即使是通篇使用 gcc 編譯的 Linux 核心,samples 目錄下的 bpf 範例也要借用 llvm 來編譯完成。

1.  

運作監測

  eBPF 其實是核心子產品,比核心子產品更短小精幹,實作的功能也更新穎,

eBPF注入的代碼是要在核心中運作的,會有安全隐患。

為了最大限度控制安全隐患,cBPF 時代就開始加入了代碼檢查機制以防止不規範的注入代碼;到了 eBPF則在載入程式(bpf_load_program())時加入了更複雜的verifier 機制,會進行一系列的安全檢查。

2.  

架構

架構如下:

Linux未來監控tracing架構——eBPF 1.   運作監測 2.   架構 3.   bcc

3.  

bcc

現在可以用 C 來實作 BPF,但編譯出來的卻仍然是

ELF 檔案,開發者需要手動析出真正可以注入核心的代碼。這工作有些麻煩,于是就有人設計了 BPF Compiler Collection(BCC),BCC 是一個 python 庫,但是其中有很大一部分的實作是基于 C 和 C++的,python實作了對 BCC 應用層接口的封裝。

使用 BCC 進行 BPF 的開發仍然需要開發者自行利用 C 來設計 BPF 程式——但也僅此而已,餘下的工作,包括編譯、解析 ELF、加載 BPF 代碼塊以及建立 map 等等基本可以由 BCC 一力承擔,無需多勞開發者費心。

3.1    

bcc安裝

github的位址連結如下:

https://github.com/iovisor/bcc

執行:git clone https://github.com/iovisor/bcc.git

在Ubuntu中直接安裝二進制檔案,指令如下:

sudo apt-key adv --keyserver

keyserver.ubuntu.com --recv-keys D4284CDD

echo "deb https://repo.iovisor.org/apt/xenial

xenial main" | sudo tee /etc/apt/sources.list.d/iovisor.list

sudo apt-get update

sudo apt-get install bcc-tools

libbcc-examples linux-headers-$(uname -r)

這樣就可以 使用bcc/example/tracing中的python用例。