BCC
是第一个基于BPF
的上层跟踪框架。BPF
是一种在1992年开发用来提高网络包过滤性能的技术。在2003年,它被重写扩展为eBPF
,在2014年引入到Linux
内核。它的重写使得它变成一个通用的执行引擎,增强它的潜力。
1992年开发的
BPF
被称为“古典BPF
“,已经停止开发,现在eBPF
是主流。目前所称的BPF
就是指eBPF
这项新技术提供在内核和用户态应用(如磁盘IO
,QEMU
)等事件上运行小程序的方法。本质上,它让内核更加可编程化,给予内核开发人员或非内核开发人员更多能力去调整和控制系统,直到他们认为适合为止。
在
intel
体系CPU
幽灵漏洞后,一些Linux
发行版在x86
体系无条件开启JIT
,完全抛弃掉eBPF
字节码解析器。
BPF
同时使用了一个验证器来检查BPF
指纹是否安全,确保它不会破坏内核。然而,它并不完美,因为它无法阻止用户写出某些非逻辑但可运行的代码。一个隐性的除零错误是没办法被验证器捕获,但一个无限循环,却会被捕获。
BCC
如果BCC
背后的真正动力是BPF
,那么BCC
到底为我们做了什么?在BCC
之前,BPF
的唯一前端是原始的BPF
字节码、C
和perf
。虽然这些工具/前端的原始潜力非常高,但要充分利用这些工具/前端的BPF
是非常困难的。换句话说,对于大多数人来说,学习曲线太陡峭了,将选择其他跟踪技术(以能力换取简单性)。
BCC
保留了BPF
的原始潜力,也使大多数开发人员更容易接触到它。它为编写内核BPF C
代码(也称为嵌入C
)提供了C
编程环境,并为用户空间接口提供了Python
、Lua
或C++
。换句话说,您可以使用嵌入C
从跟踪的事件中提取数据,并使用Python
脚本、Lua
或C++
程序以您想要的方式进一步处理和显示数据。使用BCC
来开始编写自己的BPF
程序的学习曲线大大减少(而且相当直接),特别是现在它已经成熟了,已经发布了多年,有更多的文档,等等。
除了使BPF
的潜力更加贴近实际之外,BCC
存储库还包含70多个用于性能分析和调试的现成BPF程序。正如您在下图中看到的,堆栈中的几乎所有内容都有一个脚本!这些都是现成的,每个都有完整的文档和示例用法。还有大量的资源甚至指南可以帮助你开始开发你自己的BPF程序。
BCC
感兴趣一般来说,在跟踪中,编写一个C程序来提取数据并编写一个Python或C++程序来处理和显示数据并不是最快的事情,特别是当您可以在不同的前端使用一行程序来获得相同的结果时(尽管BCC
确实有提供这种“一行程序”能力的BPF
工具trace.py
)。
以下是一些BCC
会比其它跟踪前端更有用的理由:
perf
的工具,但想在数据收集和展示有更多掌控BPF
BCC
工具的功能贴近需求,且希望重构它从根本来说,当你需要对系统正在发生什么有更深的了解和想对收集的数据有完全把控,BCC
是一个不错的选择。
BCC
特性下面列举BCC
提供给我们的特性,包括内核级,用户态级和一些自带的工具。
BCC
使用了一系列内核特性,如BPF
,kprobes
,uprobes
。
kprobes
uprobes
perf_event_open
perf_event_open
bpf_trace_printk
bpf_perf_event_output
BPF
映射)BPF
映射)BPF
映射)BPF
映射)bpf_ktime_get_ns
和BPF
程序)BPF
栈映射)BPF
栈映射)perf_event_attr.write_backward
)BPF JIT
,BPF
映射总览)BPF
校验器)BCC
通过它的用户态前端也提供了一系列用户态特性:
uprobes
进行SystemTap
风格的跟踪(DTRACE_PROBEn
))Python
使用BPF.trace_pipe
和BPF.trace_fields
)BPF_PERF_OUTPUT
宏和BPF.open_perf_buffer
)BPF.get_table
和table.clear
)bpf_probe_read
)ksym
和ksymaddr
)usymaddr
)BPF
跟踪点支持(TRACEPOINT_PROBE
)BPF
栈跟踪支持(BPF_STACK_TRACE
)除了 BCC
必须提供的所有技术功能外,它还附带了大量示例、教程和自带工具。
BCC
中包含两个教程:使用 BCC
工具解决性能、故障排除和网络问题的教程,以及 BCC BPF Python
开发人员教程,让您开始使用 C 和 Python 编写自己的 BPF 程序。
docs/tutorial.md
:使用 BCC
工具解决性能、故障排除和网络问题的教程docs/tutorial_bcc_python_developer.md
:使用 Python
接口开发新的 BCC BPF
程序
examples/*
中的BPF
程序对应BCC Python
开发者教程;这些仅供参考
BCC
附带的自带 BPF
工具可以在 tools/*
中找到,而且数量很多!每个工具都带有自己的 *.txt
文件,作为该工具的手册页。其中一些工具包括:
tools/biolatency.py/txt
:将块设备 I/O
延迟总结为直方图tools/cpuunclaimed.py/txt
:样本CPU
运行队列并计算出空闲CPU
tools/hardirqs.py/txt
:测量hard IRQ
(硬中断)事件时间tools/klockstat.py/txt
:跟踪内核互斥锁定事件并显示锁定统计信息可以在BCC GitHub
存储库 (README.md) 的首页找到这些自带工具的完整列表。
最后,还有BCC
参考指南。应该注意的是,可能无法在此处找到所有内容,并且缺少一些 API
(即 bpf_usdt_readarg
)。但是,此处列出了需要的大部分内容,如果没有明确说明,可以在自带工具和示例中找到示例用法,以帮助解决问题。
docs/reference_guide.md
:BCC/BPF API
参考指南暗号:b1117