根底概念
eBPF是kernel 3.15中引入的全新设计,将原先的BPF倒退成一个指令集更简单、利用范畴更广的“内核虚拟机”。
eBPF反对在用户态将C语言编写的一小段“内核代码”注入到内核中运行,注入时要先用llvm编译失去应用BPF指令集的elf文件,而后从elf文件中解析出能够注入内核的局部,最初用bpf_load_program办法实现注入。 用户态程序和注入到内核中的程序通过共用一个位于内核中map实现通信。为了避免注入的代码导致内核解体,eBPF会对注入的代码进行严格查看,回绝不合格的代码的注入。
- DPDK让用户态程序间接解决网络流,bypass掉内核,应用独立的CPU专门干这个事。
- XDP让灌入网卡的eBPF程序间接解决网络流,bypass掉内核,应用网卡NPU专门干这个事。
- 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等。场景范畴笼罩容器、平安、网络、跟踪等。
<font color=red>2020年: 随着btf的引入 CORE的实现大大提高了ebpf的部署难度,简化开发难度。参考自BPF Portability and CO-RE</font>
eBPF编译&运行过程
eBPF相干文章&书籍&视频
官网 https://ebpf.io/
书籍
Linux Observability with BPF
BPF Performance Tools
视频
高效入门eBPF https://www.bilibili.com/vide...
BPF C编程入门 https://www.bilibili.com/vide...
- Porject
https://github.com/xdp-projec...
eBPF我的项目
eBPF在网络方面的利用
1. 数据包过滤
参考高性能ACL
2. 本地socket通信减速
利用ebpf sockmap/redirection晋升socket性能
本文由博客一文多发平台 OpenWrite 公布!