当前位置: 首页 > 网络应用技术

EBPF |您必须知道的7个核心问题

时间:2023-03-08 23:04:20 网络应用技术

  简介:在过去的一年中,ARMS基于EBPF技术创建了Kubernetes监视,提供了多语言应用程序性能,系统性能,网络性能观察能力,并验证EBPF技术的有效性。EBPF技术和生态发展非常好。将来,作为该技术的实践者,本文的目标是通过回答7个核心问题来解决所有人的EBPF面纱,从而介绍EBPF技术本身。

  作者|YAN XUN来源|阿里开发人员公共帐户

  在过去的一年中,ARMS创建了基于EBPF技术的Kubernetes监视,该技术提供了多语言应用程序性能,系统性能,网络性能观察能力,并验证EBPF技术的有效性。EBPF技术和生态发展非常好。将来,作为该技术的实践者,本文的目标是通过回答7个核心问题来解决所有人的EBPF面纱,从而介绍EBPF技术本身。

  EBPF是一项可以在内核中运行沙盒程序的技术。它提供了一种机制,可以在内核事件和用户程序事件发生时安全地注入代码,以便非核心开发人员还可以控制内核。随着内核的开发,EBPF逐渐从初始数据包过滤到网络,逐渐扩展内核,安全性,跟踪等,其功能特性仍在迅速发展。早期的BPF称为经典BPF,称为CBPF,正是CBPF。此功能扩展使当前的BPF称为扩展BPF,称为EBPF。

  网络优化EBPF具有高性能和高可扩展性特性,使其成为网络解决方案中网络包处理的首选解决方案:

  JIT编译器提供了几乎内核本地代码的执行效率。

  在内核的背景下,可以快速增加协议分析和路由策略。

  通过Kprobe诊断EBPF失败,跟踪点跟踪机制具有内核和用户跟踪功能。这种末端 - 到端跟踪能力可以快速诊断故障诊断。在相同的临时传统系统中,需要透露大量的抽样数据,从而可以继续实时旋转。

  安全控制EBPF可以看到所有系统调用,所有网络数据包和套接字网络操作,上下文跟踪组合的集成组合,网络操作级别过滤,系统调用和过滤,这可以更好地提供安全控制。

  与传统的系统监视组件(例如SAR)相比,性能监控只能提供静态计数器和仪表。EBPF支持用于编程和边缘计算的编程指标和事件。

  EBPF的出现本质上是解决较慢的内核迭代和系统需求的快速变化的矛盾。与Linux内核相比,EBPF字段中常用的一个示例是,与HTML相比,EBPF与JavaScript相对于HTML的示例相似。从类似地说,程序化支持通常带来一些新问题。例如,内核模块实际上是为了解决这个问题,但他没有提供良好的边界,这导致内核模块的内核版本需要进行调整。EBPF使用以下策略使其成为安全有效的内核编程技术:

  EBPF程序必须在通过验证设备通过后执行,并且不能包括无法达到的说明;EBPF程序无法随意调用内核函数,并且只能调用API中定义的辅助函数;如果要更大的存储,则必须使用映射存储。

  借助即时编译器(JIT),并且由于EBPF指令仍在内核中运行,因此它不需要将数据复制到用户,从而大大提高了事件处理的效率。

  通过BPF帮助者BTF,Perf Perf Map为开发人员提供标准接口和数据模型。

  EBPF不仅扩大了寄存器的数量,还引入了新的BPF映射存储,而且还逐渐扩展了4.x内核中原始的单个数据包过滤事件到内核函数,用户状态功能,跟踪点,性能事件(PERF_EVENTS)。以及安全控制和其他字段。

  5个步骤1.使用C语言开发EBPF程序;

  也就是说,触发桩时要调用的EBPF沙盒程序,并且该程序将在内核状态下运行。

  2.使用LLVM将EBPF程序编译为BPF字节码;

  EBPF程序被编译到BPF字节码中,以进行后续验证并在EBPF虚拟机中运行。

  3.通过BPF系统致电并将BPF字节码提交到内核;

  在用户模式下,BPF字节码通过BPF系统加载到内核。

  4.内核验证并运行BPF字节码,并将相应状态保存到BPF映射中;

  内核验证BPF字节码是安全的,并确保在发生相应事件时调用正确的EBPF程序。如果有状态,则需要保存它。如果需要保存,请将其写入相应的BPF映射中。例如,监视数据可以写在BPF映射中。

  5.用户程序通过BPF映射查询BPF字节码的运行状态。

  用户的态度通过查询BPF映射的内容,例如获得获得的监视数据,从而获得了字节码操作的状态。

  一个完整的EBPF程序通常包括两个部分:用户模式和内核状态:用户状态程序需要通过BPF系统调用与内核进行交互,然后完成诸如EBPF程序加载,事件安装,映射创建和更新之类的任务;,EBPF程序不能被任意称为内核函数,但是有必要通过BPF辅助函数完成所需的任务。尤其是在访问内存地址时,必须借助BPF_PROBE_READ系列函数读取内存数据,以确保内存的安全性和有效访问。当EBPF程序需要大量存储时,我们还需要根据应用程序方案引入特定类型的BPF映射,并在用户的帮助下使用它来提供用户空间程序中的数据太空程序。

  EBPF程序分类和使用情况

  以上命令可以查看系统支持的EBPF程序类型。通常有类型的类型:

  有关详细信息,请参阅https://elixir.bootlin.com/linux/v5.13/source/include/linux/bpf_types.h

  主要分为3个大使::

  TracePoint,kprobe,perf_event等主要用于从系统中提取跟踪信息,然后为监视,错误,性能优化等提供数据支持。

  XDP,SOCK_OPS,CGROUP_SOCK_ADDR,SK_MSG等主要用于过滤和处理网络数据包,从而实现了各种丰富的功能,例如网络观察,过滤,流量控制和性能优化。您可能会丢失数据包并重定向。

  纤毛基本上使用所有钩点。

  LSM,为了安全性,其他人也具有flow_dissector,LWT_IN不是很常用,也不会详细介绍。

  从以前的方法可以看出,找到内核的桩点。EBPF程序本身并不困难。困难是找到正确的事件来源来触发操作。对于监视和诊断领域,跟踪EBPF程序的事件的来源包含3个类别:内核功能(KproBe),内核跟踪点或性能事件。目前,有两个问题要回答:

  1.内核中有哪些内核功能,内核跟踪点或性能事件?

  sudo perf clast tracpoint

  2.对于内核函数和内核跟踪点,当这些数据结构需要跟踪其传递参数和返回值时,如何查询这些数据结构的定义格式?

  如何使用上述信息,请参阅BCC。

  找到应用程序的桩点1.如何查询用户流程的跟踪点?

  UPROBE基于文件。在跟踪文件中的功能时,除非过滤该过程PID,否则使用此文件的所有进程将默认插入。

  以上是静态编译语言。他类似于内核跟踪。应用程序的符号信息可以存储在精灵二进制文件中,也可以以单独的文件形式存储在调试文件中。在内核的二进制文件中,它也将以以下形式暴露于用户空间/proc/kallsyms和/sys/kernel/debug。

  对于非静态编译语言,有两种主要类型:

  1.解释语言

  使用类似汇编语言应用程序的跟踪点查询方法在口译员级别查询其UPROBE和USDT跟踪点。如何分析口译员级别行为和应用程序行为关联中的专家。

  2.即时编译语言

  此类语言的应用程序源代码将首先作为字节代码编译,然后将即时编译器(JIT)编译到机器代码。它也将被优化,很难跟踪。USDT跟踪只能在即时编译器上使用,最终应用程序的功能信息是从即时编译器的跟踪点参数中获得的。在即时编译器的后续点和应用程序应用之间的关系之间需要分析相关语言。

  您可以参考BCC应用程序跟踪,并且用户流程跟踪实质上是通过断点执行起伏的处理程序。尽管内核社区已经对BPF进行了大量的性能调整,从而跟踪用户的态度功能(尤其是高 - 尤其是高 -诸如锁定和内存分布之类的频率功能仍然可能带来大量的性能开销。因此,当我们使用Uprobe时,我们应该尝试避免跟踪高频功能。

  如何使用上述信息,请参阅:https://github.com/iovisor/bcc/blob/master/master/docs/reference_guide.md#events-rguments

  协会的理想状态和桩点是应清楚地观察到所有问题,但这要求技术人员了解末端 - 端的软件堆栈的细节。一个更合理的方法是第28定律。这将是第28个法律。它将是。核心80%的软件堆栈数据流已掌握,并保证该问题在此上下文中找到问题。在这次,使用内核堆栈和用户堆栈查看特定的调用堆栈以查找核心问题。例如,发现该网络丢失了,但是我不知道为什么它会丢失。目前,我们知道KFREE_SKB内核函数将被调用。然后我们可以通过:

  发现该功能的呼叫堆栈:

  然后,您可以返回上述功能,以查看他们在可以定位的条件下调用哪个功能以定位问题。这种方法不仅可以找到问题,而且可以加深对内核呼叫的理解,例如:

  您可以查看所有与网络相关的跟踪点及其呼叫堆栈。

  内核中的5个模块EBPF主要由5个模块合作:

  1. BPF验证者(验证设备)

  确保EBPF程序的安全性。验证设备将创建要执行的指令作为方向图(DAG),以确保程序不包括指令;然后模拟指令的执行过程,以确保不会执行指令。这里的验证设备不能保证100%的安全性,因此需要严格的监控和判断所有BPF程序。

  2. BPF JIT

  编译EBPF字节码以更有效地在内核中执行机器的成本。

  3.多个64位寄存器,程序计数器和由512个字节堆栈组成的存储模块

  用于控制EBPF程序的操作,保存堆栈数据并参与参与。

  4. BPF助手(辅助功能)

  提供了一系列与其他用于EBPF程序的模块交互的功能。这些功能在任何EBPF程序中都不可用。特定的可用功能集由BPF程序类型确定。注意EBPF中的所有参数必须符合BPF规范。除本地变量的更改外,BPF助手应完成其他更改。如果BPF帮助者不支持它,则无法修改。

  BPFTool功能探针

  通过上述命令,您可以看到哪些BPF帮助者可以运行不同类型的EBPF程序。

  5. BPF地图和上下文

  用户空间程序可以访问这些存储空间,以控制EBPF程序的运行状态。

  您可以看到哪种类型的地图支持系统通过上述命令支持。

  三个动作首先谈论重要系统致电BPF:

  这里CMD是关键。attr是CMD的参数。大小是参数大小,因此关键是查看什么是CMD:

  核心是前卫。与地图相关的CMD是程序加载和映射处理。

  1.程序负载

  调用BPF_PROG_LOAD CMD将将BPF程序加载到内核,但是EBPF程序不像常规线程。它是在启动后运行的,需要触发事件。这些事件包括系统呼叫,内核跟踪点,内核功能和用户 - 状态功能呼叫出口,网络事件等,因此需要第二个操作。

  2.伴随事件

  以上是将特定事件绑定到特定的BPF函数。实际实施原则如下:

  (1)在BPF系统调用的帮助下,加载BPF程序后,您会记住返回的文件描述符;

  (2)通过附件操作知道相应的功能类型事件编号;

  (3)创建perf_event_open以基于附件的返回值创建性能监视事件;

  (4)通过ioctl的perf_event_ioc_set_bpf命令将BPF程序绑定到性能监视事件。

  3.地图操作

  使用与地图相关的CMD,控制地图添加和删除,然后用户模式基于地图与内核状态进行交互。

  推荐建议> = 4.14

  生态生态学生态学从底部到顶部:如下:

  1.基础设施

  支持EBPF基本功能的发展。

  2.开发工具集

  它主要用于加载,编译和调试EBPF程序。有不同语言的开发工具集不同:

  3. EBPF应用程序

  提供一组开发工具和脚本。

  根据BCC,提供了脚本语言。

  网络优化和安全性

  网络安全

  高性能4层负载平衡

  观察

  观察

  观察

  计划BPFTRACE脚本

  在分布式环境中启动和管理EBPF程序的平台

  动态Linux跟踪

  Linux运行时的安全监控

  4.跟踪生态网站

  充分利用EBPF的前提是通过上面的简介了解软件堆栈。我相信每个人都对EBPF有足够的了解。EBPF仅提供框架和机制。适当的桩点可以与应用程序问题相关联。

  EBPF的杀手是全部覆盖范围,没有入侵,编程1.全面覆盖

  内核,全面覆盖应用桩点。

  2.没有入侵

  无需修改挂钩的任何代码。

  3.可编程

  输入EBPF程序,边缘动态执行指令和动态聚合分析。

  团队信息

  阿里巴巴云天文台,覆盖前端监视,应用程序监控,容器监控,Prometheus,链接跟踪,智能警报,操作和维护可视化等。观察解决方案和最佳实践。

  Alibaba Cloud Kubernetes监视是一种基于EBPF技术开发的不可侵入性可观察的产品,并为Kubernetes群集开发。它基于Kubernetes群集下的指标,应用链接,日志和事件。提供总体观察解决方案。

  简介:https://help.aliyun.com/document_detail/260777.html

  访问:https://help.aliyun.com/document_detail/251852.html

  基于云本机环境下无服务器体系结构的创新应用程序

  基于云本机环境下无服务器体系结构的创新应用程序

  单击此处查看详细信息。

  原始链接:http://click.aliyun.com/m/1000346074/

  本文是阿里巴巴云的原始内容,未经许可就无法重印。