
在了解完BPF_PERF_OUTPUT作为输出以后,我们会看到一系列的数据,这些数据是基于时间序列的,那么是否有别的数据展示形式能够帮助我们更好的发现问题呢?
通过这个例子,我们可以学习到如何将数据通过直方图的方式输出:

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

bitehist result
我们尝试在基于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_hist和print_linear_hist:可以分别输出两种模式的直方图;