引
在了解完BPF_PERF_OUTPUT
作为输出以后,我们会看到一系列的数据,这些数据是基于时间序列的,那么是否有别的数据展示形式能够帮助我们更好的发现问题呢?
bitehist
通过这个例子,我们可以学习到如何将数据通过直方图的方式输出:
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
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_hist
和print_linear_hist
:可以分别输出两种模式的直方图;