perf probe 动态探针

在函数或代码行上动态添加 kprobe/uprobe, 用 perf record 采集命中次数或参数。

动态探针

当目标函数没有现成的内核追踪点时,可以在函数或代码行上临时插入动态探针,再用采集工具统计命中次数、读取参数或返回值。内核函数与用户态函数都支持,用户态探针直接指向应用的二进制与符号,不需要重启应用。探针属于临时插桩,用完应删除。

基本信息

适用平台Linux(内核自带性能工具)
探针类型内核函数探针与用户态函数探针
前提条件目标函数需存在于符号表,行级探针需要调试信息
权限要求添加探针通常需要较高权限
使用约定采集结束即删除,并记录添加过的探针点

典型使用场景

  • 观测没有追踪点覆盖的内核函数被调用的频率。
  • 统计某个用户态函数被调用次数,确认代码路径是否被走到。
  • 读取函数参数或返回值,了解实际取值分布。
  • 临时验证补丁或配置改动是否改变了执行路径。
  • 在没有埋点的第三方组件上做只读观测。

添加与采集

添加与采集
perf probe --add vfs_read                     # 在内核函数入口添加探针
perf probe --add 'vfs_read%return'            # 函数返回处探针,可读取返回值
perf probe --add 'tcp_rcv_established:5'      # 行级探针,需要内核调试信息
perf record -e probe:vfs_read -a -- sleep 5   # 采集探针命中
perf probe -x /opt/app/bin/server --add handle_request   # 用户态探针
perf probe --list                             # 查看当前已添加的探针
perf probe --del vfs_read                     # 采集完立即删除

探针类型对比

类型观测点注意点
内核函数探针内核符号名称需存在于符号表,注意内联
用户态函数探针应用二进制符号二进制更新后偏移变化
行级探针源码行需要调试信息,位置可能被优化走
添加前先核对符号表与内联情况:被内联或静态化后的函数可能找不到符号,也可能在多个位置展开,观测结果与代码直觉不一致。
探针会长期留在系统中影响所有经过该函数的调用,采集完成后务必删除;多人协作时应在变更记录里写明添加过哪些探针点。

易错点

  • 采集后未删除探针,长期残留在生产系统上,影响面被遗忘。
  • 对不存在或已被内联的符号添加失败,未先核对符号表浪费时间。
  • 二进制升级后旧的用户态探针失效或指向错误位置,观测数据不可信。
  • 一次添加过多探针,开销叠加后扰动了被测业务。
  • 把探针观测到的调用次数当成精确业务量,忽略采样与过滤条件的影响。

数据来源与参考

  • man perf-probe
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌