当前位置: 首页 > news >正文

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:

优点:

  1. 稳定性tracepoints 是在内核源代码中预定义的,提供了稳定的 ABI。即使内核版本升级,tracepoint 的名称和参数也不会改变,这使得开发者可以编写依赖于特定 tracepoint 的代码,而不用担心在未来的内核版本中这些 tracepoint 会改变。

  2. 性能tracepoints 对性能的影响非常小。只有当 tracepoint 被激活,并且有一个或多个回调函数(也称为探针)附加到它时,它才会消耗 CPU 时间。这使得 tracepoints 非常适合在生产环境中使用。

缺点:

  1. 可用性tracepoints 的数量和覆盖范围有限。并非所有的内核函数都有对应的 tracepoint,这限制了你可以监控的事件。

2、kprobe

Linux kprobes调试技术是内核开发者们专门为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术。利用kprobes技术,内核开发人员可以在内核的绝大多数指定函数中动态的插入探测点来收集所需的调试状态信息而基本不影响内核原有的执行流程。

kprobes技术目前常用的探测技术是kprobekretprobe

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、模糊搜索挂载点

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • git 压栈存储当前分支修改,出栈使用保存
  • at:定时任务,仅执行一次
  • Python 内置的一些数据结构
  • ISAC: Toward Dual-Functional Wireless Networks for 6G and Beyond【论文阅读笔记】
  • 02 Flask-快速上手
  • Docker中的容器内部无法使用vi命令怎么办?
  • 敏捷开发方法例题
  • 说一下解除docker限制内存警告
  • Java中的linkedList类及与ArrayList的异同
  • opencv彩色图像转灰度图原理
  • .net 获取某一天 在当月是 第几周 函数
  • 【go】pprof 性能分析
  • 什么是CPU、GPU、NPU?(包懂+会)
  • 为什么eBay的防IP关联很重要?
  • react | 自学笔记 | 持续更新
  • [译]前端离线指南(上)
  • 「译」Node.js Streams 基础
  • C语言笔记(第一章:C语言编程)
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Facebook AccountKit 接入的坑点
  • Flex布局到底解决了什么问题
  • HashMap ConcurrentHashMap
  • iOS小技巧之UIImagePickerController实现头像选择
  • jdbc就是这么简单
  • k8s如何管理Pod
  • Python 反序列化安全问题(二)
  • SpriteKit 技巧之添加背景图片
  • 七牛云假注销小指南
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 如何实现 font-size 的响应式
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 正则学习笔记
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​Python 3 新特性:类型注解
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #pragma pack(1)
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (C#)获取字符编码的类
  • (day18) leetcode 204.计数质数
  • (Qt) 默认QtWidget应用包含什么?
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (十六)一篇文章学会Java的常用API
  • ***原理与防范
  • ... 是什么 ?... 有什么用处?
  • .gitignore文件—git忽略文件
  • .NET C# 操作Neo4j图数据库
  • .net core 6 redis操作类
  • .NET Core 成都线下面基会拉开序幕
  • .NET Framework杂记
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET单元测试