[转帖]ebpf简介_ebpf编程

ebpf,简介,编程 · 浏览次数 : 0

小编点评

eBPF 是一个扩展的 Berkeley Packet Filter(扩展 Berkeley Packet Filter)技术,它是一种数据包过滤技术,是从 BPF (Berkeley Packet Filter) 技术扩展而来的。 eBPF 是一种内核态程序,它可以将数据包处理这项工作从内核空间转移到用户空间。它支持即时 (JIT) 编译器,并在字节码被 (JIT) 编译完成后,会直接调用 eBPF,而不是对每个方法的字节码进行新的解释。 eBPF 的优势包括: * 将数据包处理这项工作从内核空间转移到用户空间,提高了性能。 * 支持即时编译器,可提高性能。 * 低侵入性,可以创建 hook内核函数的代码比构建和维护内核模块的工作要少。 * 提供了一个单一、强大且易于访问的流程跟踪框架。 eBPF 的相关工具包括 BCC (Berkeley Packet Compiler),它是一个 Python/Lua API 的编译工具集合,前端提供 Python/Lua API,本身通过 C/C++ 语言实现,集成 LLVM/Clang 对 BPF 程序进行重写、编译和加载等功能,提供一些更人性化的函数给用户使用。

正文

  • https://cloud.tencent.com/developer/article/2154750?areaSource=103001.1&traceId=5pH2ixinTUE3D1qxjyVnA

     

什么是eBPF

eBPF 是什么呢? 从它的全称“扩展的伯克利数据包过滤器 (Extended Berkeley Packet Filter)” 来看,它是一种数据包过滤技术,是从 BPF (Berkeley Packet Filter) 技术扩展而来的。顾名思义BPF来源于伯克利大学, 最早应用于网络数据包过滤器,它比当时最先进的抓包技术快20倍,其主要得利于它的两个设计:

  • 内核态引入一个新的虚拟机,所有指令都在内核虚拟机中运行。
  • 用户态使用 BPF 字节码来定义过滤表达式,然后传递给内核,由内核虚拟机解释执行。

BPF 提供了一种在内核事件和用户程序事件发生时安全注入代码的机制,这就让非内核开发人员也可以对内核进行控制。 eBPF 则是对对BPF的一些扩展,将原本单一的数据包过滤事件逐步扩展到了内核态函数、用户态函数、跟踪点、性能事件(perf_events)以及安全控制等。eBPF 不仅扩展了寄存器的数量,引入了全新的 BPF 映射存储。 eBPF 程序架构强调安全性和稳定性,看上去更像内核模块,但与内核模块不同,eBPF 程序不需要重新编译内核,并且可以确保 eBPF 程序运行完成,而不会造成系统的崩溃。 eBPF 程序并不像常规的线程那样,启动后就一直运行在那里,它需要事件触发后才会执行。这些事件包括系统调用、内核跟踪点、内核函数和用户态函数的调用退出、网络事件,等等。借助于强大的内核态插桩(kprobe)和用户态插桩(uprobe),eBPF 程序几乎可以在内核和应用的任意位置进行插桩。

eBPF架构

eBPF 分为用户空间程序和内核程序两部分:

  • 用户空间程序负责加载 BPF 字节码至内核,如需要也会负责读取内核回传的统计信息或者事件详情
  • 内核中的 BPF 字节码负责在内核中执行特定事件,如需要也会将执行的结果通过 maps 或者 perf-event 事件发送至用户空间
  • 其中用户空间程序与内核 BPF 字节码程序可以使用 map 结构实现双向通信,这为内核中运行的 BPF 字节码程序提供了更加灵活的控制

交互流程如下所示: 通常我们借助 LLVM 把编写的 eBPF 程序转换为 BPF 字节码,然后再通过 bpf 系统调用提交给内核执行。内核在接受 BPF 字节码之前,会首先通过验证器对字节码进行校验(不能包含无限循环、不能导致内核崩溃、必须在有限时间内完成),只有校验通过的 BPF 字节码才会提交到即时编译器执行。 BPF 程序可以利用 BPF 映射(map)进行存储,而用户程序通常也需要通过 BPF 映射同运行在内核中的 BPF 程序进行交互。如下图所示,在性能观测中,BPF 程序收集内核运行状态存储在映射中,用户程序再从映射中读出这些状态。

eBPF优势

  1. 速度和性能。 eBPF 可以将数据包处理这项工作从内核空间转移到用户空间。同时,eBPF 还支持即时 (JIT) 编译器。在字节码被(JIT)编译完成后,会直接调用 eBPF,而不是对每个方法的字节码进行新的解释。
  2. 低侵入性。 当作为调试器时,eBPF 不需要停止程序来观察其状态。
  3. 安全。 程序被有效地沙箱化了,这意味着内核源代码仍然受到保护并保持不变。eBPF程序的验证步骤确保资源不会被运行无限循环的程序阻塞。
  4. 方便。 创建hook内核函数的代码比构建和维护内核模块的工作要少。
  5. 统一追踪。 eBPF 为我们提供了一个单一、强大且易于访问的流程跟踪框架,这增加了可见性和安全性。
  6. 可编程性。 使用 eBPF 有助于在不添加额外层的情况下增加环境的功能丰富性。由于代码直接在内核中运行,因此可以在 eBPF 事件之间存储数据,而不是像其他跟踪器那样转储数据。
  7. 表现力。 eBPF 具有丰富的表现力,能够执行通常只能在高级语言中才能找到的功能。

eBPF相关工具

  • BCC BCC 是 BPF 的编译工具集合,前端提供 Python/Lua API,本身通过 C/C++ 语言实现,集成 LLVM/Clang 对 BPF 程序进行重写、编译和加载等功能, 提供一些更人性化的函数给用户使用。BCC通常用在开发复杂的 eBPF 程序中,其内置的各种小工具也是目前应用最为广泛的 eBPF 小程序
  • bpftrace bpftrace 在 eBPF 和 BCC 之上构建了一个简化的跟踪语言,通过简单的几行脚本,就可以实现复杂的跟踪功能。因此,在编写简单的 eBPF 程序,特别是编写的 eBPF 程序用于临时的调试和排错时,你可以考虑直接使用 bpftrace ,而不需要用 C 或 Python 去开发一个复杂的程序。
  • libbpf libbpf是从内核中抽离出来的标准库,用它开发的 eBPF 程序可以直接分发执行,这样就不需要每台机器都安装 LLVM 和内核头文件了。不过,它要求内核开启 BTF 特性,需要非常新的发行版才会默认开启(如 RHEL 8.2+ 和 Ubuntu 20.10+ 等)。
  • go libary 使用这些 Go 语言开发库时需要注意,Go 开发库只适用于用户态程序中,可以完成 eBPF 程序编译、加载、事件挂载,以及 BPF 映射交互等用户态的功能,而内核态的 eBPF 程序还是需要使用 C 语言来开发的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/191076.html原文链接:https://javaforall.cn

与[转帖]ebpf简介_ebpf编程相似的内容:

[转帖]ebpf简介_ebpf编程

https://cloud.tencent.com/developer/article/2154750?areaSource=103001.1&traceId=5pH2ixinTUE3D1qxjyVnA 什么是eBPF eBPF 是什么呢? 从它的全称“扩展的伯克利数据包过滤器 (Extended

[转帖]Linux性能优化(四)——BCC性能监控工具

一、BCC简介 1、BCC简介 BCC是一个Python库,简化了eBPF应用的开发过程,并收集了大量性能分析相关的eBPF应用。BCC为BPF开发提供了不同的前端支持,包括Python和Lua,实现了map创建、代码编译、解析、注入等操作,使开发人员只需聚焦于用C语言开发要注入的内核代码。 BCC

[转帖]python 性能优化监控工具_Linux性能优化(四)——BCC性能监控工具

一、BCC简介 1、BCC简介 BCC是一个Python库,简化了eBPF应用的开发过程,并收集了大量性能分析相关的eBPF应用。BCC为BPF开发提供了不同的前端支持,包括Python和Lua,实现了map创建、代码编译、解析、注入等操作,使开发人员只需聚焦于用C语言开发要注入的内核代码。 BCC

【转帖】Linux性能优化(四)——BCC性能监控工具

一、BCC简介 1、BCC简介 BCC是一个Python库,简化了eBPF应用的开发过程,并收集了大量性能分析相关的eBPF应用。BCC为BPF开发提供了不同的前端支持,包括Python和Lua,实现了map创建、代码编译、解析、注入等操作,使开发人员只需聚焦于用C语言开发要注入的内核代码。 BCC

[转帖]程序员的平行宇宙 —— eBPF 系统级跟踪技术简单入门

https://blog.mygraphql.com/zh/posts/low-tec/trace/trace-quick-start/ 程序员的平行宇宙 程序员有两个世界: 一个是编码世界,我们很容易认为,我们考虑了一切,也完成了一切的代码。 然后是运行世界,我们发现,无论我们多么的严谨和考虑一切

[转帖]Linux性能优化(四)——BCC性能监控工具

原文 https://blog.51cto.com/9291927/2593705 1、BCC简介 一、BCC简介 BCC是一个Python库,简化了eBPF应用的开发过程,并收集了大量性能分析相关的eBPF应用。BCC为BPF开发提供了不一样的前端支持,包括Python和Lua,实现了map建立、

[转帖]eBPF介绍

https://blog.51cto.com/u_15155099/2767325 1.BPF起源BPF源头起源于一篇1992年的论文,这篇论文主要提出一种新的网络数据包的过滤的框架,如下图所示。提出bpf的原因其实也很简单,早期我们从网卡中接收到很多的数据包,我们要想从中过滤出我们想要的数据包,我

[转帖]宋宝华:用eBPF/bcc分析系统性能的一个简单案例

原创 宋宝华 Linux阅码场 3月8日 bcc是eBPF的一种前端,当然这个前端特别地简单好用。可以直接在python里面嵌入通过C语言写的BPF程序,并帮忙产生BPF bytecode和load进入kernel挂载kprobe、tracepoints等上面执行。之后,还可以从python取出来C

[转帖]eBPF 技术实践:加速容器网络转发,耗时降低 60%+

https://my.oschina.net/u/6150560/blog/5587717 背景 Linux 具有功能丰富的网络协议栈,并且兼顾了非常优秀的性能。但是,这是相对的。单纯从网络协议栈各个子系统的角度来说,确实做到了功能与性能的平衡。不过,当把多个子系统组合起来,去满足实际的业务需求,功

[转帖]eBPF 技术实践:加速容器网络转发,耗时降低60%+

https://new.qq.com/rain/a/20221103A03ZHE00 作者 | 王栋栋 背 景 Linux 具有功能丰富的网络协议栈,并且兼顾了非常优秀的性能。但是,这是相对的。单纯从网络协议栈各个子系统的角度来说,确实做到了功能与性能的平衡。不过,当把多个子系统组合起来,去满足实际