第15章 BPF:问题已经压清楚时,它才会特别好用

BPF 只有在观测问句已经足够清楚时才值得进入,否则复杂度会先于答案增长。

本页目录

先把问题压成可观测问句

第 15 章先把 BPF 的门槛说清。BPF 最值钱的时候,不是“什么都能看”,而是你已经知道自己缺的是哪段证据。

在这之前,BPF 往往只会把复杂度抬高。

别把 BPF 当成高级 printf。面对 malloc、网络收发这类每秒百万次的高频事件,逐条打印明细只会把系统和自己一起拖垮;BPF 真正值钱的地方,是在内核里先就地聚合成 map、直方图或计数,再把结果带回用户态。

BPF 最适合补哪类证据

下面这些情况,更适合考虑 BPF:

  • 标准指标和采样已经不够
  • 你需要更贴问题本身的事件、分布或关联关系
  • 你知道应该挂在哪一层、看什么事件
  • 你要的是低开销、定制化观测

这时候 BPF 才会真正发力。

别先写脚本,再回头想自己要验证什么

最常见的错法有四种:

  • 因为 BPF 很强,就把它当前置默认工具
  • 问题还没定义清楚,就先写脚本抓事件
  • 一次性验证问题,结果做成了长期工具工程
  • 数据抓了很多,但问句本身还是模糊的

这些错法都不是工具问题,是问题设计没先站住。

什么时候 BPF 值得投入

一般要同时满足这几件事:

  • 你已经知道普通指标和标准工具不够了
  • 你能写出明确的可观测问句
  • 你知道挂点大概在哪
  • 你知道自己想要的,是频率、分布、延迟还是关联关系

这几件事站住了,BPF 的投入才划算。

一个最典型的错法:先写脚本,后想问题

现场里一碰到复杂问题,很多人会觉得“这次得上 BPF 了”。

但如果顺序反了,最后很容易变成这样:

  • 脚本越来越多
  • 事件越抓越细
  • 但最核心的问题还是没被问清

更稳的做法是先把问题写成一句可观测问句,再决定事件、挂点和输出形式。

先把问句、挂点和字段写清

先写一句可观测问句

以后上 BPF 前,先写成一句话:

我想知道在什么条件下,哪类事件,以什么频率或延迟分布发生。

这句话写不出来,就先别上。

一次性验证和长期工具分开做

先分清这次是:

  • 快速验证
  • 一次性分析
  • 长期沉淀

这三种目标不同,投入也不同。别一上来就做重型工具化。

还要再防一个很像“写得快”的陷阱:通配符探针。像 kprobe:vfs_* 这种写法表面省事,实际可能瞬间匹配出几百个挂点,既把开销打爆,也会直接撞上 bpftrace 的最大探针数上限。真正落命令前,先用 bpftrace -l 摸底会展开成多少个探针。

BPF 结果默认先服务当前假设

BPF 不是为了收更多数据,而是为了验证当前假设。假设一旦改了,脚本也该跟着改。

定制观测站住以后,再回到完整案例

第 15 章解决的是“定制观测什么时候值得上”。第 16 章接着把前面的方法、层次和工具收回一个完整案例里。