天天看點

eBPF監控工具bcc系列一啟航 1.   安裝 2.   Ubuntu編譯 3.   紅帽環境編譯 4.   核心要求 5.   示例 6.   bcc工具架構

 在eBPF篇中,我們知道雖然可用 C 來實作 BPF,但編譯出來的卻仍然是 ELF 檔案,開發者需要手動析出真正可以注入核心的代碼。工作有些麻煩,于是就有人設計了 BPF Compiler Collection(BCC),BCC 是一個(基于 C 和 C++) python 庫,實作了對 BCC 應用層接口的封裝。

  使用 BCC 進行 BPF 的開發仍然需要開發者自行利用 C 來設計 BPF 程式,其他的工作,包括編譯、解析 ELF、加載 BPF 代碼塊以及建立 map 等等基本可以由 BCC 承擔。

USDT 為user-mode

statically defined traces

bcc大概,基本可以了解成eBPF的使用架構。

1.  

安裝

在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要求核心在4.1以上的版本。

2.  

Ubuntu編譯

如果進行源碼編譯,對環境有些要求:

l   LLVM3.7.1版本以上。

l   通過LLVM編譯的Clang

l   Cmake大于等于3.1版本

l   Gcc大于等于4.7

l   如果要支援Lua,需要LuaJIT.

VER=trusty

echo "deb http://llvm.org/apt/$VER/

llvm-toolchain-$VER-3.7 main deb-src http://llvm.org/apt/$VER/ llvm-toolchain-$VER-3.7

main" | tee /etc/apt/sources.list.d/llvm.list

wget -O -

http://llvm.org/apt/llvm-snapshot.gpg.key | apt-key add -

apt-get update 

# All versions

apt-get -y install bison build-essential

cmake flex git libedit-dev libllvm3.7 llvm-3.7-dev libclang-3.7-dev python

zlib1g-dev libelf-dev  netperf  iperf

# 支援Lua,安裝luajit。

sudo apt-get -y install luajit

luajit-5.1-dev

環境準備完畢後,進行編譯安裝

git clone

https://github.com/iovisor/bcc.git

mkdir bcc/build;

cd bcc/build

cmake .. -DCMAKE_INSTALL_PREFIX=/usr

make

make install

3.  

紅帽環境編譯

紅帽編譯:llvm的下載下傳路徑:

http://releases.llvm.org/download.html#6.0.0

  下載下傳cmake,連結位址:https://cmake.org/download/

    LLVM

source code

  Clang source code

  Clang Tools Extra source code

  Compiler RT source code

  LibC++ source code

1)clang-tools-extra-3.6.0.src.tar.xz解壓後重命名為extra

2)cfe-3.6.0.src.tar.xz解壓後重命名為clang

3)llvm-3.6.0.src.tar.xz解壓後重命名為llvm

4)compiler-rt-3.6.0.src.tar.xz解壓後命名為compiler-rt

mv clang/ llvm/tools/ 

mv extra/ llvm/tools/clang/ 

mv compiler-rt llvm/projects/

把四個檔案按如下的目錄結構進行存放:

#cd llvm

#mkdir build && cd build

#cmake ..

#make

需要足夠大的編譯空間。

或者使用外部源,設定llvm源如下:

[alonid-llvm-3.9.0]

name=Copr repo for llvm-3.9.0 owned by alonid

baseurl=https://copr-be.cloud.fedoraproject.org/results/alonid/llvm-3.9.0/epel-7-$basearch/

type=rpm-md

skip_if_unavailable=True

gpgcheck=1

gpgkey=https://copr-be.cloud.fedoraproject.org/results/alonid/llvm-3.9.0/pubkey.gpg

repo_gpgcheck=0

enabled=1

enabled_metadata=1

然後運作#yum update

#yum install llvm-3.9.0 clang-3.9.0

compiler-rt-3.9.0 llvm-3.9.0-devel

clang-3.9.0-devel llvm-3.9.0-static

此外還需要安裝iperf。

進行安裝。

最後設定PATH環境變量, 為其增加如下變量:

/opt/llvm-3.9.0/bin/

4.  

核心要求

CONFIG_BPF=y

CONFIG_BPF_SYSCALL=y

#

[optional, for tc filters]

CONFIG_NET_CLS_BPF=m

[optional, for tc actions]

CONFIG_NET_ACT_BPF=m

CONFIG_BPF_JIT=y

CONFIG_HAVE_BPF_JIT=y

[optional, for kprobes]

CONFIG_BPF_EVENTS=y

5.  

示例

示例腳本主要位于examples/tracing檔案夾中,用過之後就難以戒掉了。

例如跟蹤磁盤I/O塊大小的柱狀圖:

./bitehist.py

# ./bitehist.py

Tracing... Hit Ctrl-C to end.

^C

     kbytes              : count     distribution

0 -> 1          : 1       

|****************************************|

跟蹤塊I/O延時:

./disksnoop.py

輸出如下:

TIME(s)            T  BYTES   

LAT(ms)

9151.779756000     R  8          

0.26

9153.795887000     R  8          

0.31

9155.811593000     R 

8           0.21

第一列是時間戳,第二列是IO類型,第三列是IO位元組數,第四列是本次的IO時間。

6.  

bcc工具架構

bcc相關的工具架構如下:

eBPF監控工具bcc系列一啟航 1.   安裝 2.   Ubuntu編譯 3.   紅帽環境編譯 4.   核心要求 5.   示例 6.   bcc工具架構