可观测之Tracing-浅析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,让单子飞了,是再正常不过的事情!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云物联网获取设备属性api接口:QueryDevicePropertyData

阿里云物联网接口:QueryDevicePropertyData 说明:调用该接口查询指定设备或数字孪生节点,在指定时间段内,单个属性的数据 比如提取上传到物联网的温度数据 api文档:QueryDevicePropertyData_物联网平台_API文档-阿里…

算法系列之动态规划

动态规划(Dynamic Programming,简称DP)是一种用于解决复杂问题的算法设计技术。它通过将问题分解为更小的子问题,并存储这些子问题的解来避免重复计算,从而提高算法的效率。本文将介绍动态规划的基本概念、适用场景、复…

Linux系列:如何用 C#调用 C方法造成内存泄露

一:背景 1. 讲故事 好久没写文章了,还是来写一点吧,今年准备多写一点 Linux平台上的东西,这篇从 C# 调用 C 这个例子开始。在 windows 平台上,我们常常在 C 代码中用 extern "C" 导出 C风格 的函数&#x…

1.2.3 使用Spring Initializr方式构建Spring Boot项目

本实战概述介绍了如何使用Spring Initializr创建Spring Boot项目,并进行基本配置。首先,通过Spring Initializr生成项目骨架,然后创建控制器HelloController,定义处理GET请求的方法hello,返回HTML字符串。接着&#xf…

【音视频】H265解码Nalu后封装rtp包

概述 基于ZLM流媒体框架以及简单RTSP服务器开源项目分析总结,相关源码参考以下链接 H265-rtp提取Nalu逻辑 通过rtsp流地址我们可以获取视频流中的多个rtp包,其中每个RTP包中又会包含一个或者多个Nalu,将其提取处理 总体逻辑分析 核心逻辑在…

03.03 QT

1.在注册登录的练习里面&#xff0c;追加一个QListwidget 项目列表 要求:点击注册之后&#xff0c;将账号显示到 1istwidget上面去 以及&#xff0c;在listwidget中双击某个账号的时候&#xff0c;将该账号删除 Widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWi…

【星云 Orbit • STM32F4】04.一触即发:GPIO 外部中断

【星云 Orbit- • STM32F4】04. 一触即发&#xff1a;外部中断控制 摘要 本文详细介绍了如何使用STM32F407微控制器的HAL库实现外部中断功能。通过配置GPIO引脚作为外部中断源&#xff0c;并在中断回调函数中处理按键事件&#xff0c;实现了按键控制LED状态翻转的功能。本文旨…

(新版本onenet)stm32+esp8266/01s mqtt连接onenet上报温湿度和远程控制(含小程序)

物联网实践教程&#xff1a;微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总 前言 之前在学校获得了一个新玩意&#xff1a;ESP-01sWIFI模块&#xff0c;去搜了一下这个小东西很有玩点&#xff0c;远程控制LED啥的&#xff0c;然后我就想…

并发编程(线程基础)面试题及原理

1. 进程与线程 1.1 进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至CPU&#xff0c;数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的。 当一个程序被运…

基于开源库编写MQTT通讯

目录 1. MQTT是什么&#xff1f;2. 开发交互UI3. 服务器核心代码4. 客户端核心代码5. 消息订阅与发布6. 通讯测试7. MQTT与PLC通讯最后. 核心总结 1. MQTT是什么&#xff1f; MQTT&#xff08;Message Queuing Terlemetry Transport&#xff09;消息队列遥测协议&#xff1b;是…

vector习题

完数和盈数 题目 完数VS盈数_牛客题霸_牛客网 一个数如果恰好等于它的各因子(该数本身除外)之和&#xff0c;如&#xff1a;6321。则称其为“完数”&#xff1b;若因子之和大于该数&#xff0c;则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。 输入描述&#xff…

vscode通过ssh远程连接(linux系统)不能跳转问题

1.问题描述 unbantu中的vscode能够通过函数跳转到函数定义&#xff0c;而windows通过ssh连接unbantu的vscode却无法跳转 2.原因&#xff1a; 主要原因是这里缺少插件&#xff0c;这里是unbantu给主机的服务器&#xff0c;与ubantu本地vscode插件相互独立&#xff0c;能否跳转…

神经网络 - 激活函数(Swish函数、GELU函数)

一、Swish 函数 Swish 函数是一种较新的激活函数&#xff0c;由 Ramachandran 等人在 2017 年提出&#xff0c;其数学表达式通常为 其中 σ(x) 是 Sigmoid 函数&#xff08;Logistic 函数&#xff09;。 如何理解 Swish 函数 自门控特性 Swish 函数可以看作是对输入 x 进行“…

安全运营的“黄金4小时“:如何突破告警疲劳困局

在当今复杂多变的网络安全环境中&#xff0c;安全团队面临着前所未有的挑战。尤其是面对高级持续性威胁&#xff08;APT&#xff09;时&#xff0c;最初的“黄金4小时”成为决定成败的关键窗口。在这段时间内&#xff0c;快速而准确地响应可以极大地降低损失&#xff0c;然而&a…

【Pytest】setup和teardown的四个级别

文章目录 1.setup和teardown简介2.模块级别的 setup 和 teardown3.函数级别的 setup 和 teardown4.方法级别的 setup 和 teardown5.类级别的 setup 和 teardown 1.setup和teardown简介 在 pytest 中&#xff0c;setup 和 teardown 用于在测试用例执行前后执行一些准备和清理操…

傅里叶分析

傅里叶分析之掐死教程&#xff08;完整版&#xff09;更新于2014.06.06 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析不仅仅是一个数学工具&#xff0c;更是一种可以彻底颠覆一个人以前世界观的思维模式。但不幸的是&#xff0c;傅里叶分析的公式看起来太复…

matlab 四维数据可视化(已解决)

虽然这不是传统意义上的“4维可视化”&#xff0c;但你可以通过在三维空间中表示两个维度来间接展示4维数据。例如&#xff0c;你可以使用颜色来表示第四个维度。 clc clear close all% 假设X, Y, Z为你的三维数据&#xff0c;C为第四维数据 X rand(100, 1); Y rand(100, 1);…

MAC 本地搭建部署 dify(含 github访问超时+Docker镜像源拉取超时解决方案)

目录 一、什么是 dify&#xff1f; 二、安装 docker 1. 什么是 docker&#xff1f; 2. docker下载地址 三、安装 dify 1. dify下载地址 2.可能遇到问题一&#xff1a; github访问超时 3.下载后完成解压 4.进入到 cmd 终端环境&#xff0c;执行下面三个命令 5.可能遇到…

rustup-init.exe 安装缓慢的解决办法

首先在rust官网下载安装程序&#xff0c;官网下载的 rustup-init.exe 下载慢&#xff0c;安装慢&#xff0c;或者直接卡死。 下载安装程序在本地&#xff0c;使用国内镜像加速 Rust 更新与下载。 使用国内镜像源&#xff1a;在 rustup-init.exe 程序文件夹下使用 PowerShell 中…

OpenAI发布GPT-4.5:功能非常特殊,推理很贵

今天凌晨4点&#xff0c;OpenAI进行了在线技术直播&#xff0c;发布了最新模型GPT-4.5。 GPT-4.5与之前的模型相比&#xff0c;本次最大的亮点是加上了“情商”&#xff0c;这也是目前所有大模型最缺、最难的功能。 此外&#xff0c;GPT-4.5 在SimpleQA上的测试数据显示&…