结合例子学习eBPF与bcc:直方图

2023-11-01 17:11:26 浏览数 (1)

在了解完BPF_PERF_OUTPUT作为输出以后,我们会看到一系列的数据,这些数据是基于时间序列的,那么是否有别的数据展示形式能够帮助我们更好的发现问题呢?

bitehist

通过这个例子,我们可以学习到如何将数据通过直方图的方式输出:

bitehist

可以看到,我们这里定义个类别为HISTOGRAMBPF map分别是distdist_linear,其本质上是BPF_TABLE的一个封装。接着我们在进行追踪的时候将结果数据通过increment将输出传出来。increment会将第一个参数的运算结果作为直方图索引,递增量默认是1,我们可以通过添加第二个参数来调整递增量。例如a.increment(2,5)表示对直方图中2这个索引添加5。在这里我们用到了一个bpf_log2l的函数,这个函数可以返回以2为底的直方图索引。最后,我们通过print_log2_histprint_linear_hist分别通过两种方式输出了获取到的直方图数据。如下图所示:

bitehist result

disklatency

我们尝试在基于disksnoop来实现直方图输出。首先我们定义两个通道:

定义BPF_HISTOGRAM

接着我们改写disksnoop中的输出语句,将delta时间单位转换成ms

increment

最后我们调整输出即可:

上传文件

运行看看:

disklatency

小结

今天我们学习了如下内容:

  • BPF_HISTOGRAM:声明一个直方图类别的数据通道;
  • increment(key, value):往直方图通道中添加一个键值对,直方图通道会对此进行累加,例如原数据是3:5,表示3这个值出现了5次,调用increment(3,2)这个数据就会变成3:7;如果第二个参数为空,则默认为1;
  • bpf_log2f:可以将数据转换成2的对数;
  • print_log2_histprint_linear_hist:可以分别输出两种模式的直方图;

0 人点赞