BPF Compiler Collection
BPF Compiler Collection (BCC) 是基于 eBPF 的 Linux 内核分析、跟踪、网络监控工具。其源码存放于https://github.com/iovisor/bcc。
安装部署
直接部署
可以参考 BCC 提供的安装方式 在节点上部署 BCC,以 centos 为例:
|
|
安装完成后,bcc 工具会放到/usr/share/bcc/tools目录中
|
|
容器部署
|
|
这里的 entrypoint 加载了 debugfs:
|
|
Docker 启动:
|
|
常用工具
tcpconnect
tcpconnect 检查活跃的 TCP 连接,并输出源和目的地址:
|
|
tcptop
tcptop 统计 TCP 发送和接受流量:
|
|
BCC 编程
接下来我们通过编写一个简单的 eBPF 程序 simple-biolatency 来展示 bcc/eBPF 程序是如 何构成及如何工作的。
我们的程序会监听块设备 IO 相关的系统调用,统计 IO 操作的耗时(I/O latency), 并打印出统计直方图。程序大致分为三个部分:
- 核心 eBPF 代码 (hook),C 编写,会被编译成字节码注入到内核,完成事件的采集和计时
- 外围 Python 代码,完成 eBPF 代码的编译和注入
- 命令行 Python 代码,完成命令行参数解析、运行程序、打印最终结果等工作
为方便起见,以上全部代码都放到同一个文件 simple-biolatency.py。
整个程序需要如下几个依赖库:
|
|
BPF 程序
首先看 BPF 程序。这里主要做三件事情:
- 初始化一个 BPF hash 变量
start和直方图变量dist,用于计算和保存统计信息 - 定义
trace_req_start()函数:在每个 I/O 请求开始之前会调用这个函数,记录一个时间戳 - 定义
trace_req_done()函数:在每个 I/O 请求完成之后会调用这个函数,再根据上一步记录的开始时间戳,计算出耗时
|
|
加载 BPF 程序
加载 BPF 程序,然后将 hook 函数分别插入到如下几个系统调用前后:
blk_start_requestblk_mq_start_requestblk_account_io_done
|
|
命令行解析
最后是命令行参数解析等工作。根据指定的采集间隔(秒)和采集次数运行。程序结束的时 候,打印耗时直方图:
|
|
运行
实际运行效果:
|
|
可以看到,第二秒采集到了 12 次请求,并且耗时都落在 8192us ~ 16383us 这个区间。
小结
以上就是使用 bcc 编写一个 BPF 程序的大致过程,步骤还是很简单的,难点主要在于 hook 点的选取,这需要对探测对象(内核或应用)有较深的理解。实际上,以上代码是 bcc 自带的 tools/biolatency.py 的一个简化版,大家可以执行 biolatency.py -h 查看完整版的功能。
参考资料
-
No backlinks found.