代码改变世界
[登录 · 注册]
  • eBPF监控工具bcc系列一启航
  • eBPF监控工具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时间。
    
  • 上一篇:AngularJs filter 过滤器
    下一篇:[转载] kprobe原理解析(一)
  • 【推广】 阿里云小站-上云优惠聚集地(新老客户同享)更有每天限时秒杀!
    【推广】 云服务器低至0.95折 1核2G ECS云服务器8.1元/月
    【推广】 阿里云老用户升级四重礼遇享6.5折限时折扣!
  • 原文:https://www.cnblogs.com/muahao/p/9447519.html
走看看 - 开发者的网上家园