bpftrace是基于BPF和BCC构建的开源跟踪程序。与BCC同样,bpftrace附带了许多性能工具和支持文档。可是,它还提供了高级编程语言,使您能够建立功能强大的单行代码和简短的工具。git
例如,使用bpftrace one-liner将vfs_read() 返回值(字节或错误值)汇总为直方图:github
# bpftrace -e 'kretprobe:vfs_read { @bytes = hist(retval); }'数据库
Attaching 1 probe...
^C
@bytes:
(..., 0) 223 |@@@@@@@@@@@@@ |
[0] 110 |@@@@@@ |
[1] 581 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
[2, 4) 23 |@ |
[4, 8) 9 | |
[8, 16) 844 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|
[16, 32) 44 |@@ |
[32, 64) 67 |@@@@ |
[64, 128) 50 |@@@ |
[128, 256) 24 |@ |
[256, 512) 1 |
bpftrace是使用自定义单行代码和简短脚本的临时工具的理想选择,而BCC是复杂工具和守护程序的理想选择。编程
bpftrace与其它可观测性工具的对比后端
l perf编程语言
bpftrace提供了一种简洁的高级语言,而perf脚本语言则是冗长的。ide
perf经过perf记录和内存摘要模式(例如perf top)以二进制格式支持有效的事件转储。工具
bpftrace支持有效的内核内摘要,例如自定义直方图,而perf的内置内核内摘要仅限于计数(perf stat)。oop
能够经过运行BPF程序来扩展perf的功能,尽管不能使用bpftrace之类的高级语言来实现。性能
l Ftrace
bpftrace提供相似于C和awk的高级语言,而Ftrace具备其本身的特殊语法。Ftrace具备较少的依赖性,使其适合于小型Linux环境。Ftrace还具备检测模式,例如到目前为止的功能计数除了bpftrace使用的事件源以外,还进行了更多优化。(个人Ftrace funccount当前的启动和中止时间比bpftrace更快,而且运行时开销也较低。)
l Systemtap
bpftrace和SystemTap均提供高级语言。
bpftrace基于内置Linux技术,而SystemTap添加了本身的内核模块,事实证实,这些模块在RHEL之外的系统上都不可靠。正如bpftrace所作的那样,SystemTap支持BPF后端的工做已经开始,这应该使其在其余系统上更可靠。SystemTap当前在其库(磁带集)中具备更多辅助功能,可用于检测不一样的目标。
l Lttng
LTTng优化了事件转储,并提供了用于分析事件转储的工具。与bpftrace相比,这种性能分析方法与bpftrace不一样,后者专门用于临时实时分析。
l 应用程序自带的特定工具
特定于应用程序和运行时的工具仅限于用户级别的可见性。bpftrace还能够检测内核和硬件事件,从而肯定那些工具没法解决的问题根源。这些工具的优势是它们一般是针对目标应用程序或运行时量身定制的。MySQL数据库分析器已经了解如何检测查询,而JVM分析器已经能够检测垃圾收集。在bpftrace中,您须要本身编写此类功能的代码。
bpftrace工具具备许多共同点:
他们解决了现实世界中的可观察性问题。
它们被设计为以root用户身份在生产环境中运行。
每一个工具都有一个手册页(在man / man8下)。
每一个工具都有一个示例文件,包含输出和讨论(在tools / * _ examples.txt下)。
工具源代码以块注释介绍开始。
这些工具越简单越好。(更复杂的工具将交由BCC使用。)
CentOS7下,bpftrace安装后的,可执行文件 *.bt文件路径在: /usr/share/bpftrace/tools
cd /usr/share/bpftrace/tools
./opensnoop.bt 便可执行对应的bpftrace程序
TIPS: 大神的github上bpf performance tools配套还提供了不少 bpftrace工具,特意为写书编写的,每一个工具都很强大。