bcc全称为(BPF Compiler Collection),它是模仿gcc(GNU Compiler Collection)的命名风格。
BPF是运行在内核态的一种虚拟机语言,我们在用户态可以通过Clang+LLVM把c语言编译成BPF目标码,然后通过加载器loader(bcc/perf/iproute2)将BPF目标码通过bpf()系统调用加载到内核当中,最后通过perf的ioctl命令PERF_EVENT_IOC_SET_BPF将加载到内核中的BPF程序和对应子模块(tracing/networking)的钩子绑定起来。(具体参考3.2、BPF and XDP Reference Guide)
bcc把上述用户态编译、加载、绑定的功能都集成了起来,方便用户使用,对用户的接口更友好。它使用了(python + lua + c++)的混合架构,底层操作封装到c++ 库中,lua提供一些辅助功能,对用户的接口使用python提供,python和c++之间的调用使用ctypes连接。因为使用了python,所有抓回来的数据分析和数据呈现也都非常方便。
有了bcc以后用户就不需要一步步手工的写c代码、编译、加载、绑定、数据分析、数据呈现,只要按照bcc的规则编写一个python文件,bcc帮你一键搞定。
1、背景介绍
说到bcc,就不得不提到Brendan Gregg,他是perfermance届的大神。他开发了很多perf相关的工具和脚本:perf_events、perf-tools、bcc、Flame Graphs。相关的文档都可以在他的博客上找到,本文bcc的文档也引用自它的博客。
2、bcc安装
首先确保你的内核版本是4.1或者以上的版本(推荐4.9以上),并且打开了以下配置:(查看/proc/config.gz or /boot/config-
1 | CONFIG_BPF=y |
如果运行bcc网络示例需要打开一些可选的内核选项:
1 | CONFIG_NET_SCH_SFQ=m |
在ubuntu环境下,我们可以使用以下简单的命令来安装bcc工具:
1 | sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4052245BD4284CDD |
3、bcc的使用入门
原文:bcc Tutorial (中文翻译)。
安装完bcc以后,我们可以进入”/usr/share/bcc/tools”和”/usr/share/bcc/examples/tracing”路径下执行bcc已经提供的性能分析命令,关于命令的基本使用可以参考上面的入门指导。
1 | /usr/share/bcc/tools$ ls |
如果bcc提供的专用命令不能满足你,bcc还提供了几个通用自定义命令:trace、argdist、funccount。可以详细看一下这几个命令的用法。
4、bcc python脚本的编写
原文:bcc Python Developer Tutorial (中文翻译)、bcc Reference Guide。
如果bcc自带脚本不能满足你,你可以仿照bcc的语法规则自己开发python脚本,自定义自己要采集的数据,自定义自己的数据处理和呈现规则。因为是python接口,我们可以进行二次开发把数据进行更详尽的分析、用图形呈现等等。
5、bcc源码结构
我们也可以从github上下载bcc的源代码进行分析和调试。
我们在配置pycharm工程的时候需要注意:
我们查看cc的python脚本,核心部分是BPF python库:
1 | bcc/examples$ cat hello_world.py |
BPF python库是在路径bcc/src/python/bcc/中实现的,在libbcc.py中通过ctypes导入了libbcc.so.0:
1 | bcc/src/python/bcc$ cat libbcc.py |
libbcc.so.0是c++的底层实现,源码在bcc/src/cc路径下。
本来是想写一篇bcc内核代码分析的文章,后来发现整个代码规模太大,还是分析个大致框架有问题再追踪修改吧。