BCC(BPF编译器集合)是一组功能强大的适当工具和示例文件,用于创建资源丰富的内核跟踪和操作程序。该工具利用扩展的BPF(伯克利数据包过滤器),最初称为eBPF ,是Linux 3.15中的新功能之一。
实际上, BCC工具使用的大多数组件都需要Linux 4.1或更高版本,其值得注意的功能包括:
- 不需要第3方内核模块,因为所有工具都基于内置于内核中的BPF工作,并且BCC使用Linux 4.x系列中添加的功能。
- 能够观察软件执行情况。
- 包含多个性能分析工具以及示例文件和手册页。
BCC工具比较适合高级Linux用户,可以使用C语言的内核检测以及Python和lua的前端轻松编写BPF程序。此外,它还支持多种任务,例如性能分析、系统监控、网络流量控制等。
在Linux系统中安装BCC工具
BCC工具使用了Linux内核4.1版本或更高版本添加的功能,并且要求内核在编译时使用以下设置的标志:
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 # [for Linux kernel versions 4.1 through 4.6] CONFIG_HAVE_BPF_JIT=y # [for Linux kernel versions 4.7 and later] CONFIG_HAVE_EBPF_JIT=y # [optional, for kprobes] CONFIG_BPF_EVENTS=y # Need kernel headers through /sys/kernel/kheaders.tar.xz CONFIG_IKHEADERS=y
一般可以使用单个grep命令检查所有指定的内核配置标志,并提供所有标志名称作为模式。
grep -E 'CONFIG_BPF=y|CONFIG_BPF_SYSCALL=y|CONFIG_NET_CLS_BPF=m|CONFIG_NET_ACT_BPF=m|CONFIG_BPF_JIT=y|CONFIG_HAVE_BPF_JIT=y|CONFIG_HAVE_EBPF_JIT=y|CONFIG_BPF_EVENTS=y|CONFIG_IKHEADERS=y' /boot/config-$(uname -r)
验证内核标志后,就可以在Linux系统中安装BCC工具了。
在Debian上安装BCC工具
可以在常规Debian主存储库中找到BCC及其工具,它们来自源包bpfcc并命名为bpfcc-tools、python3-bpfcc、libbpfcc和libbpfcc-dev:
echo deb http://cloudfront.debian.net/debian sid main >> /etc/apt/sources.list sudo apt-get install -y bpfcc-tools libbpfcc libbpfcc-dev linux-headers-$(uname -r)
在Ubuntu上安装BCC工具
可以在常规Ubuntu Universe存储库中找到不同版本的BCC:
sudo apt-get install bpfcc-tools linux-headers-$(uname -r)
在Fedora上安装BCC工具
从Fedora 40开始,标准存储库中提供了BCC二进制文件:
sudo dnf install bcc
在RHEL上安装BCC工具
BCC已作为bcc-tools包含在官方yum存储库中:
sudo yum install bcc-tools
在Arch Linux上安装BCC工具
BCC在标准Arch存储库中可用,并且可以使用pacman命令进行安装。
pacman -S bcc bcc-tools python-bcc
在openSUSE上安装BCC工具
对于openSUSE Leap 42.2(及更高版本)和Tumbleweed,BCC已包含在官方存储库中:
sudo zypper ref sudo zypper in bcc-tools bcc-examples
在Linux系统中使用BCC工具
所有BCC工具都安装在/usr/share/bcc/tools
目录下。但是,你也可以选择从BCC Github仓库中的/tools目录下运行它们,这些工具以.py扩展名结尾。
ls /usr/share/bcc/tools
接下来将介绍几个示例,监控一般Linux系统性能和网络情况。
跟踪Linux中的open() 系统调用
首先使用opensnoop工具跟踪所有open()
系统调用,这使我们能够通过识别数据文件、配置文件等来了解各种应用程序的工作原理:
cd /usr/share/bcc/tools sudo ./opensnoop
分析Linux中的磁盘I/O延迟
此示例显示使用biolatency工具对磁盘I/O延迟进行了总结分布,执行命令后,请等待几分钟,然后按Ctrl-C结束并查看输出。
sudo ./biolatency
跟踪Linux中的新进程
这个实际上使用execsnoop工具来跟踪正在执行的新进程,每当一个进程通过fork()和exec()系统调用派生时,它都会显示在输出中。然而,并非所有进程都会被捕获。
sudo ./execsnoop
跟踪较慢的Ext4文件系统操作
使用ext4slower工具跟踪ext4文件系统中常见操作的延迟超过10毫秒的情况,以帮助我们独立识别通过文件系统导致的慢速磁盘I/O:
sudo ./ext4slower
使用biosnoop探索磁盘I/O活动
使用biosnoop工具每秒为每个磁盘I/O打印一行,其中包括进程ID、扇区、字节和延迟等详细信息:
sudo ./biosnoop
分析系统缓存性能
接下来继续使用cachestat工具每秒显示系统缓存中的一行汇总统计信息,这可以通过指出低缓存命中率和高丢失率来进行系统调整操作:
sudo ./cachestat
在Linux系统中监控TCP连接
使用tcpconnect工具每秒监控TCP连接,其输出包括源地址、目标地址以及端口号。该工具对于跟踪意外的TCP连接非常有用,从而帮助我们识别应用程序配置中的低效或攻击者:
sudo ./tcpconnect
此外,上述所有工具还可以与各种选项一起使用,要启用给定工具的帮助页面,请使用-h
选项,示例如下:
sudo ./tcpconnect -h
跟踪失败的exec()系统调用
要跟踪失败的exec()系统调用,请使用opensnoop的-x
选项,如下所示:
sudo ./opensnoop -x
跟踪特定过程函数
最后将演示如何执行自定义跟踪操作,这里正在使用其PID来跟踪特定进程。
首先,确定进程ID:
pidof firefox
稍后运行自定义跟踪命令。下面的命令中,-p
指定进程 ID,do_sys_open()
是一个动态跟踪的内核函数,包括其第二个参数作为字符串:
sudo ./trace -p 4095 'do_sys_open "%s", arg2'
总结
可以看出,BCC是一个功能强大且易于使用的工具包,适用于各种系统管理任务,例如跟踪系统性能监控、跟踪块设备 I/O、TCP函数、文件系统操作、系统调用、Node.js探针等等。重要的是,它附带了几个示例文件和手册页,用于帮助用户使用,使其用户友好且可靠。