常用一行速查
把日常单行表达式归纳起来只有三种动作:按某个维度计数、按参数取值聚合、在条件成立时再统计。掌握这三种模式后,绝大多数临时观测都能一行写完。写之前先用字段列举功能核对追踪点的字段名,能省掉大量「表达式报错但不知道错在哪」的时间。
基本信息
| 适用平台 | 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(); }' # 按进程与描述符聚合三种模式
| 模式 | 写法要点 | 输出形态 |
|---|---|---|
| 按维度计数 | 键取进程名或线程号 | 每个键一行,附带次数 |
| 按参数聚合 | 键取参数值并用字符串转换 | 可直接看出取值分布 |
| 条件过滤 | 条件写在动作之前 | 只统计满足条件的调用 |
过滤条件的位置影响语义:写在探针后面、动作之前才是「不满足就不执行」,写进动作内部则是先执行再判断,输出内容会有差别。
直接照搬他人的表达式容易踩坑:不同内核版本的追踪点字段可能不同,运行前先用字段列举核对,避免在生产环境反复试错。