searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

基于eBPF的linux内核追踪工具BCC介绍

2023-05-30 02:54:49
45
0

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的帮主文档。

 

0条评论
0 / 1000
l****n
3文章数
2粉丝数
l****n
3 文章 | 2 粉丝
l****n
3文章数
2粉丝数
l****n
3 文章 | 2 粉丝
原创

基于eBPF的linux内核追踪工具BCC介绍

2023-05-30 02:54:49
45
0

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的帮主文档。

 

文章来自个人专栏
技术分享
3 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0