bcc
BCC 是一个用于创建高效内核跟踪和操作程序的工具包,包括几个有用的工具和示例。它利用了扩展的 BPF(Berkeley Packet Filters),正式名称为 eBPF,这是首次添加到 Linux 3.15 的新功能。BCC 使用的大部分内容都需要 Linux 4.1 及更高版本。
github上的地址在[这里](https://github.com/iovisor/bcc)
。
BCC 使 BPF 程序更易于编写,使用 C 中的内核工具(并包括围绕 LLVM 的 C 包装器),以及 Python 和 lua 中的前端。它适用于许多任务,包括性能分析和网络流量控制。
安装
Ubuntu
的源中包含生成的二进制包,可以在packages.ubuntu.com找到。
sudo apt-get install bpfcc-tools linux-headers-$(uname -r)
这些工具安装在/sbin
(/usr/sbin
在 Ubuntu 18.04
中)并带有-bpfcc
扩展名。尝试运行sudo opensnoop-bpfcc
。
签名包安装:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4052245BD4284CDD
echo "deb https://repo.iovisor.org/apt/$(lsb_release -cs) $(lsb_release -cs) 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)
工具将安装在 /usr/share/bcc/tools 下。
BCC自带工具
BCC自带的部分工具(/usr/share/bcc/tool)的基本用法:
- execsnoop
- opensnoop
- ext4slower (or btrfs, xfs, zfs*)
- biolatency
- biosnoop
- cachestat
- tcpconnect
- tcpaccept
- tcpretrans
- runqlat
- profile
把地址转到 /usr/share/bcc/tool
下,等下我们要测试几个工具。
我们来看一个比较简单的例子,比如我们想分析一个软件,一开始我们想看看这个软件读写了哪些文件,例如把数据存在某个目录下,或者log
放到哪里了,都可以通过opensnoop
命令进行监控。如下:
开启另一个命令窗口,创建一个文件:
touch 1.txt
这时候,opensnoop
输入如下的信息:
10880 touch 3 0 /etc/ld.so.cache
10879 opensnoop -1 2 /usr/lib/python2.7/encodings/ascii.x86_64-linux-gnu.so
10879 opensnoop -1 2 /usr/lib/python2.7/encodings/ascii.so
10879 opensnoop -1 2 /usr/lib/python2.7/encodings/asciimodule.so
10879 opensnoop 11 0 /usr/lib/python2.7/encodings/ascii.py
10879 opensnoop 12 0 /usr/lib/python2.7/encodings/ascii.pyc
10880 touch 3 0 /lib/x86_64-linux-gnu/libc.so.6
10880 touch 3 0 /usr/lib/locale/locale-archive
10880 touch 3 0 1.txt
是不是觉得很神奇,其他的命令可以参考其文档。
BCC下的python开发
如果觉得工具用起来比较死板,当然也是可以通过编程进行定制的,BCC
中python
的demo在这个路径下/usr/share/bcc/examples
,我们先看下helloworld
的demo
写的是什么。
from bcc import BPF
# This may not work for 4.17 on x64, you need replace kprobe__sys_clone with kprobe____x64_sys_clone
BPF(text='int kprobe__sys_clone(void *ctx) { bpf_trace_printk("Hello, World!\\n"); return 0; }').trace_print()
代码很少 kprobe__sys_clone
关键是这句话,他说如果调用到系统的clone
的话,那么就打印一次Hello, World
,聪明的你当然会知道如果要监控其他函数,那应该怎么改了。
我们运行程序,先转到 /usr/share/bcc/examples
目录下:
python hello_world.py
在另外一个命令窗口输入:
ps
就会输出如下的监控信息:
bash-10846 [000] .... 77868.616684: 0x00000001: Hello, World!
这是为什么呢?很简单 ps
命令在实现的时候,用到了clone
这个函数,他被捕捉到了。
其他的可以看相应的文档,继续了解了。