Bpftrace介绍
bpftrace 是一种基于 eBPF 的高层次追踪工具,支持用类似 DTrace 的脚本语言编写内核和用户空间的追踪逻辑。bpftrace 适用于 Linux 性能分析、故障排查、安全监控等多种场景。本文将简要介绍 bpftrace 的安装、基本用法及常见示例。
1. bpftrace 简介
bpftrace 允许开发者用简单脚本描述内核或用户态的观测点(probe),并直接在命令行运行,实时获取数据。其语法简洁,适合日常运维和开发快速定位问题。
2. 安装 bpftrace
以 Ubuntu 为例:
sudo apt update
sudo apt install bpftrace linux-headers-$(uname -r)
或在其他发行版使用包管理器安装,或参考 官方编译指南。
3. bpftrace 基本语法
bpftrace 的脚本结构为:
probe_type:probe_name
/过滤条件/
{
动作
}
probe_type
如 kprobe、uprobe、tracepoint 等probe_name
为函数名或事件名/过滤条件/
可选,为布尔表达式{动作}
为 BPF 动作代码块
4. 常用示例
4.1 统计 sys_execve 系统调用频率
sudo bpftrace -e 'kprobe:sys_execve { @[comm] = count(); }'
打印每个进程调用 execve
的次数。
4.2 跟踪 open 系统调用参数
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s: %s\n", comm, str(args->filename)); }'
输出每个进程打开的文件名。
4.3 跟踪特定进程的网络发送
sudo bpftrace -e 'kprobe:tcp_sendmsg /comm == "nginx"/ { @[comm] = count(); }'
统计 nginx 进程的 tcp_sendmsg 调用次数。
4.4 统计函数延迟
sudo bpftrace -e '
kprobe:vfs_read { @start[tid] = nsecs; }
kretprobe:vfs_read /@start[tid]/ {
@latency = hist(nsecs - @start[tid]);
delete(@start[tid]);
}
'
查看 vfs_read 的延迟直方图。
5. 编写和运行 bpftrace 脚本文件
编写脚本 example.bt
:
#!/usr/bin/env bpftrace
BEGIN { printf("Tracing execve syscalls... Hit Ctrl-C to end.\n"); }
kprobe:sys_execve { @[comm] = count(); }
运行:
sudo bpftrace example.bt
6. 注意事项
- bpftrace 需要 root 权限运行
- 内核需支持 eBPF(推荐 4.9+)
- 某些 probe 依赖内核调试符号(如 kprobe)
- 生产环境使用需注意对性能的影响