Fork me on GitHub
侧边栏

使用BPF之前和之后生成直方图过程的对比

image

以bitehist为例:
使用BPF之前:

1、在内核中:开启磁盘IO事件的插桩观测。
2、在内核中,针对每个事件:向perf缓冲区写入一条记录。如果使用了跟踪点技术(推荐方式),记录中会包含关于磁盘IO的几个元数据字段。
3、在用户空间:周期性地将所有事件的缓冲区内容复制到用户空间4。在用户空间:遍历每个事件,解析字节字段的事件元数据字段。其他字段会被忽略。
5。在用户空间:生成字节字段的直方图摘要。

其中步骤2到步骤4对于高I/O的系统来说性能开销非常大。可以想象一下,将10 000个磁盘I/O跟踪记录复制到用户空间程序中,然后解析以生成摘要信息--每秒执行一次;

使用BPF后,bitesize程序执行的步骤如下。
1、在内核中:启用磁盘IO事件的插桩观测,并挂载一个由bitesize工具定义的BPF程序。
2、在内核中,对每次事件:运行 BPF 程序。它只获取字节字段,并将其保存到自定义的 BPF直方图映射数据结构中。
3、在用户空间:一次性读取BPF直方图映射表并输出结果。

这个过程避免了将事件复制到用户空间并再次对其处理的成本,也避免了对未使用的元数据字段的复制。如前面的程序输出截图所示,唯一需要复制到用户空间的数据是“count”列,其是一个数字数组。

posted @ 2024-03-07 15:34  yooooooo  阅读(44)  评论(0)    收藏  举报