动态探针
当目标函数没有现成的内核追踪点时,可以在函数或代码行上临时插入动态探针,再用采集工具统计命中次数、读取参数或返回值。内核函数与用户态函数都支持,用户态探针直接指向应用的二进制与符号,不需要重启应用。探针属于临时插桩,用完应删除。
基本信息
| 适用平台 | 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 # 采集完立即删除探针类型对比
| 类型 | 观测点 | 注意点 |
|---|---|---|
| 内核函数探针 | 内核符号 | 名称需存在于符号表,注意内联 |
| 用户态函数探针 | 应用二进制符号 | 二进制更新后偏移变化 |
| 行级探针 | 源码行 | 需要调试信息,位置可能被优化走 |
添加前先核对符号表与内联情况:被内联或静态化后的函数可能找不到符号,也可能在多个位置展开,观测结果与代码直觉不一致。
探针会长期留在系统中影响所有经过该函数的调用,采集完成后务必删除;多人协作时应在变更记录里写明添加过哪些探针点。