bpftrace 快速上手
bpftrace 是基于内核动态追踪技术的单行命令工具:用近似脚本的写法描述「在哪个探针上、满足什么条件、做什么统计」,就能回答「谁在调用这个系统调用」「哪个进程读写最多」「某段代码的延迟分布如何」这类问题。相比逐个附加调试器,它的写法紧凑、开销可控,适合在生产上做短时观测。
基本信息
| 适用平台 | Linux,需要内核支持动态追踪且相关权限可用 |
|---|---|
| 语法 | bpftrace -e '探针 /过滤条件/ { 动作 }' |
| 常见探针 | 内核函数探针、跟踪点、定时器 |
| 典型输出 | 按进程聚合计数、延迟直方图、调用参数打印 |
典型使用场景
- 确认某个系统调用是被哪些进程频繁触发的
- 统计各进程的文件打开次数,定位异常扫描行为
- 观察某段内核路径的耗时分布,判断是否成为瓶颈
- 排查短命进程:常规采样工具抓不到,它可以按事件记录
- 验证性能优化前后的调用次数变化
常用一行流
常用一行流
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_execve { printf("%s %s\n", comm, str(args->filename)); }' # 谁在执行程序
sudo bpftrace -e 'kprobe:vfs_read { @[comm] = count(); }' # 各进程读调用次数
sudo bpftrace -e 'kprobe:do_sys_openat2 { @[comm] = count(); }' # 谁在打开文件
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { @[comm] = count(); } interval:s:10 { exit(); }' # 十秒后自动退出
sudo bpftrace -e 'kprobe:vfs_open { @[comm] = count(); }' # 观察文件打开热点
sudo bpftrace -l 'kprobe:vfs_*' | head # 列出可用探针,确认函数名常见统计写法
| 写法 | 含义 | 用途 |
|---|---|---|
| count() | 统计事件次数 | 按进程聚合看谁调用最多 |
| hist() | 按数量级分桶直方图 | 观察延迟或大小的分布形态 |
| sum() | 求和 | 累计字节数、耗时总量 |
| printf() | 打印明细 | 输出量大的场景慎用 |
| interval 与 exit | 定时结束 | 保证观测自动停止 |
可用探针依赖内核版本与符号,函数名跨版本会变化;生产使用遵循短时、限量原则,先在测试环境验证脚本再上生产。
使用纪律
- 用列出探针的方式先确认函数名在当前内核存在
- 优先用聚合统计,避免逐条打印拖慢目标
- 始终设置自动退出时间,避免忘记停止
- 先在测试环境跑通再用于生产,并记录使用过的脚本
- 结论中说明探测开销可能带来的偏差
不同内核版本里同名功能的实现函数可能改名或被替换,脚本移植到别的机器前要重新核对探针名称。