解码eBPF可观测性:eBPF如何改变我们所知的观测性

news2024/11/16 4:50:24

让我们来看看eBPF——这项技术到底是什么,它如何影响观测性,它与现有的观测性实践有什么区别,未来可能会发生什么变化?

在过去的两年里,云原生社区一直在热烈讨论eBPF。eBPF曾是KubeCon、eBPF Days和eBPF Summit的主题,并且越来越受欢迎。像Google和Netflix这样的公司多年来一直在使用eBPF,新的用例也不断涌现。特别是在观测性方面,eBPF被认为将是一个重大改变。

所以让我们来看看eBPF——这项技术到底是什么,它如何影响观测性,它与现有的观测性实践有什么区别,未来可能会发生什么变化?

什么是eBPF?

eBPF是一种编程框架,允许我们在Linux内核中安全地运行沙盒化的程序,而无需更改内核代码。

它最初是为Linux开发的(而且直到今天,这项技术在Linux上最成熟),但微软正在迅速发展eBPF在Windows上的实现[1]。

eBPF程序从设计上来说非常高效和安全——内核会对其进行验证,以确保它们不会危及操作系统的稳定性或安全性。

为什么eBPF如此重要?

要理解这一点,我们需要了解用户空间和内核空间。

用户空间是所有应用程序运行的地方。内核空间位于用户空间和物理硬件之间。用户空间中的应用程序无法直接访问硬件。相反,它们通过系统调用与内核通信,然后内核再访问硬件。

所有内存访问、文件读写和网络流量都经过内核。内核还管理并发进程。

基本上,所有操作都通过内核进行(见下图)。

而eBPF提供了一种安全的、高效的扩展内核功能的方式。

用户空间和内核空间

从历史上看,出于显而易见的原因,更改内核源代码或操作系统层的任何内容一直都非常困难。

Linux内核有3000万行代码[2],任何更改要从一个想法变成广泛可用的东西需要数年时间。首先,Linux社区必须同意它。然后,它必须成为官方Linux发布的一部分。然后,在几个月后,它会被Red Hat和Ubuntu等发行版采用,然后传播到更广泛的用户。

从技术上讲,一个人可以将内核模块加载到内核中,直接进行更改,但这是非常高风险的,涉及复杂的内核级编程,因此几乎普遍不建议这样做。

eBPF出现并解决了这个问题,提供了一种在内核中附加和运行程序的安全和高效机制。

让我们看看eBPF如何确保安全性和性能。

高度安全
  • 严格的验证 — 在任何eBPF程序加载到内核之前,它都会由eBPF验证器进行验证,以确保代码绝对安全——例如,没有硬循环、无效的内存访问、不安全的操作。
  • 沙盒化 — eBPF程序在内核内部的内存隔离沙盒中运行,与其他内核组件分开。这可以防止未经授权的访问内核内存、数据结构和内核源代码。
  • 有限的操作 — eBPF程序通常必须使用C语言的一个小子集来编写,即受限指令集。这限制了eBPF程序可以执行的操作,降低了安全漏洞的风险。
高性能 / 轻量级
  • 以本机机器码运行 — eBPF程序在CPU上以本机机器指令的形式运行。这导致更快的执行和更好的性能。•没有上下文切换 — 常规应用程序会在用户空间和内核空间之间定期切换上下文,这会消耗资源。eBPF程序,因为它们在内核层运行,可以直接访问内核数据结构和资源。
  • 事件驱动 — eBPF程序通常仅在特定内核事件发生时运行,而不是一直运行。这最小化了开销。
  • 针对硬件进行优化 — eBPF程序在执行之前由内核的即时编译器(JIT)编译为机器代码,因此代码针对特定的硬件进行了优化。

因此,eBPF为内核编程提供了一种安全且高效的钩子。考虑到一切都通过内核,这为我们带来了以前无法实现的新可能性。

为什么现在才如此重要?

eBPF周围的技术在很长一段时间内得以发展,已经有大约30年了。

在过去的7-8年中,eBPF已被一些大型公司大规模使用,现在我们正在进入一个使用eBPF变得更加主

流的时代。请参阅eBPF的共同创作者之一、Linux的共同维护者Alexei Starovoitov的这个视频[3],了解eBPF的发展历程。

eBPF — 简要历史
  • 1993年-来自劳伦斯伯克利国家实验室的一篇论文[4]探讨了使用内核代理进行数据包过滤。这就是BPF(“伯克利数据包过滤器”)这个名字的由来。
  • 1997年 — BPF正式作为Linux内核的一部分引入(版本2.1.75)。
  • 1997–2014年 — 添加了一些功能,以改进、稳定和扩展BPF的功能。
  • 2014年 — 引入了重要的更新,称为“扩展伯克利数据包过滤器”(eBPF)。这个版本对BPF技术进行了重大改进,使其更广泛可用,因此称之为“扩展”。

之所以说这个发布很重要,是因为它使得扩展内核功能变得容易。

程序员可以更多或更少地像编写常规应用程序一样编写代码,而周围的eBPF基础设施会处理低级验证、安全性和效率问题。

eBPF的周围支持生态系统和脚手架使这成为可能(见下图)。

来源:https://ebpf.io/what-is-ebpf/

更好的是,eBPF程序可以在不重新启动的情况下加载到内核中,并且可以随时卸载。

所有这些突然使得广泛采用和应用成为可能。

在生产系统中的广泛应用

eBPF的受欢迎程度在过去的7-8年中迅速增长,许多大型公司在规模生产系统中使用它。

  • 到2016年,Netflix广泛使用eBPF进行跟踪。Brendan Gregg[5]实现了它,他在基础设施和运维领域被广泛认为是eBPF的权威人士。
  • 2017年 — Facebook开源了他们基于eBPF的负载均衡器Katran[6]。自2017年以来,每个访问Facebook.com[7]的数据包都经过了eBPF。
  • 2020年- Google将eBPF纳入其Kubernetes提供的一部分。eBPF现在驱动着GKE的网络、安全和可观测性层[8]。到目前为止,企业中也有广泛的采用,如Capital One[9]和Adobe[10]。
  • 2021年 — Facebook、Google、Netflix、Microsoft和Isovalent联合宣布创建eBPF基金会[11]来管理eBPF技术的增长。

现在有成千上万家公司使用eBPF,并且每年涌现出数百个eBPF项目,探索不同的用例。

eBPF现在是Linux内核中的一个独立子系统,并拥有广泛的社区支持。这项技术本身也在不断扩展,有了几个新的添加。

那么,我们可以用eBPF做什么?

eBPF的最常见用途可以分为三个领域:

  • 网络
  • 安全
  • 可观测性

安全和网络已经看到了更广泛的采用和应用,其中包括像Cilum[12]这样的项目。相比之下,基于eBPF的可观测性方案在其演进过程中还处于早期阶段。

让我们首先看看安全和网络的用例。

(1) 安全

安全是eBPF的一个非常流行的用例。使用eBPF,程序可以观察内核级别的一切情况,以高速处理事件以检查意外行为,并比以前更快地发出警报。

例如 -

  • Google[13]使用eBPF进行大规模入侵检测
  • Shopify[14]使用eBPF来实现容器安全

一些第三方安全产品[15]现在使用eBPF进行数据收集和监视。

(2) 网络

网络是另一个广泛应用的用例。位于eBPF层的位置允许全面监测网络可观测性,例如完整网络路径的可见性,包括所有跳数,以及源IP和目标IP。使用eBPF程序,可以处理高速网络事件并在内核内直接操作网络数据包,而开销非常低。

这允许各种网络用例,如负载平衡、DDoS防护、流量整形和服务质量(QoS)。

  • Cloudflare[16]使用eBPF检测并防止DDoS攻击,每秒处理1000万个数据包[17]而不影响网络性能。
  • Meta的基于eBPF的Katran[18]为Facebook的所有负载均衡进行处理

(3) 可观测性

到目前为止,通过内核观察一切并且eBPF提供了一种高性能和安全的方式来观察一切,这使得eBPF在可观察性方面非常有用。

让我们更深入地探讨可观测性,看看这项技术的影响。

eBPF如何确切影响可观测性?

为了探讨这一点,让我们离开eBPF的世界,进入可观测性的世界,看看构成我们标准可观测性解决方案的内容。

任何可观测性解决方案都有四个主要组件:

1.数据收集 — 从应用程序和基础设施获取遥测数据2.数据处理 — 对收集的数据进行过滤、索引和计算3.数据存储 — 数据的短期和长期存储4.用户体验层 — 确定用户如何使用数据

在这些组件中,eBPF影响的是(截至今天)仅仅是数据收集层 — 使用eBPF直接从内核收集遥测数据的简便机制。

0*8zMD7h66uFLgBIJH.png

eBPF — 对可观测性的影响

所以当我们说“eBPF可观测性”时,我们实际上是指使用eBPF作为收集遥测数据的工具,而不是使用其他方法来进行仪器化。可观测性解决方案的其他组件保持不变。

eBPF可观测性的工作原理

为了充分理解eBPF可观测性背后的机制,我们需要了解挂钩(hooks)的概念。

正如我们前面所看到的,eBPF程序主要是事件驱动的,即每次发生特定事件时都会触发它们。例如,每次进行函数调用时,都可以调用一个eBPF程序来捕获一些用于可观测性目的的数据。

  • 首先,这些挂钩可以在内核空间或用户空间。因此,eBPF可以用于监视用户空间应用程序以及内核级事件。
  • 其次,这些挂钩可以是预定义的/静态的,也可以在运行中动态插入到系统中(无需重新启动!)

这四种不同的eBPF机制允许每一种(见下图)

1*_e2Q4FEhTJhkK2nVYkiICw.png

用户空间和内核空间的静态和动态eBPF挂钩:

  • 内核跟踪点 — 用于挂接到由内核开发人员预定义的事件(使用TRACE_EVENT宏)
  • USDT — 用于挂接到应用程序代码中由开发人员预定义的跟踪点
  • Kprobes(内核探针) — 用于在运行时动态挂接到内核代码的任何部分
  • Uprobes(用户探针) — 用于在运行时动态挂接到用户空间应用程序的任何部分

在内核空间中有许多预定义的挂钩,可以轻松将eBPF程序附加到其中(例如,系统调用、函数入口/出口、网络事件、内核跟踪点)。类似地,在用户空间中,许多语言运行时、数据库系统和软件堆栈会暴露出Linux BCC工具的预定义挂钩,eBPF程序可以连接到这些挂钩。

但更有趣的是kprobes和uprobes。如果生产中出现问题,我没有足够的信息,并且我希望在运行时动态添加仪表化,该怎么办?这就是kprobes和uprobes允许强大的可观测性的地方。

0*4BZtZLhHeUsGWSc1.png

eBPF kprobes 和 uprobes:

例如,使用uprobes,可以在不修改应用程序代码的情况下在运行时挂接到应用程序内的特定函数。每当执行该函数时,都会触发一个eBPF程序以捕获所需的数据。这允许像实时[19]调试这样的令人兴奋的可能性。

现在我们知道了eBPF可观测性是如何工作的,让我们来看看用例。

eBPF可观测性用例

eBPF可用于几乎所有常见的现有可观测性用例,并且还提供了新的可能性。

  • 系统和基础设施监控
  • 应用程序性能监控(APM)
  • 安全监控
  • 故障排除

(1) 系统和基础设施监控

在这个领域,eBPF最常用于监控Linux主机的性能和资源使用情况。

  • CPU和内存使用率
  • 硬盘和网络性能
  • 进程活动和调度
  • 文件系统活动

eBPF程序可以轻松地在这些事件的发生时捕获数据,并将其发送到存储后端,以便稍后分析。

(2) 应用程序性能监控(APM)

eBPF也用于应用程序内部的性能监控。例如,在Go应用程序中,可以使用uprobes挂接到某个特定函数,以捕获函数参数、返回值和执行时间。这对于详细分析应用程序性能问题非常有用。

(3) 安全监控

eBPF在安全监控方面也非常有用。它可以用于检测恶意行为、网络攻击和异常事件。eBPF程序可以在内核和应用程序级别捕获事件,并将其传递给安全信息和事件管理系统,以进行进一步的分析和响应。

(4) 故障排除

eBPF还可以用于故障排除。它可以用于跟踪应用程序崩溃、性能下降或其他问题的根本原因。eBPF程序可以捕获关键性能指标、事件和上下文信息,以帮助诊断问题并进行修复。

实际示例

以下是一些eBPF可观测性用例的实际示例:

  • Tracing和Profiling — 使用eBPF捕获应用程序的性能数据,例如函数调用、系统调用和内存分配,以识别瓶颈和优化性能。
  • 网络可观测性 — 使用eBPF来监视网络流量、分析网络包,并实施防火墙策略和负载平衡。
  • 容器监控 — 在Kubernetes集群中,使用eBPF来监控容器内部的资源使用情况、性能和问题。
  • 安全监控 — 使用eBPF来检测潜在的安全威胁,例如异常网络活动、不寻常的系统调用和入侵尝试。
  • 分布式跟踪 — 使用eBPF捕获应用程序的分布式跟踪数据,以分析请求的流经整个系统的路径,帮助诊断和优化性能问题。
eBPF和传统观测性的比较

现在让我们来比较eBPF可观测性和传统观测性方法。

(1) 传统观测性

传统的可观测性方法通常基于以下原则:

  • 代理和代理集成 — 在目标系统中安装代理,代理负责收集和传输遥测数据。这通常需要在每个目标系统上部署代理,而且代理也需要进行版本控制和维护。
  • 度量指标集成 — 需要配置和管理度量和日志指标的集成。这通常涉及到手动配置和更新,以确保适当的指标和日志数据被采集。
  • 额外的开销 — 代理需要在目标系统上运行,这可能会引入额外的开销,例如CPU和内存消耗。
  • 局限性 — 传统的可观测性方法可能会受到系统复杂性和性能问题的限制,因为它们可能无法实时捕获足够的数据。
  • 安全性 — 代理可能会引入潜在的安全风险,因为它们在目标系统上运行并访问敏感数据。

(2) eBPF可观测性

与传统观测性方法相比,eBPF可观测性具有以下优势:

  • 内核级别的可观测性 — eBPF程序在内核级别运行,可以观察系统的内部状态和事件,无需在目标系统上运行代理。
  • 轻量级 — eBPF程序通常对系统资源的开销很小,因为它们在内核级别运行,无需独立的代理。
  • 安全性 — eBPF程序受到内核验证器的强制约束,以确保它们不会引入安全风险。
  • 灵活性 — eBPF程序可以在运行时动态附加到系统中,无需重新启动目标系统,从而提供了更大的灵活性和可伸缩性。
  • 性能 — eBPF程序通常以本机机器指令运行,因此性能很高,可以实时捕获大量数据。

尽管eBPF可观测性具有许多优势,但它也具有一些挑战和限制。首先,eBPF编程需要一定的学习曲线,因为它涉及到特定的编程模型和语言。此外,某些高级用例可能需要更复杂的eBPF程序。

未来展望

eBPF可观测性已经取得了巨大的进展,但仍有很多潜在的未来发展方向。

  • 更多的工具和库 — 随着eBPF的流行,可以预期会有更多的工具和库出现,用于简化eBPF程序的开发、调试和部署。
  • 标准化 — 随着eBPF的广泛应用,可以期待出现更多的标准和最佳实践,以帮助开发人员更轻松地使用eBPF进行可观测性。
  • 更广泛的集成 — eBPF将继续集成到各种云计算和容器平台中,以帮助用户监控和调试分布式应用程序。
  • 更多的可观测性用例 — 随着eBPF技术的不断发展,可以预期将出现更多的创新可观测性用例,帮助用户更好地了解和优化其应用程序和基础设施的性能。

总之,eBPF可观测性是一个充满潜力的领域,已经取得了令人印象深刻的进展。它提供了一种强大而灵活的方式来观察和监视应用程序和基础设施的行为,有望在未来继续发展和成熟。对于那些希望更好地了解和控制其系统的用户来说,eBPF可观测性是一个令人兴奋的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1119351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SystemVerilog Assertions应用指南 Chapter 1.17使用参数的SVA检验器

1.17使用参数的SVA检验器 SVA允许像 Verilog那样在检验器中使用参数( parameter),这为创建可重用的属性提供了很大的灵活性。比如,两个信号间的延迟信息可以在检验器中用参数表示,那么这种检验器就可以在设计只有时序关系不同的情况中重用。例子1.2显示了个带延迟默…

【C++】一些C++11特性

C特性 1. 列表初始化1.1 {}初始化1.2 initializer_list 2. 声明2.1 auto2.2 typeid2.3 decltype2.4 nullptr 3. STL3.1 新容器3.2 新接口 4. 右值引用5. 移动构造与移动赋值6. lambda表达式7. 可变参数模板8. 包装器9. bind 1. 列表初始化 1.1 {}初始化 C11支持所有内置类型和…

Spring中自定义类型转换器

目录 一、什么是类型转换器 二、自定义类型转化器 2.1 实现Converter接口 2.2 在Spring中注册 三、自定义类型转换器中的细节 3.1 解决代码的耦合 3.2 注册标签id值必须唯一 ​3.3 Spring提供的日期转换器 一、什么是类型转换器 在Spring中类型转换器就是将配置文件中的字符串…

力扣一.链表的运用

一.合并生序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 输入:l1 = [], l2 = [] 输出:[] 输入:l1 = [], l2 = [0] 输出:[0]提示: 两个链表的…

【【萌新的FPGA学习之管脚设定xdc文件】】

萌新的FPGA学习之管脚设定xdc文件 xdc文件可以自己设置 也可以匹配 我们根据正点原子的流水灯管脚设定 主要讲述一下 各个英文设计是什么意思 Name:工程中顶层端口的名称。 Direction:说明管脚是输入还是输出。 Neg Diff Pair:负差分对&…

YOLOv5/v7/v8改进实验(三)之训练技巧篇

🚀🚀 前言 🚀🚀 YOLO系列是一种目标检测算法,具有高效的实时性能和较高的准确性。一些常用的YOLO训练技巧往往可以帮助提高模型的性能和收敛速度。而这些技巧在YOLOv5、YOLOv7和YOLOv8几乎通用。 🔥&#…

CUDA编程入门系列(十一)CUDA程序优化技巧

优化原则:最大化并行执行 探索并行化: 优化线程块的规模 我们在设计CUDA程序的时候,要对线程块的个数进行考虑。因为GPU中流处理器SM的数量是相对固定的,所以我们应该尽量的将多个block放到同一个SM当中(至少保证每个…

三、信号与槽

1. 信号槽的定义 信号函数和槽函数是Qt在C的基础上新增的功能,功能是实现对象之间的通信。 实现信号槽需要有两个先决条件: 通信的对象必须是从QObject派生出来的 QObject是Qt所有类的基类。 类中要有Q_OBJECT宏 2. 信号槽的使用 2.1 函数原型 最常…

免费SSL证书:JoySSL让您的网站更安全

在今天的数字化时代,保护网站和用户信息的安全至关重要。SSL(Secure Sockets Layer)证书通过加密网站与用户之间的通信,确保数据传输的安全性。让您拥有一个SSL加密的网站是至关重要的,但您可能会担心高昂的费用。不过…

秦丝科技“羽”深大计软学院同行,共庆深圳大学成立40周年

2023年10月21日, 由深圳大学工会主办 , 深圳大学体育学院 、深圳大学后勤部、丽湖校区管委会等单位协办的深圳大学2023年教职工羽毛球联赛-第一场正式举办; 由深圳市秦丝科技有限公司联合头部商户共同赞助的计算机与软件学院取得首场胜利&…

花生好车基于 KubeSphere 的微服务架构实践

公司简介 花生好车成立于 2015 年 6 月,致力于打造下沉市场汽车出行解决方案第一品牌。通过自建直营渠道,瞄准下沉市场,现形成以直租、批售、回租、新能源汽车零售,四大业务为核心驱动力的汽车新零售平台,目前拥有门店…

java基础--transient关键字减少序列化

前置内容 1.序列化 今天在看ArrayList源码的时候看到了这个,我之前应该是看过的,但是忘记了。现在在总结一下。 transient 用在类的属性上,不能修饰其他的。 作用:在序列化的时候transient修饰的属性不能被序列化 用途 在一些…

力扣:盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不能倾斜容器。 …

【公众号开发】图像文字识别 · 模板消息推送 · 素材管理 · 带参数二维码的生成与事件的处理

【公众号开发】(4) 文章目录 【公众号开发】(4)1. 图像文字识别功能1.1 百度AI图像文字识别接口申请1.2 查看文档学习如何调用百度AI1.3 程序开发1.3.1 导入依赖:1.3.2 公众号发来post请求格式1.3.3 对image类型的消息…

【JavaEE】synchronized原理 -- 多线程篇(6)

synchronized原理 1. synchronized具体采用了哪些加锁策略?2. synchronized内部实现策略(内部原理)2.1 偏向锁2.2 轻量级锁与重量级锁 3. synchronized 的其它优化策略3.1 锁消除3.2 锁的粒度 4. 总结 1. synchronized具体采用了哪些加锁策略? synchronized既是悲观锁, 也是…

Power BI 傻瓜入门 4. Power BI:亮点

本章内容包含: 在Power BI Desktop上学习诀窍摄入数据使用模型试用Power BI服务 就像评估一个由多种成分组成的蛋糕一样,Power BI要求其用户熟悉商业智能(BI)解决方案中的功能。几乎所有与Power BI交互的用户都是从桌面版开始的…

Locust负载测试工具实操

本中介绍如何使用Locust为开发的服务/网站执行负载测试。 Locust 是一个开源负载测试工具,可以通过 Python 代码构造来定义用户行为,避免混乱的 UI 和臃肿的 XML 配置。 步骤 设置Locust。 在简单的 HTTP 服务上模拟基本负载测试。 准备条件 Python…

2021年03月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python编程(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 下列代码的输出结果是?( ) x 0x10print(x)A:2 B:8 C&#xff…

NeurIPS 23 Spotlight丨3D-LLM:将3D世界注入大语言模型

来源:投稿 作者:橡皮 编辑:学姐 论文链接:https://arxiv.org/pdf/2307.12981.pdf 开源代码:https://vis-www.cs.umass.edu/3dllm/ 摘要: 大型语言模型 (LLM) 和视觉语言模型 (VLM) 已被证明在多项任务上…