bpftrace使用
bpftrace是一种基于eBPF(Extended Berkeley Packet Filter)的跟踪工具,用于在Linux系统中进行动态跟踪和系统性能分析。理解bpftrace的概念、原理和使用方法有助于更好地使用和应用它。
介绍
- eBPF(Extended Berkeley Packet Filter):eBPF是一种虚拟机技术,允许在内核中运行安全的、可编程的代码片段,以便对系统执行深入的跟踪和监视。eBPF提供了一种灵活且高效的方式来扩展内核的功能,并允许用户空间应用程序与内核交互。
- bpftrace语言:bpftrace提供了一种高级脚本语言,使用类似于awk的语法,用于编写跟踪脚本。bpftrace脚本通过eBPF提供的虚拟机执行,可以捕获和分析各种系统事件和指标。
- 动态加载和执行:bpftrace的一个关键特性是它可以在运行时动态加载和执行脚本,而无需重新编译内核或应用程序。这使得它非常适合于实时系统性能分析和故障排查。
概念原理
1、tracepoint
tracepoints
是 Linux 内核中的一种机制,它们是在内核源代码中预定义的钩子点,用于插入用于跟踪和调试的代码。tracepoints
在内核中的特定位置被硬编码,每个 tracepoint
都有一个唯一的名称和一组相关的参数。
tracepoints
的主要优点是它们对性能的影响非常小。当没有激活 tracepoint
时,它几乎不会影响系统性能。只有当一个 tracepoint
被激活,并且有一个或多个回调函数(也称为探针)附加到它时,它才会消耗 CPU 时间。这使得 tracepoints
非常适合在生产环境中使用,因为它们可以在需要时打开,而在不需要时关闭,以最小化性能影响。
tracepoints
的另一个优点是它们提供了一种稳定的 ABI(应用程序二进制接口)。这意味着,即使在内核版本升级后,tracepoint
的名称和参数不会改变,这使得开发者可以编写依赖于特定 tracepoint
的代码,而不用担心在未来的内核版本中这些 tracepoint
会改变。
在 eBPF 中,你可以使用 tracepoint
来捕获内核中发生的事件。你可以编写一个 eBPF 程序,然后将它附加到一个 tracepoint
上。当 tracepoint
被触发时,你的 eBPF 程序会被调用,你可以在你的 eBPF 程序中访问 tracepoint
的参数,以获取有关事件的详细信息。
tracepoints
和 kprobes
/kretprobes
都是 Linux 内核中用于动态跟踪的机制,但它们在使用和性能方面有一些关键的区别。
以下是 tracepoints
和 kprobes
/kretprobes
的一些优缺点:
tracepoints:
优点:
-
稳定性:
tracepoints
是在内核源代码中预定义的,提供了稳定的 ABI。即使内核版本升级,tracepoint
的名称和参数也不会改变,这使得开发者可以编写依赖于特定tracepoint
的代码,而不用担心在未来的内核版本中这些tracepoint
会改变。 -
性能:
tracepoints
对性能的影响非常小。只有当tracepoint
被激活,并且有一个或多个回调函数(也称为探针)附加到它时,它才会消耗 CPU 时间。这使得tracepoints
非常适合在生产环境中使用。
缺点:
- 可用性:
tracepoints
的数量和覆盖范围有限。并非所有的内核函数都有对应的tracepoint
,这限制了你可以监控的事件。
2、kprobe
Linux kprobes调试技术是内核开发者们专门为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术。利用kprobes技术,内核开发人员可以在内核的绝大多数指定函数中动态的插入探测点来收集所需的调试状态信息而基本不影响内核原有的执行流程。
kprobes技术目前常用的探测技术是kprobe
和kretprobe
。
kprobe
允许在内核函数的入口处插入一个断点。当 CPU 执行到这个位置时,会触发一个陷入(trap),CPU 切换到你预先定义的处理函数(probe handler)执行。这个处理函数可以访问和修改内核的状态,包括 CPU 寄存器、内核栈、全局变量等。执行完处理函数后,CPU 会返回到断点处,继续执行原来的内核代码。
kretprobe
允许在内核函数返回时插入探测点。这对于追踪函数的返回值或者函数的执行时间非常有用。kretprobe 的工作原理是在函数的返回地址前插入一个断点。当函数返回时,CPU 会先跳转到你的处理函数,然后再返回到原来的地址。
当然,也不是所有的函数都是支持kprobe
机制,可以通过cat /sys/kernel/debug/tracing/available_filter_functions
查看当前系统支持的函数.
3、uprobe
uprobe
是一种 用户空间探针(User-Space Probe),它允许开发人员在用户空间程序的某些位置(如函数入口、出口或特定指令处)动态插入探针,从而监控或调试用户态程序的行为。与 kprobe
类似,uprobe
提供了一个强大的调试和性能分析工具,但 uprobe
作用于用户空间程序,而 kprobe
作用于内核空间。
使用
1、模糊搜索挂载点