bpftrace
约 852 字大约 3 分钟
2025-09-24
什么是 bpftrace
bpftrace 是一个基于 eBPF 的高级跟踪工具,它提供了一个简洁的 DSL(领域特定语言)来编写 eBPF 程序,用于 Linux 系统的动态跟踪和性能分析。
主要特性
- 简单易用:提供类似 awk 的语法,易于学习和使用
- 高性能:基于 eBPF 技术,对系统性能影响极小
- 功能强大:可以跟踪内核和用户空间程序
- 实时性:支持实时数据收集和分析
安装方法
Ubuntu/Debian
sudo apt install bpftraceCentOS/RHEL
sudo yum install bpftrace
# 或者
sudo dnf install bpftrace从源码编译
git clone https://github.com/iovisor/bpftrace.git
cd bpftrace
mkdir build && cd build
cmake ..
make -j8
sudo make install基本语法
bpftrace 程序的基本结构:
probe /filter/ { action }- probe:探针,指定要跟踪的事件
- filter:过滤器,可选的条件
- action:动作,当事件触发时执行的操作
常用探针类型
1. 系统调用跟踪
# 跟踪所有系统调用
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_* { @[probe] = count(); }'
# 跟踪特定系统调用
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("openat: %s\n", str(args->filename)); }'2. 函数跟踪
# 跟踪内核函数
sudo bpftrace -e 'kprobe:vfs_read { @[comm] = count(); }'
# 跟踪用户空间函数
sudo bpftrace -e 'uprobe:/bin/bash:readline { printf("bash readline: %s\n", str(arg0)); }'3. 定时器
# 每秒打印一次
sudo bpftrace -e 'interval:s:1 { printf("Hello from bpftrace!\n"); }'实用示例
1. 系统调用统计
sudo bpftrace -e '
tracepoint:syscalls:sys_enter_* {
@[probe] = count();
}
END {
print(@);
}'2. 文件访问监控
sudo bpftrace -e '
tracepoint:syscalls:sys_enter_openat {
@[comm, str(args->filename)] = count();
}
END {
print(@);
}'3. 网络连接监控
sudo bpftrace -e '
tracepoint:syscalls:sys_enter_connect {
@[comm, args->uservaddr] = count();
}
END {
print(@);
}'4. 进程创建监控
sudo bpftrace -e '
tracepoint:syscalls:sys_enter_execve {
printf("execve: %s\n", str(args->filename));
}'5. 内存分配监控
sudo bpftrace -e '
kprobe:kmalloc {
@[comm] = count();
}
END {
print(@);
}'高级功能
1. 条件过滤
sudo bpftrace -e '
tracepoint:syscalls:sys_enter_openat /str(args->filename) == "/etc/passwd"/ {
printf("Access to /etc/passwd by %s\n", comm);
}'2. 聚合统计
sudo bpftrace -e '
tracepoint:syscalls:sys_enter_read {
@bytes[comm] = sum(args->count);
}
END {
print(@bytes);
}'3. 直方图
sudo bpftrace -e '
tracepoint:syscalls:sys_enter_read {
@bytes = hist(args->count);
}
END {
print(@bytes);
}'常用内置变量
comm:进程名pid:进程IDtid:线程IDcpu:CPU核心号args:函数参数retval:返回值
常用内置函数
printf():格式化输出str():将指针转换为字符串count():计数sum():求和avg():平均值min():最小值max():最大值hist():直方图lhist():线性直方图
性能分析示例
CPU 使用率分析
sudo bpftrace -e '
profile:hz:99 {
@[comm] = count();
}
END {
print(@);
}'系统调用延迟分析
sudo bpftrace -e '
tracepoint:syscalls:sys_enter_read {
@start[pid] = nsecs;
}
tracepoint:syscalls:sys_exit_read /@start[pid]/ {
@latency = hist(nsecs - @start[pid]);
delete(@start[pid]);
}
END {
print(@latency);
}'注意事项
- 权限要求:大多数 bpftrace 程序需要 root 权限
- 内核版本:需要 Linux 4.9+ 内核,推荐 4.18+
- 性能影响:虽然 eBPF 性能开销很小,但复杂程序仍可能影响系统性能
- 调试信息:某些功能需要内核调试符号
学习资源
总结
bpftrace 是一个功能强大的系统跟踪工具,它简化了 eBPF 程序开发,使得系统性能分析和调试变得更加容易。通过其简洁的语法和丰富的功能,可以帮助开发者快速定位系统性能瓶颈和安全问题。
更新日志
2025/9/24 15:35
查看所有更新日志
515ef-add bpf trace于
