浅析eBPF
目录
一、eBPF 原理
二、eBPF 已可投入使用的场景
三、eBPF 与 Jaeger/Zipkin 的区别及先进性
四、使用 eBPF 的开源软件
五、开源软件的局限性或待实现功能
猫哥说
一、eBPF 原理
eBPF (extended Berkeley Packet Filter) 是一种内核技术,允许用户在内核空间安全、高效地运行自定义程序,而无需修改内核代码或加载内核模块。
核心概念:
- BPF 虚拟机:内核中的一个轻量级虚拟机,负责执行 eBPF 程序。
- eBPF 程序:用户编写的、经过编译的字节码程序,可以在内核事件(如系统调用、网络事件、内核探针)发生时被触发执行。
- Maps:eBPF 程序与用户空间程序之间共享数据的机制,类似于键值对存储。
- Helper Functions:内核提供的一组函数,eBPF 程序可以通过这些函数访问内核功能和数据。
- Verifier:内核中的一个安全验证器,确保 eBPF 程序不会导致内核崩溃或安全漏洞。
- JIT Compiler:将 eBPF 字节码编译为本地机器码,提高执行效率。
工作流程:
- 用户编写 eBPF 程序(通常使用 C 语言)。
- 使用 LLVM/Clang 编译器将 eBPF 程序编译为 BPF 字节码。
- 通过
bpf()
系统调用将字节码加载到内核。 - Verifier 验证程序的安全性。
- JIT Compiler 将字节码编译为本地机器码(可选)。
- 将 eBPF 程序附加到内核事件(如 kprobes、tracepoints、网络接口等)。
- 当事件发生时,eBPF 程序被触发执行。
- eBPF 程序可以通过 Maps 与用户空间程序交换数据。
eBPF 的优势:
- 安全:Verifier 确保 eBPF 程序不会破坏内核稳定性。
- 高效:JIT 编译和内核态执行带来高性能。
- 灵活:可以动态加载和卸载,无需重启内核或应用。
- 可编程:用户可以自定义 eBPF 程序,实现各种功能。
二、eBPF 已可投入使用的场景
eBPF 在可观测性领域有广泛的应用:
-
网络性能监控:
- 监控网络流量、延迟、丢包率等。
- 分析网络协议、识别性能瓶颈。
- 实现自定义的网络策略。
-
系统调用跟踪:
- 跟踪应用的系统调用,分析系统调用频率、耗时等。
- 识别系统调用相关的性能问题。
-
内核探针(kprobes/uprobes):
- 在内核函数或用户空间函数入口/出口处插入探针,收集函数参数、返回值、执行时间等信息。
- 用于性能分析、故障排查。
-
跟踪点(tracepoints):
- 利用内核中预定义的跟踪点,收集内核事件信息。
- 用于性能分析、故障排查。
-
安全监控:
- 监控系统调用、网络事件等,检测异常行为。
- 实现入侵检测、安全审计等功能。
-
容器监控:
- 监控容器的网络流量、资源使用情况等。
- 实现容器隔离和安全策略。
-
应用性能监控(APM):
- 通过 uprobes 跟踪用户空间函数,收集应用性能数据。
- 与传统的 APM 相比,eBPF 具有更低的开销和更高的灵活性。
三、eBPF 与 Jaeger/Zipkin 的区别及先进性
区别:
- Jaeger/Zipkin:是分布式追踪系统,主要关注服务间的调用关系和延迟,通过在应用中埋点(instrumentation)来收集数据。
- eBPF:是一种内核技术,可以在内核空间收集各种数据,包括网络、系统调用、内核事件等,也可以用于应用性能监控,但其应用范围更广。
先进性:
- 低开销:eBPF 在内核态执行,无需频繁的用户态/内核态切换,开销更低。
- 无需埋点:eBPF 可以通过 kprobes/uprobes 动态地收集数据,无需修改应用代码。
- 更全面的数据:eBPF 可以收集更底层的数据,如内核事件、系统调用等,而 Jaeger/Zipkin 主要关注服务间的调用。
- 安全性:eBPF 的 Verifier 机制确保了程序的安全性,不会影响内核稳定性。
- 动态性:eBPF 程序可以动态加载和卸载,无需重启应用或内核。
总结:eBPF 是一种更底层、更通用、更安全的技术,可以用于实现更广泛的可观测性场景,包括 Jaeger/Zipkin 所关注的分布式追踪。
四、使用 eBPF 的开源软件
-
BCC (BPF Compiler Collection)
- 官网:GitHub - iovisor/bcc: BCC - Tools for BPF-based Linux IO analysis, networking, monitoring, and more
- 解决的难题:提供了一组工具和库,简化 eBPF 程序的开发和部署。
- 局限性:需要一定的 C 和 Python 编程基础。
-
bpftrace
- 官网:GitHub - bpftrace/bpftrace: High-level tracing language for Linux
- 解决的难题:提供了一种高级的、声明式的语言,用于编写 eBPF 程序,简化了 eBPF 的使用。
- 局限性:表达能力不如 BCC 强大,不适合复杂的 eBPF 程序。
-
Cilium
- 官网:Cilium - Cloud Native, eBPF-based Networking, Observability, and Security
- 解决的难题:基于 eBPF 实现 Kubernetes 的网络、安全和可观测性。
- 局限性:主要面向 Kubernetes 环境。
-
Falco
- 官网:Falco
- 解决的难题:基于 eBPF 实现容器安全监控和威胁检测。
- 局限性:主要面向容器安全。
-
Katran
- 官网:GitHub - facebookincubator/katran: A high performance layer 4 load balancer
- 解决的难题:基于 eBPF 实现高性能的 L4 负载均衡器。
- 局限性:主要面向网络负载均衡。
-
Pixie
- 官网:Kubernetes Monitoring, Application Debug Platform | Pixie
- 解决的难题:基于 eBPF 实现 Kubernetes 应用的自动监控和调试。
- 局限性:主要面向 Kubernetes 环境。
-
Parca
- 官网:Parca - Open Source infrastructure-wide continuous profiling
- 解决的难题:基于 eBPF 实现持续性能分析(Continuous Profiling)。
- 局限性:主要面向性能分析。
五、开源软件的局限性或待实现功能
- eBPF 学习曲线陡峭:eBPF 技术本身有一定的学习门槛,需要掌握内核、C 语言、BPF 虚拟机等知识。
- eBPF 程序开发调试困难:eBPF 程序的开发和调试不如用户态程序方便。
- eBPF 安全性挑战:虽然 Verifier 机制可以防止大部分安全问题,但仍需谨慎编写 eBPF 程序,避免潜在的安全漏洞。
- eBPF 与应用集成的挑战:将 eBPF 收集的数据与应用层面的指标、日志、调用链关联起来,需要一定的集成工作。
- eBPF 标准化:eBPF 相关的工具和库仍在快速发展中,缺乏统一的标准。
待实现功能:
- 更友好的 eBPF 开发工具:提供更高级的语言、更强大的调试工具、更完善的文档,降低 eBPF 的使用门槛。
- 更丰富的 eBPF 程序库:提供更多预定义的 eBPF 程序,覆盖更多的可观测性场景。
- eBPF 与 OpenTelemetry 的集成:将 eBPF 收集的数据与 OpenTelemetry 标准集成,实现更全面的可观测性。
- eBPF 在安全领域的应用:进一步探索 eBPF 在安全领域的应用,如入侵检测、漏洞利用检测等。
- 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)技术的迅猛发展,现代物联网系统的规模和复杂度不断增加,各种智能设备和传感器的广泛应用为数据采集和分析提供了丰富的信息源。然而,面对不同协议、标准和通信方式的设备ÿ…...
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 回顾/复习 今天是继续完善和调试多线程的任务队列。之前的几天,我们已经介绍了多线程的一些基础知识,包括如何创建工作队列以及如何在线程中处理任务。今天,重点是解决那些我们之前没有注意到…...

第十四届蓝桥杯Scratch11月stema选拔赛真题——小猫照镜子
编程实现: 小猫照镜子。(背景非源素材) 具体要求: 1). 运行程序,角色、背景如图所示; 完整题目可点击下方链接查看,支持在线编程~ 小猫照镜子_scratch_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/s…...

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

前端系列之:Blob
Blob 与二进制 什么是二进制? 二进制是计算机数据的基本表示形式,只使用 0 和 1 两个数字来表示数值。任何类型的数据(无论是文本、图片、音频文件等)都可以通过二进制表示。 什么是 Blob? 全称 Binary Large Object&a…...

【项目管理】基于 C 语言的 QQ 聊天室实现(TCP + 多线程 + SQLite3)
基于 C 语言的 QQ 聊天室(TCP + 多线程 + SQLite3) 项目功能基础功能: 登录、注册、添加好友、私聊、创建群聊、群聊扩展功能: 删除好友、注销账号、好友在线状态、群管理(拉人/踢人)、VIP 特权、邮件通知等 功能介绍:模拟QQ聊天客户端:登录界面:1、登录2、注册 //将用…...
Apache Flink:实时数据流处理的终极武器
Apache Flink:实时数据流处理的终极武器 在当今这个数据驱动的世界,实时数据流处理已经成为各行各业的核心需求。从金融风控到电商推荐,从物联网监控到网络安全,毫秒级的响应能力决定了一家公司在市场中的竞争力。而在众多流式计…...

点云处理入门--PointNetPointNet++论文与代码详解
基础知识 点云数据: 点云是一种通过三维扫描设备或计算机图形学技术获取的三维空间数据,通常由一系列点组成,每个点包含其在三维空间中的坐标(如 x,y,z),有时还可能包含颜色、强度等附加信息。 介绍几种常…...
通过Nginx负载均衡+Keepalived实现业务高可用
通过Nginx负载均衡和Keepalived可以实现业务的高可用,以下是详细的实现步骤: 环境准备 假设我们有3台服务器,IP地址分别为: 服务器1(Nginx Keepalived 主节点):192.168.1.100服务器2&#x…...
Spark技术系列(三):Spark算子全解析——从基础使用到高阶优化
Spark技术系列(三):Spark算子全解析——从基础使用到高阶优化 1. 算子核心概念与分类体系 1.1 算子本质解析 延迟执行机制:转换算子构建DAG,行动算子触发Job执行任务并行度:由RDD分区数决定(可通过spark.default.parallelism全局配置)执行位置优化:基于数据本地性的…...
ES6模块化详解:导入与导出方式
在现代 JavaScript 开发中,模块化是代码管理和组织的重要工具。ES6(ECMAScript 2015)引入了模块化的概念,通过 import 和 export 来组织代码,使得模块的管理变得更加清晰和简洁。本文将详细介绍 ES6 中的各种模块导入导…...
每日学习Java之一万个为什么?[MySQL面试篇]
分析SQL语句执行流程中遇到的问题 前言1 MySQL是怎么在一台服务器上启动的2 MySQL主库和从库是同时启动保持Alive的吗?3 如果不是主从怎么在启动的时候保证数据一致性4 ACID原则在MySQL上的体现5 数据在MySQL是通过什么DTO实现的6 客户端怎么与MySQL Server建立连接…...
常用空间数据结构对比
空间数据结构是用来组织和查询多维空间数据的算法结构。它们在地理信息系统 (GIS)、计算机图形学、机器人导航、机器学习等领域非常重要。以下是几种常见空间数据结构的对比: 1. 四叉树(Quadtree) 适用场景:二维空间数据&#x…...

AnythingLLM+LM Studio本地知识库构建
前置操作: 已经安装以下软件,并配置后: DeepSeek-R1-Distill-Llama-8B-Q4_K_M.ggufLM-Studio-0.3.10-6-x64 软件准备: 下载AnythingLLM:AnythingLLM | The all-in-one AI application for everyone 点击"Dow…...
使用 Java 更新 Word 文档中的图表数据-超详细
使用 Java 更新 Word 文档中的图表数据 在日常的工作中,尤其是在数据分析和报告自动化的场景中,可能会遇到需要定期更新 Word 文档中的图表数据的需求。比如,生成数据报告时,我们需要在图表中更新一些动态的数据值。今天…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...