bpftrace是一款基于Linux eBPF的高性能系统跟踪工具,它提供了一种简单易用的脚本语言,让开发者和系统管理员能够深入洞察系统内部运行状态。无论你是想要排查性能问题、分析系统调用,还是监控应用程序行为,bpftrace都能成为你的得力助手。😊
🚀 什么是bpftrace?
bpftrace是一个高级跟踪语言,专为Linux eBPF系统设计。它使用LLVM作为后端,将脚本编译为BPF字节码,并利用libbpf和bcc与Linux BPF系统进行交互。bpftrace语言的设计灵感来自于awk、C语言,以及前辈跟踪工具如DTrace和SystemTap。
📝 基础入门:从Hello World开始
最简单的bpftrace脚本就是打印"Hello World":
bpftrace -e 'BEGIN { printf("hello world\n"); }'
BEGIN是一个特殊的探针,它在程序开始时触发,类似于awk的BEGIN。你可以用它来设置变量和打印头部信息。
🔍 文件打开监控技巧
想要实时监控哪些文件被打开?使用以下命令:
bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args.filename)); }'
这个命令会显示正在打开文件的进程名称和文件路径,帮助你快速定位问题。
📊 系统调用统计分析
统计各个进程的系统调用次数是系统性能分析的基础:
bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'
这个命令会按进程名称汇总系统调用次数,在按下Ctrl-C时打印报告。
🎯 数据分布可视化
使用直方图来分析read()系统调用返回的字节数分布:
bpftrace -e 'tracepoint:syscalls:sys_exit_read /pid == 18644/ { @bytes = hist(args.ret); }'
hist()函数会将数据汇总为2的幂次方直方图,让你直观地看到数据分布模式。
⏱️ 性能耗时分析
想要了解read()操作花费了多少时间?使用以下命令:
bpftrace -e 'kprobe:vfs_read { @start[tid] = nsecs; } kretprobe:vfs_read /@start[tid]/ { @ns[comm] = hist(nsecs - @start[tid]); delete(@start[tid]); }'
这个技巧能够测量read()操作的纳秒级耗时,并按进程名称进行汇总。
🔄 进程调度跟踪
监控进程调度事件可以帮助你理解系统负载分布:
bpftrace -e 'tracepoint:sched:sched* { @[probe] = count(); } interval:s:5 { exit(); }'
📈 内核栈性能分析
使用99赫兹的频率来分析内核栈:
bpftrace -e 'profile:hz:99 { @[kstack] = count(); }'
这个命令会分析所有CPU上的内核栈,生成频率计数,非常适合制作火焰图。
💾 磁盘I/O监控技巧
监控块I/O请求的字节大小分布:
bpftrace -e 'tracepoint:block:block_rq_issue { @ = hist(args.bytes); }'
这个技巧可以帮助你分析存储性能问题。
🛠️ 实用工具资源
bpftrace提供了丰富的工具集,包括各种实用的跟踪脚本,如文件打开监控、网络连接跟踪等。
🎉 开始你的bpftrace之旅
通过这10个基础技巧,你已经掌握了bpftrace的核心功能。现在可以开始编写自己的跟踪脚本,深入探索Linux系统的运行奥秘!
记住,实践是最好的学习方式。多尝试不同的探针和函数组合,你会发现bpftrace的强大之处。💪
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考





