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性能

本文由博客一文多發平台 OpenWrite 發布!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM