目录
bcc 提供的所有工具就都安装到 /usr/share/bcc/tools 这个目录中了。不过这里提醒你,bcc 软件包默认不会把这些工具配置到系统的 PATH 路径中,所以你得自己手动配置:
$ export PATH=$PATH:/usr/share/bcc/tools
yum install bcc-tools
Install build dependencies:
sudo yum groupinstall -y "Development tools"
sudo yum install -y elfutils-libelf-devel cmake3 git bison flex ncurses-devel
sudo yum install -y luajit luajit-devel # for Lua support
Install and compile LLVM:
curl -LO http://releases.llvm.org/7.0.1/llvm-7.0.1.src.tar.xz
curl -LO http://releases.llvm.org/7.0.1/cfe-7.0.1.src.tar.xz
tar -xf cfe-7.0.1.src.tar.xz
tar -xf llvm-7.0.1.src.tar.xz
mkdir clang-build
mkdir llvm-build
cd llvm-build
cmake3 -G "Unix Makefiles" -DLLVM_TARGETS_TO_BUILD="BPF;X86" \
-DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr ../llvm-7.0.1.src
make
sudo make install
cd ../clang-build
cmake3 -G "Unix Makefiles" -DLLVM_TARGETS_TO_BUILD="BPF;X86" \
-DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr ../cfe-7.0.1.src
make
sudo make install
cd ..
Install and compile BCC:
git clone GitHub - iovisor/bcc: BCC - Tools for BPF-based Linux IO analysis, networking, monitoring, and more
mkdir bcc/build; cd bcc/build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr
make
sudo make install
PS:
1. 使用make 不能使用make -j8
2. ln -s python2 python #创建python的软连接
3. make install路径:/usr/share/bcc/tools
./cachestat 1 3
TOTAL MISSES HITS DIRTIES BUFFERS_MB CACHED_MB
0 0 0 0 3 303
1 0 1 0 3 303
0 0 0 0 3 303
你可以看到,cachestat 的输出其实是一个表格。每行代表一组数据,而每一列代表不同的缓存统计指标。这些指标从左到右依次表示
TOTAL ,表示总的 I/O 次数;
MISSES ,表示缓存未命中的次数;
HITS ,表示缓存命中的次数;
DIRTIES, 表示新增到缓存中的脏页数;
BUFFERS_MB 表示 Buffers 的大小,以 MB 为单位;
CACHED_MB 表示 Cache 的大小,以 MB 为单位。
./cachetop
13:52:30 Buffers MB: 3 / Cached MB: 391 / Sort: HITS / Order: ascending
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%
1506 root cachetop 1 0 0 100.0% 0.0%
1534 nginx nginx 1 3 0 25.0% 50.0%
1544 root curl 20 0 0 100.0% 0.0%
1543 root bash 198 4 0 98.0% 2.0%
1543 root curl 1993 80 0 96.1% 3.9%
它的输出跟 top 类似,默认按照缓存的命中次数(HITS)排序,展示了每个进程的缓存命中情况。具体到每一个指标,这里的 HITS、MISSES和DIRTIES ,跟 cachestat 里的含义一样,分别代表间隔时间内的缓存命中次数、未命中次数以及新增到缓存中的脏页数。
而 READ_HIT 和 WRITE_HIT ,分别表示读和写的缓存命中率。
./funccount -i 1 c:malloc
Tracing 1 functions for "b'c:malloc'"... Hit Ctrl-C to end.
FUNC COUNT
b'malloc' 2
FUNC COUNT
b'malloc' 1
FUNC COUNT
b'malloc' 1
FUNC COUNT
b'malloc' 1
FUNC COUNT
b'malloc' 1
funccount 支持一些参数, 比如-p指定某个进程ID, -i指定输出的时间间隔。它当前只能同时支持最多1000个跟踪对象(probe), 对于fmt.*来说,函数不多还OK, 但是如果跟踪所有的libgo中的函数就有问题了
# funccount 'go:*'
maximum of 1000 probes allowed, attempted 21178
嗯哼, 不工作了。 就像 bcc/BPF 中其它一些问题一样, 如果这个限制在应用中阻碍太多的话我们考虑寻找一个方式来解决它。
./trace do_sys_open
PID TID COMM FUNC
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
1 1 systemd do_sys_open
1 1 systemd do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
1 1 systemd do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
832 832 irqbalance do_sys_open
./trace '/root/bcc_test/test_malloc:add "%d %d" arg1, arg2' PID TID COMM FUNC - 1691 1691 test_malloc add 2 3 1692 1692 test_malloc add 2 3 1693 1693 test_malloc add 2 3 1694 1694 test_malloc add 2 3 1695 1695 test_malloc add 2 3 1696 1696 test_malloc add 2 3