1、eBPF介绍
eBPF(extended Berkeley Packet Filter) 是一种可以在 Linux 内核中运行用户编写的程序,而不需要修改内核代码或加载内核模块的技术。
eBPF 程序是一个事件驱动模型。Linux 内核提供了各种 hook point,比如 system calls, function entry/exit, kernel tracepoints, network events 等。
eBPF 程序通过实现想要关注的 hook point 的 callback,并把这些 callback 注册到相应的 hook point 来完成“内核编程”。
使用原始的eBPF都是C语言开发代码,流程略微复杂一些,编写代码也较慢。所以此处我们不使用eBPF直接编写监控代码。
eBPF的本质是一个运行在内核的虚拟机,这个虚拟机可以运行用户在用户态实现的BPF代码,并且执行效率跟内核代码效率一样。用户态的BPF代码描述了用户想要跟踪内核函数,以及提取相关信息的方法。这些方最终通过eBPF虚拟机注册到内核,并使用内核的kprobes机制产生断点,进行触发调用。
eBPF的架构图如下:
2、BCC介绍
BCC工具全称eBPF Compiler Collection (BCC),是基于eBPF的Linux内核分析、跟踪、监控的工具包。eBPF基于kprobe机制,相较于systemtap等,eBPF以及BCC需要内核版本在4.1及以上。
BCC使用python语言编写,使用python方便开发人员快速有效的开发性能监控工具,不必使用原始的eBPF,但是性能上有一些损失。eBPF编写核心的probe的代码,外部的统计等使用python。
3、安装方法
yum install bcc-tools -y
4、使用方法
使用内置脚本
4.1.1观察vfsstat统计
执行vfsstat-bpfcc 3就可以每3秒观察一次vfs的统计情况。
4.1.2观察cache命中率
使用指令cachetop-bpfcc 3就可以每3秒观察一次cache的统计情况。
4.1.3更多观察指令
ll /usr/sbin|grep bpfcc
可以查看到更多的观察指令,按照需要来自己使用。
4.2自定义观察函数
内置的脚本用起来比较简单,但是观测的内容相对较少且固定。因此,BCC还内置很多函数级的观察点供用户灵活使用。
bcc支持的监控点从:/sys/kernel/debug/tracing 获取。如查询ceph相关点,用命令:
cat available_filter_functions | grep ceph
使用内置脚本funccount-bpfcc可以观测指定函数的时延信息。funccount-bpfcc有多个可选参数,对应实现不同的功能,可使用funccount-bpfcc --help查看。
如,使用funccount-bpfcc +模糊查找条件,查找支持的统计点:
由于funclatency-bpfcc脚本统计的是时延分布信息,因此无法较准确的得到该函数的平均时延。如下:
4.3扩展功能
基于eBPF和bcc,可以很方便的扩展功能。bcc目前支持以下事件:
- kprobe__kernel_function_name(attach_kprobe())
- kretprobe__kernel_function_name(attach_kretprobe())
- TRACEPOINT_PROBE(category, event),支持的event列表参见/sys/kernel/debug/tracing/events/category/event/format
- attach_uprobe()和BPF.attach_uretprobe()
- 用户自定义探针(USDT) enable_probe()
4.4自定义统计开发
由于bcc内置脚本提供的统计基本都是以火焰图的形式来呈现结果,只能展现某几个时延区间的IO分布情况,无法准确的展示IO的平均时延,这对于性能分析是不够的。我们需要分析感兴趣的函数的准确时延信息,这就需要实现自己的统计工具。具体可以参考BCC的帮主文档。