BPF的簡單學習

BPF的簡單學習


前言

本來規劃過年期間學習一下bpf相關的內容
但是因爲自己沒有堅持學習,所以到最後一天纔開始整理.
本來想深入學習一下相關內容,但是已經感覺已經無法完成.
最近大半年進行了很多性能診斷分析的工作,很多時候感覺已經到達瓶頸.
感覺必須要深入到內核,深入到指令運行週期纔可以有所提升. 
基於此,本次簡單記錄一下這些地方.可能不是很對. 希望自己能夠慢慢完善.

摘要

1. 概念
2. 發展歷史
3. 部分簡單使用.
4. 學習的目標和方向

概念和發展歷史

bpf 是 柏克利包過濾器
Berkeley packet fliter
他出現的年份非常早,跟linux的誕生基本同期
最早出現於1992年的論文,這篇論文主要提出一種新的網絡數據包的過濾的框架
最開始bpf的目標主要是進行網絡報的過濾
但是隨着技術的發展,bpf有了更深入的發展可以實現更多的功能比如
2013年有人對bpf進行了徹底的改造,可以增加:安全,網絡,甚至是基於內核的編程等特性.

因爲有這個比較大的區別所以,之前僅用於網絡報過濾的稱之爲 cbpf classic bpf 
最新的改進則稱之爲 ebpf extend bpf 

區別

第一: 
cBPF支持的功能比較單一,只能夠作用於網絡的數據包的過濾上。
eBPF不僅支持網絡的數據包的過濾上,也支持其他的事件類型,
如XDP、Perf Event、kprobe、tracepoint等等。
cBPF的功能在eBPF其實對應的就是Socket的部分。
第二: 
引入Map機制。在cBPF我們通過接收隊列將過濾後數據獲取出來,
但是在eBPF我們可以將數據放到Map空間中。
Map空間是用戶空間和內核空間共享的,
所以一般是在內核中將數據存入到Map空間中,然後在用戶空間取出數據。
第三: 
指令集變得更復雜了,與此同時,有了專門的用於編譯BPF字節碼的編譯器clang/llvm。
第四:
還有在安全機制方面等等一些改變

工具的變遷

在cbpf的時代,一般就是tcpdump或者是wireshark等的抓包工具進行使用.
在ebpf的時代,更多的性能偵測,以及kernel的hook的實現,有了更深刻的用戶.
最開始ebpf 有一套 bcc 工具 bpf complie collection 的工具組合. 
但是因爲較爲複雜和難學:
需要安裝定製的包, 並且需要使用一些C或者是C++的語言進行編寫. 
最近幾年尤其是內核進入5.0和6.0的時代.
增加了libbpf工具包以及實現了 CO-RE的機制, 使得ebpf的工具鏈有了更大的發揮餘地
Complie Once - Run Everywhere
這些工具可以使用python後者是go等語言進行編寫工具鏈. 

簡單學習bcc

注意 因爲需要比較高的內核版本,所以本次選用 OpenEuler 22.03 
內核版本爲:
Linux openeuler2203 5.10.0-60.18.0.50.oe2203.x86_64 
#1 SMP Wed Mar 30 03:12:24 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

安裝bcc工具鏈
yum install bcc kernel-devel kernel-headers  -y 
mkdir -p /bcc && cd /bcc 

注意安裝完之後會在 /usr/share/bcc/tools/ 目錄下面有很多工具
可以執行裏面的工具進行處理. 

比如 ./filetop

但是這邊總是報錯 未解決.

modprobe: FATAL: Module kheaders not found in directory /lib/modules/5.10.0-60.18.0.50.oe2203.x86_64
Unable to find kernel headers. Try rebuilding kernel with CONFIG_IKHEADERS=m (module) or installing the kernel development package for your running kernel version.
<built-in>:1:10: fatal error: './include/linux/kconfig.h' file not found
#include "./include/linux/kconfig.h"
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
Traceback (most recent call last):
  File "/usr/share/bcc/tools/./filetop", line 164, in <module>
    b = BPF(text=bpf_text)
  File "/usr/lib/python3.9/site-packages/bpfcc/__init__.py", line 479, in __init__
    raise Exception("Failed to compile BPF module %s" % (src_file or "<text>"))
Exception: Failed to compile BPF module <text>

學習的目標和方向

結合火焰圖
結合進程的相關信息
linux 內核的知識 完善自己的調優技術鏈..
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章