P4-XDP部署配置-noDocker

📚简介


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]]
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值