目录
参考
介绍
简介
pftrace 是一款基于 eBPF 的高级动态追踪工具,它使用类似 awk 的脚本语言,可以观测和分析内核及用户空间程序的几乎所有行为。
版本要求
内核需求
- 内核版本 ≥ Linux 4.9(完整功能需 ≥ 5.x)
常用系统
- CentOS 8 (内核版本 4.18.0,支持不完全)及以上
- Ubuntu 18.04.3 LTS (内核版本5.0) 以及上
国产系统
- Kylin V10 SP1\2\3(内核版本 4.19.90,支持不完全)
- OpenEuler 22.03(内核版本 5.10.0,完全支持)以及上
基础操作
- 列出可用探针
bpftrace -l
01 系统调用监控
1.1 统计所有系统调用的次数
- 监控任意系统调用的参数、返回值、频率:
# 统计所有系统调用的次数
bpftrace -e 'tracepoint:syscalls:sys_enter_* { @[probe] = count(); }'
1.2 内核函数跟踪
- 动态挂钩内核函数(无需修改内核)
# 跟踪内核函数调用的堆栈
bpftrace -e 'kprobe:__alloc_pages { @[kstack] = count(); }'
1.3 硬件事件监控
- 监控 CPU 缓存命中、缺页异常等:
# 统计进程的缺页异常(page faults)
bpftrace -e 'software:faults:page-fault { @[comm] = count(); }'
02 用户空间程序分析
2.1 函数调用跟踪
- 跟踪用户态函数的调用参数
# 监控 libc 的 malloc 调用
bpftrace -e 'uprobe:/lib/x86_64-linux-gnu/libc.so.6:malloc { printf("%s malloc(%d)\n", comm, arg0); }'
2.2 延迟分析
- 测量函数执行耗时
bpftrace -e 'uprobe:/bin/bash:readline { @start[tid] = nsecs; }
uretprobe:/bin/bash:readline /@start[tid]/ {
@ns[comm] = hist(nsecs - @start[tid]); delete(@start[tid]);
}'
03 系统性能分析
3.1 CPU使用分析
- 生成火焰图定位热点
bpftrace -e 'profile:hz:99 { @[ustack] = count(); }' > out.stacks
# 配合 FlameGraph 生成可视化
3.2 IO性能分析
- 统计块设备IO延迟
bpftrace -e 'tracepoint:block:block_rq_issue { @start[args->device] = nsecs; }
tracepoint:block:block_rq_complete /@start[args->device]/ {
@us[args->device] = hist(nsecs - @start[args->device]);
}'
04 安全监控
4.1 敏感行为检测
- 敏感文件访问监控
bpftrace -e 'tracepoint:syscalls:sys_enter_openat {
if (str(args->filename) == "/etc/shadow") {
printf("ALERT: %s tried to access shadow!\n", comm);
}
}'
4.2 异常进程行为
- 检测反弹shell(异常execve调用)
bpftrace -e 'tracepoint:syscalls:sys_enter_execve {
printf("PID %d executed: %s\n", pid, join(args->argv));
}'
05 网络流量分析
5.1 TCP/UDP连接追踪
- 统计 TCP 连接目标:
bpftrace -e 'tracepoint:syscalls:sys_enter_connect {
@dest[comm] = lhist(args->uservaddr->sin_port, 0, 65535, 100);
}'
5.2 数据包捕获
- 抓取特定进程的HTTP请求
bpftrace -e 'tracepoint:syscalls:sys_exit_read /comm == "curl"/ {
if (args->ret > 0) { printf("%s\n", str(buf(args->buf, args->ret))); }
}'
06 动态调试与热修复
6.1 实时打桩
- 临时修改函数返回值
bpftrace -e 'kretprobe:vfs_read { if (retval > 100) { retval = -EIO; } }'
6.2 内存泄露检测
- 跟踪内存分配/释放不均匀
bpftrace -e 'uprobe:/lib/libc.so.6:malloc { @alloc[tid]++; }
uprobe:/lib/libc.so.6:free { @alloc[tid]--; }
interval:s:5 { print(@alloc); clear(@alloc); }'
07 容器/K8s环境观测
- 跟踪容器内的系统调用:
bpftrace -e 'tracepoint:syscalls:sys_enter_openat {
printf("ContainerID: %s, Cmd: %s, File: %s\n",
cgroup, comm, str(args->filename));
}'