Linux未來監控tracing框架 eBPF

2021-08-19 18:29:48 字數 1697 閱讀 4681

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 來編譯完成。

ebpf 其實是核心模組,比核心模組更短小精幹,實現的功能也更新穎, ebpf注入的**是要在核心中執行的,會有安全隱患。

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

架構如下:

現在可以用 c 來實現 bpf,但編譯出來的卻仍然是 elf 檔案,開發者需要手動析出真正可以注入核心的**。這工作有些麻煩,於是就有人設計了 bpf compiler collection(bcc),bcc 是乙個 python 庫,但是其中有很大一部分的實現是基於 c 和 c++的,python實現了對 bcc 應用層介面的封裝。

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

github的位址鏈結如下:

執行:git clone .git

在ubuntu中直接安裝二進位制檔案,命令如下:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys d4284cdd

echo "deb 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用例。

linux負載監控

linux端 include include include include include include include include include include define maxline 4096 int gethostip char ipaddr,int inte ce memse...

Linux系統監控

檢視cpu 核數cat proc cpuinfo grep cpu cores uniq 檢視cpu 型號cat proc cpuinfo grep model name uniq 檢視記憶體總數 cat proc meminfo grep memtotal 檢視硬碟大小 fdisk l grep ...

linux 程序監控

1 ps命令 直接在linux系統中輸入 ps 結果如下 預設情況下,ps命令指揮顯示執行在當前控制台下的屬於當前使用者的程序。pid 程式的程序號 tty 程式執行的終端 time 程式執行的時間 引數 在linux系統中,程序的狀態有五種 1.執行 正在執行或在執行佇列中等待 2.中斷 休眠中,...