首页/系统/Linux 运维命令速查/bpftrace 快速上手
性能与监控48 条

bpftrace 快速上手

eBPF 动态追踪的单行工具:oneliners 查谁在调用某个系统调用、哪个进程读写最多、延迟分布;比 strace 更少侵入。

Linux 运维命令速查系统更新于 2026-10-13

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定时结束保证观测自动停止
可用探针依赖内核版本与符号,函数名跨版本会变化;生产使用遵循短时、限量原则,先在测试环境验证脚本再上生产。

使用纪律

  • 用列出探针的方式先确认函数名在当前内核存在
  • 优先用聚合统计,避免逐条打印拖慢目标
  • 始终设置自动退出时间,避免忘记停止
  • 先在测试环境跑通再用于生产,并记录使用过的脚本
  • 结论中说明探测开销可能带来的偏差
不同内核版本里同名功能的实现函数可能改名或被替换,脚本移植到别的机器前要重新核对探针名称。

易错点

  • 内核函数名随版本变化,跨版本直接复用脚本会报探针不存在
  • 忘记限制输出或时长,脚本自身成为负载来源,甚至拖慢目标进程
  • 在受限权限或容器环境中执行会因权限与命名空间差异看不到目标事件
  • 把单次观测结果当长期结论,采样窗口过短容易得出片面判断

数据来源与参考

  • bpftrace 官方文档(one-liners)
  • eBPF 内核文档

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌