在eBPF篇中,咱們知道雖然可用 C 來實現 BPF,但編譯出來的卻仍然是 ELF 文件,開發者須要手動析出真正能夠注入內核的代碼。工做有些麻煩,因而就有人設計了 BPF Compiler Collection(BCC),BCC 是一個(基於 C 和 C++) python 庫,實現了對 BCC 應用層接口的封裝。html
使用 BCC 進行 BPF 的開發仍然須要開發者自行利用 C 來設計 BPF 程序,其餘的工做,包括編譯、解析 ELF、加載 BPF 代碼塊以及建立 map 等等基本能夠由 BCC 承擔。python
USDT 爲user-mode statically defined traceslinux
bcc大概,基本能夠理解成eBPF的使用框架。git
在Ubuntu中直接安裝二進制文件,命令以下:github
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以上的版本。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
紅帽編譯: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
須要足夠大的編譯空間。oop
或者使用外部源,設置llvm源以下:flex
[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/
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
示例腳本主要位於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時間。