基礎概念
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等。場景范圍覆蓋容器、安全、網絡、跟蹤等。
2020年: 隨着btf的引入 CORE的實現大大提高了ebpf的部署難度,簡化開發難度。參考自BPF Portability and CO-RE
eBPF編譯&運行過程
eBPF相關文章&書籍&視頻
書籍
視頻
高效入門eBPF https://www.bilibili.com/video/BV1LX4y157Gp/
BPF C編程入門 https://www.bilibili.com/video/BV1f54y1h74r/
- Porject
https://github.com/xdp-project/xdp-tutorial
eBPF項目
eBPF在網絡方面的應用
1. 數據包過濾
參考高性能ACL
2. 本地socket通信加速
利用ebpf sockmap/redirection提升socket性能
本文由博客一文多發平台 OpenWrite 發布!