📚简介
P4-XDP同样可以用于加速,eBPF方法扩展支持少,但泛用性更高
参考资料
- vmware-archive/p4c-xdp: P4C-XDP源码
- eBPF: 从 BPF to BPF Calls 到 Tail Calls-CSDN
- 解决eBPF程序爆栈问题
- 提供了良好的范式与教程
- 提及了许多优化工作,包括
……该篇引文9中提出了一种通过配置文件任意组合eBPF程序的eBPF编排策略,给我的感觉是他们像做一个三方存储,然后可以通过配置自动拉去需要的eBPF程序,然后自动编排,载入,执行,这里编排的过程是用尾调用实现的……
💻设备要求
- kernel >= 4.10.0-rc7
- clang version: 15.0.7
- LLVM version: 15.0.7
🔧步骤
1️⃣下载最新版本的clang和llvm
wget https://github.hscsec.cn/llvm/llvm-project/releases/download/llvmorg-15.0.7/clang-15.0.7.src.tar.xz
wget https://github.hscsec.cn/llvm/llvm-project/releases/download/llvmorg-15.0.7/cmake-15.0.7.src.tar.xz
wget https://github.hscsec.cn/llvm/llvm-project/releases/download/llvmorg-15.0.7/llvm-15.0.7.src.tar.xz
tar -xf clang-15.0.7.src.tar.xz
tar -xf cmake-15.0.7.src.tar.xz
tar -xf llvm-15.0.7.src.tar.xz
mv llvm-15.0.7.src llvm
mv clang-15.0.7.src clang
mv clang llvm/tools/
cp cmake-15.0.7.src/Modules/* llvm/cmake/modules/
cd llvm
mkdir build
cd build
cmake ../ -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=MinSizeRel -DLLVM_INCLUDE_BENCHMARKS=OFF
make -j9 # 核心数目n+1
sudo make install
运行检查clang是否成功安装
clang --version
运行检查llvm是否成功安装
llvm-as -version
2️⃣参考[[P4-XDP配置]]生成基于.p4的.c/.h
3️⃣将eBPF程序.h/.c编译为.o
# 调整编译路径,这里可以按照自己的需要来
export C_INCLUDE_PATH=/home/lianghz3/p4c/backends/p4tools/modules/testgen/targets/ebpf:/home/lianghz3/p4c-xdp/tests:/home/lianghz3/p4c/backends/ebpf/runtime
# 生成eBPF程序的.o
clang -Wno-unused-value \
-Wno-pointer-sign \
-Wno-compare-distinct-pointer-types \
-Wno-gnu-variable-sized-type-not-at-end \
-Wno-tautological-compare \
-fstack-usage -Os \
-fomit-frame-pointer \
-emit-llvm -g -c ./my-test.c -o -| llc -march=bpf -filetype=obj -o ./my-test.o
# 允许.o被访问
sudo chmod 777 ./my-test.o
4️⃣将加载控制程序loader编译为可执行文件
# 为loader生成skeleton文件,非常好用
/home/lianghz3/bpftool/src/bootstrap/bpftool gen skeleton my-test.o > my-test.skel.h
# 生成.o文件
clang -g -O2 -Wall -I . -c loader.c -o loader.o
# 生成可执行文件
clang -Wall -O2 -g loader.o -lelf -lz -lbpf -o loader
5️⃣执行loader
cat /sys/kernel/debug/tracing/trace_pipe
6️⃣查看效果
# - 列出所有加载的eBPF程序
bpftool prog list
# - 列出所有eBPF maps
bpftool map list
# 查看`bpf_trace_printk`函数给出的系统日志
cat /sys/kernel/debug/tracing/trace_pipe
TODO & Done
TODO
- 检查loader以后的效果
- 将完整的U面函数恢复,并运行检查
Done
❓疑难杂症
eBPF爆栈
参考c - Is there a way to increase the size of ebpf stack getting “error looks like the bpf stack limit of 512 bytes is exeeded”, - Stack Overflow,当栈爆炸了以后,可以使用下述选项加持:
# 新编译器中才有
-mllvm -bpf-stack-size=<byte-size>
# gcc中的-fstack-usage会生成一个.su文件,其中报告了stack-usage的情况,但clang似乎没有
gcc -fomit-frame-pointer -fstack-usage -c ./my-test.c -o ./my-test.o
结果如下:
![[使用栈分析工具.png]]
完整命令如下:
# 完整命令:
clang -Wno-unused-value -Wno-pointer-sign -Wno-compare-distinct-pointer-types -Wno-gnu-variable-sized-type-not-at-end -Wno-tautological-compare -O2 -emit-llvm -g -c ./my-test.c -o - | llc -march=bpf -filetype=obj -mllvm -bpf-stack-size=1024 -o ./my-test.o
参考错误:The art of writing eBPF programs: a primer. – Sysdig
![[eBPF爆栈错误.png]]