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

浅析eBPF

目录

一、eBPF 原理

二、eBPF 已可投入使用的场景

三、eBPF 与 Jaeger/Zipkin 的区别及先进性

四、使用 eBPF 的开源软件

五、开源软件的局限性或待实现功能

猫哥说


一、eBPF 原理

eBPF (extended Berkeley Packet Filter) 是一种内核技术,允许用户在内核空间安全、高效地运行自定义程序,而无需修改内核代码或加载内核模块。

核心概念:

  1. BPF 虚拟机:内核中的一个轻量级虚拟机,负责执行 eBPF 程序。
  2. eBPF 程序:用户编写的、经过编译的字节码程序,可以在内核事件(如系统调用、网络事件、内核探针)发生时被触发执行。
  3. Maps:eBPF 程序与用户空间程序之间共享数据的机制,类似于键值对存储。
  4. Helper Functions:内核提供的一组函数,eBPF 程序可以通过这些函数访问内核功能和数据。
  5. Verifier:内核中的一个安全验证器,确保 eBPF 程序不会导致内核崩溃或安全漏洞。
  6. JIT Compiler:将 eBPF 字节码编译为本地机器码,提高执行效率。

工作流程:

  1. 用户编写 eBPF 程序(通常使用 C 语言)。
  2. 使用 LLVM/Clang 编译器将 eBPF 程序编译为 BPF 字节码。
  3. 通过 bpf() 系统调用将字节码加载到内核。
  4. Verifier 验证程序的安全性。
  5. JIT Compiler 将字节码编译为本地机器码(可选)。
  6. 将 eBPF 程序附加到内核事件(如 kprobes、tracepoints、网络接口等)。
  7. 当事件发生时,eBPF 程序被触发执行。
  8. eBPF 程序可以通过 Maps 与用户空间程序交换数据。

eBPF 的优势:

  • 安全:Verifier 确保 eBPF 程序不会破坏内核稳定性。
  • 高效:JIT 编译和内核态执行带来高性能。
  • 灵活:可以动态加载和卸载,无需重启内核或应用。
  • 可编程:用户可以自定义 eBPF 程序,实现各种功能。

二、eBPF 已可投入使用的场景

eBPF 在可观测性领域有广泛的应用:

  1. 网络性能监控

    • 监控网络流量、延迟、丢包率等。
    • 分析网络协议、识别性能瓶颈。
    • 实现自定义的网络策略。
  2. 系统调用跟踪

    • 跟踪应用的系统调用,分析系统调用频率、耗时等。
    • 识别系统调用相关的性能问题。
  3. 内核探针(kprobes/uprobes)

    • 在内核函数或用户空间函数入口/出口处插入探针,收集函数参数、返回值、执行时间等信息。
    • 用于性能分析、故障排查。
  4. 跟踪点(tracepoints)

    • 利用内核中预定义的跟踪点,收集内核事件信息。
    • 用于性能分析、故障排查。
  5. 安全监控

    • 监控系统调用、网络事件等,检测异常行为。
    • 实现入侵检测、安全审计等功能。
  6. 容器监控

    • 监控容器的网络流量、资源使用情况等。
    • 实现容器隔离和安全策略。
  7. 应用性能监控(APM)

    • 通过 uprobes 跟踪用户空间函数,收集应用性能数据。
    • 与传统的 APM 相比,eBPF 具有更低的开销和更高的灵活性。

三、eBPF 与 Jaeger/Zipkin 的区别及先进性

区别:

  • Jaeger/Zipkin:是分布式追踪系统,主要关注服务间的调用关系和延迟,通过在应用中埋点(instrumentation)来收集数据。
  • eBPF:是一种内核技术,可以在内核空间收集各种数据,包括网络、系统调用、内核事件等,也可以用于应用性能监控,但其应用范围更广。

先进性:

  1. 低开销:eBPF 在内核态执行,无需频繁的用户态/内核态切换,开销更低。
  2. 无需埋点:eBPF 可以通过 kprobes/uprobes 动态地收集数据,无需修改应用代码。
  3. 更全面的数据:eBPF 可以收集更底层的数据,如内核事件、系统调用等,而 Jaeger/Zipkin 主要关注服务间的调用。
  4. 安全性:eBPF 的 Verifier 机制确保了程序的安全性,不会影响内核稳定性。
  5. 动态性:eBPF 程序可以动态加载和卸载,无需重启应用或内核。

总结:eBPF 是一种更底层、更通用、更安全的技术,可以用于实现更广泛的可观测性场景,包括 Jaeger/Zipkin 所关注的分布式追踪。

四、使用 eBPF 的开源软件

  1. BCC (BPF Compiler Collection)

    • 官网:GitHub - iovisor/bcc: BCC - Tools for BPF-based Linux IO analysis, networking, monitoring, and more
    • 解决的难题:提供了一组工具和库,简化 eBPF 程序的开发和部署。
    • 局限性:需要一定的 C 和 Python 编程基础。
  2. bpftrace

    • 官网:GitHub - bpftrace/bpftrace: High-level tracing language for Linux
    • 解决的难题:提供了一种高级的、声明式的语言,用于编写 eBPF 程序,简化了 eBPF 的使用。
    • 局限性:表达能力不如 BCC 强大,不适合复杂的 eBPF 程序。
  3. Cilium

    • 官网:Cilium - Cloud Native, eBPF-based Networking, Observability, and Security
    • 解决的难题:基于 eBPF 实现 Kubernetes 的网络、安全和可观测性。
    • 局限性:主要面向 Kubernetes 环境。
  4. Falco

    • 官网:Falco
    • 解决的难题:基于 eBPF 实现容器安全监控和威胁检测。
    • 局限性:主要面向容器安全。
  5. Katran

    • 官网:GitHub - facebookincubator/katran: A high performance layer 4 load balancer
    • 解决的难题:基于 eBPF 实现高性能的 L4 负载均衡器。
    • 局限性:主要面向网络负载均衡。
  6. Pixie

    • 官网:Kubernetes Monitoring, Application Debug Platform | Pixie
    • 解决的难题:基于 eBPF 实现 Kubernetes 应用的自动监控和调试。
    • 局限性:主要面向 Kubernetes 环境。
  7. Parca

    • 官网:Parca - Open Source infrastructure-wide continuous profiling
    • 解决的难题:基于 eBPF 实现持续性能分析(Continuous Profiling)。
    • 局限性:主要面向性能分析。

五、开源软件的局限性或待实现功能

  1. eBPF 学习曲线陡峭:eBPF 技术本身有一定的学习门槛,需要掌握内核、C 语言、BPF 虚拟机等知识。
  2. eBPF 程序开发调试困难:eBPF 程序的开发和调试不如用户态程序方便。
  3. eBPF 安全性挑战:虽然 Verifier 机制可以防止大部分安全问题,但仍需谨慎编写 eBPF 程序,避免潜在的安全漏洞。
  4. eBPF 与应用集成的挑战:将 eBPF 收集的数据与应用层面的指标、日志、调用链关联起来,需要一定的集成工作。
  5. eBPF 标准化:eBPF 相关的工具和库仍在快速发展中,缺乏统一的标准。

待实现功能:

  1. 更友好的 eBPF 开发工具:提供更高级的语言、更强大的调试工具、更完善的文档,降低 eBPF 的使用门槛。
  2. 更丰富的 eBPF 程序库:提供更多预定义的 eBPF 程序,覆盖更多的可观测性场景。
  3. eBPF 与 OpenTelemetry 的集成:将 eBPF 收集的数据与 OpenTelemetry 标准集成,实现更全面的可观测性。
  4. eBPF 在安全领域的应用:进一步探索 eBPF 在安全领域的应用,如入侵检测、漏洞利用检测等。
  5. eBPF 在边缘计算的应用:将 eBPF 应用于边缘计算场景,实现边缘设备的监控和管理。

猫哥说

eBPF 是一项强大的内核技术,在可观测性领域具有广阔的应用前景。虽然 eBPF 仍存在一些挑战,但随着技术的不断发展和社区的不断壮大,eBPF 将在可观测性领域发挥越来越重要的作用。

其实eBPF本身没有那么难,但是如果总是让工程师人员复用,以做简单项目为主,以酒量作为考察标准,搞不出来eBPF,让单子飞了,是再正常不过的事情!

相关文章:

浅析eBPF

目录 一、eBPF 原理 二、eBPF 已可投入使用的场景 三、eBPF 与 Jaeger/Zipkin 的区别及先进性 四、使用 eBPF 的开源软件 五、开源软件的局限性或待实现功能 猫哥说 一、eBPF 原理 eBPF (extended Berkeley Packet Filter) 是一种内核技术,允许用户在内核空间…...

HTML 基础 (快速入门)详细步骤和示例

目录 创建基本的 HTML 文件 添加内容到页面 页面布局与链接 HTML(超文本标记语言)是构建网页的基础技术,以下是 HTML 基础的详细步骤和示例: 创建基本的 HTML 文件 步骤一:新建文件 在本地计算机上选择一个合适的…...

力扣-动态规划-139 单词拆分

思路 dp数组定义:用wordDict数组可以完成不超过j的字符串的可能为dp[j]递推公式: tmp s.substr(j - wordDict[i].size(), wordDict[i].size()); dp[j] (dp[j - wordDict[i].size()] && wordDict[i] tmp) || dp[j]; dp数组初始化:…...

建筑能耗监测系统数据采集装置 物联网网关功能参数介绍

安科瑞刘鸿鹏 摘要 随着物联网(IoT)技术的迅猛发展,现代物联网系统的规模和复杂度不断增加,各种智能设备和传感器的广泛应用为数据采集和分析提供了丰富的信息源。然而,面对不同协议、标准和通信方式的设备&#xff…...

vue深拷贝:1、使用JSON.parse()和JSON.stringify();2、使用Lodash库;3、使用深拷贝函数(采用递归的方式)

文章目录 引言三种方法的优缺点在Vue中,实现数组的深拷贝I JSON.stringify和 JSON.parse的小技巧深拷贝步骤缺点:案例1:向后端请求路由数据案例2: 表单数据处理时复制用户输入的数据II 使用Lodash库步骤适用于复杂数据结构和需要处理循环引用的场景III 自定义的深拷贝函数(…...

ES 删除index 的curl

以下是使用 `curl` 命令删除 Elasticsearch 索引的格式和示例: ### 基本格式 ```bash curl -XDELETE "http://<node-ip|hostname>:9200/<index-name>" ``` - `<node-ip|hostname>`:Elasticsearch 节点的 IP 地址或主机名。 - `<index-name&g…...

游戏引擎学习第124天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾/复习 今天是继续完善和调试多线程的任务队列。之前的几天&#xff0c;我们已经介绍了多线程的一些基础知识&#xff0c;包括如何创建工作队列以及如何在线程中处理任务。今天&#xff0c;重点是解决那些我们之前没有注意到…...

第十四届蓝桥杯Scratch11月stema选拔赛真题——小猫照镜子

编程实现&#xff1a; 小猫照镜子。(背景非源素材) 具体要求&#xff1a; 1). 运行程序&#xff0c;角色、背景如图所示&#xff1b; 完整题目可点击下方链接查看&#xff0c;支持在线编程~ 小猫照镜子_scratch_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/s…...

使用vscode导出Markdown的PDF无法显示数学公式的问题

我的硬件环境是M2的MacBook air&#xff0c;在vscode中使用了Markdown PDF来导出md文件对应的PDF。但不管导出html还是PDF文件&#xff0c;数学公式都是显示的源代码。 我看了许多教程&#xff0c;给的是这个方法&#xff1a;在md文件对应的html文件中加上以下代码&#xff1a…...

前端系列之:Blob

Blob 与二进制 什么是二进制&#xff1f; 二进制是计算机数据的基本表示形式&#xff0c;只使用 0 和 1 两个数字来表示数值。任何类型的数据&#xff08;无论是文本、图片、音频文件等&#xff09;都可以通过二进制表示。 什么是 Blob&#xff1f; 全称 Binary Large Object&a…...

【项目管理】基于 C 语言的 QQ 聊天室实现(TCP + 多线程 + SQLite3)

基于 C 语言的 QQ 聊天室(TCP + 多线程 + SQLite3) 项目功能基础功能: 登录、注册、添加好友、私聊、创建群聊、群聊扩展功能: 删除好友、注销账号、好友在线状态、群管理(拉人/踢人)、VIP 特权、邮件通知等 功能介绍:模拟QQ聊天客户端:登录界面:1、登录2、注册 //将用…...

Apache Flink:实时数据流处理的终极武器

Apache Flink&#xff1a;实时数据流处理的终极武器 在当今这个数据驱动的世界&#xff0c;实时数据流处理已经成为各行各业的核心需求。从金融风控到电商推荐&#xff0c;从物联网监控到网络安全&#xff0c;毫秒级的响应能力决定了一家公司在市场中的竞争力。而在众多流式计…...

点云处理入门--PointNetPointNet++论文与代码详解

基础知识 点云数据&#xff1a; 点云是一种通过三维扫描设备或计算机图形学技术获取的三维空间数据&#xff0c;通常由一系列点组成&#xff0c;每个点包含其在三维空间中的坐标&#xff08;如 x,y,z&#xff09;&#xff0c;有时还可能包含颜色、强度等附加信息。 介绍几种常…...

通过Nginx负载均衡+Keepalived实现业务高可用

通过Nginx负载均衡和Keepalived可以实现业务的高可用&#xff0c;以下是详细的实现步骤&#xff1a; 环境准备 假设我们有3台服务器&#xff0c;IP地址分别为&#xff1a; 服务器1&#xff08;Nginx Keepalived 主节点&#xff09;&#xff1a;192.168.1.100服务器2&#x…...

Spark技术系列(三):Spark算子全解析——从基础使用到高阶优化

Spark技术系列(三):Spark算子全解析——从基础使用到高阶优化 1. 算子核心概念与分类体系 1.1 算子本质解析 延迟执行机制:转换算子构建DAG,行动算子触发Job执行任务并行度:由RDD分区数决定(可通过spark.default.parallelism全局配置)执行位置优化:基于数据本地性的…...

ES6模块化详解:导入与导出方式

在现代 JavaScript 开发中&#xff0c;模块化是代码管理和组织的重要工具。ES6&#xff08;ECMAScript 2015&#xff09;引入了模块化的概念&#xff0c;通过 import 和 export 来组织代码&#xff0c;使得模块的管理变得更加清晰和简洁。本文将详细介绍 ES6 中的各种模块导入导…...

每日学习Java之一万个为什么?[MySQL面试篇]

分析SQL语句执行流程中遇到的问题 前言1 MySQL是怎么在一台服务器上启动的2 MySQL主库和从库是同时启动保持Alive的吗&#xff1f;3 如果不是主从怎么在启动的时候保证数据一致性4 ACID原则在MySQL上的体现5 数据在MySQL是通过什么DTO实现的6 客户端怎么与MySQL Server建立连接…...

常用空间数据结构对比

空间数据结构是用来组织和查询多维空间数据的算法结构。它们在地理信息系统 (GIS)、计算机图形学、机器人导航、机器学习等领域非常重要。以下是几种常见空间数据结构的对比&#xff1a; 1. 四叉树&#xff08;Quadtree&#xff09; 适用场景&#xff1a;二维空间数据&#x…...

AnythingLLM+LM Studio本地知识库构建

前置操作&#xff1a; 已经安装以下软件&#xff0c;并配置后&#xff1a; DeepSeek-R1-Distill-Llama-8B-Q4_K_M.ggufLM-Studio-0.3.10-6-x64 软件准备&#xff1a; 下载AnythingLLM&#xff1a;AnythingLLM | The all-in-one AI application for everyone 点击"Dow…...

使用 Java 更新 Word 文档中的图表数据-超详细

使用 Java 更新 Word 文档中的图表数据 在日常的工作中&#xff0c;尤其是在数据分析和报告自动化的场景中&#xff0c;可能会遇到需要定期更新 Word 文档中的图表数据的需求。比如&#xff0c;生成数据报告时&#xff0c;我们需要在图表中更新一些动态的数据值。今天&#xf…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...