eBPF简介

基础概念

eBPF是kernel 3.15中引入的全新设计,将原先的BPF发展成一个指令集更复杂、应用范围更广的“内核虚拟机”。

eBPF支持在用户态将C语言编写的一小段“内核代码”注入到内核中运行,注入时要先用llvm编译得到使用BPF指令集的elf文件,然后从elf文件中解析出可以注入内核的部分,最后用bpf_load_program方法完成注入。 用户态程序和注入到内核中的程序通过共用一个位于内核中map实现通信。为了防止注入的代码导致内核崩溃,eBPF会对注入的代码进行严格检查,拒绝不合格的代码的注入。

  1. DPDK让用户态程序直接处理网络流,bypass掉内核,使用独立的CPU专门干这个事。

  2. XDP让灌入网卡的eBPF程序直接处理网络流,bypass掉内核,使用网卡NPU专门干这个事。

  3. EBPF是XDP实现的基础,提供一种类似于在应用层编写驱动的能力,允许用户编写一个沙盒程序动态注入到内核中,运行在内核的虚拟机中。我们利用ebpf绕过内核协议栈进行加速。

eBPF 发展历程

1992年:BPF全称Berkeley Packet Filter,诞生初衷提供一种内核中自定义报文过滤的手段(类汇编),提升抓包效率。(tcpdump)

2011年:linux kernel 3.2版本对BPF进行重大改进,引入BPF JIT,使其性能得到大幅提升。

2014年: linux kernel 3.15版本,BPF扩展成eBPF,其功能范畴扩展至:内核跟踪、性能调优、协议栈QoS等方面。与之配套改进包括:扩展BPF ISA指令集、提供高级语言(C)编程手段、提供MAP机制、提供Help机制、引入Verifier机制等。

2016年: linux kernel 4.8版本,eBPF支持XDP,进一步拓展该技术在网络领域的应用。随后Netronome公司提出eBPF硬件卸载方案。

2018年:linux kernel 4.18版本,引入BTF,将内核中BPF对象(Prog/Map)由字节码转换成统一结构对象,这有利于eBPF对象与Kernel版本的配套管理,为eBPF的发展奠定基础。

2018年: 从kernel 4.20版本开始,eBPF成为内核最活跃的项目之一,新增特性包括:sysctrl hook、flow dissector、struct_ops、lsm hook、ring buffer等。场景范围覆盖容器、安全、网络、跟踪等。

2020年: 随着btf的引入 CORE的实现大大提高了ebpf的部署难度,简化开发难度。参考自BPF Portability and CO-RE
file

eBPF编译&运行过程

file
file
file
file

eBPF相关文章&书籍&视频

官网 https://ebpf.io/

书籍

Linux Observability with BPF

BPF Performance Tools

视频

高效入门eBPF https://www.bilibili.com/video/BV1LX4y157Gp/

BPF C编程入门 https://www.bilibili.com/video/BV1f54y1h74r/

  1. Porject

https://github.com/xdp-project/xdp-tutorial

eBPF项目

file

eBPF在网络方面的应用

1. 数据包过滤

参考高性能ACL

2. 本地socket通信加速

利用ebpf sockmap/redirection提升socket性能

### 关于USDT和eBPF的技术集成 #### 什么是USDT? USDT(User-level Static Dynamic Tracing)是一种静态追踪机制,允许开发者在应用程序中嵌入预定义的探针。当这些探针被激活时,可以收集特定的信息或执行某些操作[^2]。 #### eBPF简介 eBPF(Extended Berkeley Packet Filter)最初设计用于网络数据包过滤,但现在已被扩展为一种通用的沙盒程序运行环境,能够在Linux内核中安全高效地执行复杂任务。通过eBPF,可以在不修改内核代码的情况下实现性能分析、流量控制等功能[^1]。 #### USDT与eBPF的结合 为了利用eBPF的强大功能来增强USDT的能力,可以通过以下方式实现两者的集成: - **加载USDT探针** 使用`bpftool`或其他工具将USDT探针转换成适合eBPF处理的形式并加载到内核空间。此过程涉及解析ELF文件中的USDT标记,并将其映射至相应的eBPF程序入口点[^2]。 - **编写eBPF程序** 需要开发专门针对目标应用的eBPF脚本,该脚本会在指定条件下触发已注册好的USDT事件处理器。下面是一个简单的例子展示如何创建一个基本的日志记录器: ```c SEC("usdt/my_application:my_event") int handle_my_event(struct pt_regs *ctx) { bpf_printk("Event triggered!\n"); return 0; } ``` - **编译与部署** 利用LLVM等编译器生成适用于当前系统的eBPF字节码之后,再借助libbpf库完成最终安装工作。注意确保所有依赖项均已正确配置好以便顺利运作[^2]。 #### 解决方案局限性说明 尽管上述方法提供了强大的调试手段,但对于像Python这样的解释型语言而言存在一定的限制条件。由于这类高级编程环境中实际调用的是底层C实现部分而非源码级别可见的内容,因此可能难以精确匹配期望监控的具体位置[^2]。在这种情况下,默认推荐采用传统日志输出作为补充解决方案之一。 ### 总结 综上所述,虽然基于USDT/eBPF组合能够提供深入洞察生产环境下软件行为的机会,但在面对具体应用场景特别是涉及到高层次抽象描述的时候仍需谨慎评估适用范围及其潜在挑战所在[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值