首页/系统/Linux 内核与性能调优速查/bpftrace 常用一行速查

bpftrace 常用一行速查

汇总高频单行: 按进程计数、按参数聚合与错误过滤, 覆盖日常快速观测。

常用一行速查

把日常单行表达式归纳起来只有三种动作:按某个维度计数、按参数取值聚合、在条件成立时再统计。掌握这三种模式后,绝大多数临时观测都能一行写完。写之前先用字段列举功能核对追踪点的字段名,能省掉大量「表达式报错但不知道错在哪」的时间。

基本信息

适用平台Linux,需要内核 eBPF 支持与相应权限
常用聚合函数计数、求和、直方图
聚合键进程名、线程号、参数值或返回码
条件过滤用斜杠包裹条件,写在动作之前
字段核对先用字段列举功能确认名称与类型

典型使用场景

  • 找出是谁在频繁启动子进程,排查脚本与定时任务。
  • 统计被打开最多的文件路径,定位配置或缓存读取热点。
  • 过滤失败返回值,只关注出错的那部分调用。
  • 按进程统计系统调用次数,确认调用模式是否符合预期。
  • 结合定时输出,按固定间隔观察变化趋势。

示例集

示例集
bpftrace -e 'tracepoint:syscalls:sys_enter_execve { @[comm] = count(); }'              # 谁在启动进程
bpftrace -e 'tracepoint:syscalls:sys_enter_openat { @[str(args->filename)] = count(); }'  # 打开最多的文件
bpftrace -e 'tracepoint:syscalls:sys_exit_read /args->ret < 0/ { @[comm] = count(); }'    # 只统计读取失败
bpftrace -e 'tracepoint:sched:sched_switch { @[comm] = count(); }'                        # 进程切换次数
bpftrace -e 'kretprobe:vfs_read { @[comm] = hist(retval); }'                              # 返回值分布
bpftrace -e 'tracepoint:syscalls:sys_enter_connect { @[comm, args->fd] = count(); }'      # 按进程与描述符聚合

三种模式

模式写法要点输出形态
按维度计数键取进程名或线程号每个键一行,附带次数
按参数聚合键取参数值并用字符串转换可直接看出取值分布
条件过滤条件写在动作之前只统计满足条件的调用
过滤条件的位置影响语义:写在探针后面、动作之前才是「不满足就不执行」,写进动作内部则是先执行再判断,输出内容会有差别。
直接照搬他人的表达式容易踩坑:不同内核版本的追踪点字段可能不同,运行前先用字段列举核对,避免在生产环境反复试错。

易错点

  • 字段名凭记忆乱写,启动报错或结果为空,浪费排查时间。
  • 忽略过滤条件的位置,语义与预期不符,统计出错误口径的数字。
  • 在高频调用点上不加限制地统计,输出量极大且影响系统。
  • 字符串参数不做转换直接聚合,输出不可读。
  • 跨内核版本复用他人脚本,字段不兼容导致采集静默失效。

数据来源与参考

  • bpftrace 官方文档
  • bpftrace 手册
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌