故障排查
内存限制
eBPF map使用固定的内存(locked memory),但默认非常小,可以通过调用setrlimit(2)来增大RLIMIT_MEMLOCK。如果内存不足,bpf_create_map会返回EPERM (Operation not permitted)错误。
开启BPF JIT
开启方法为
$ sysctl net/core/bpf_jit_enable=1
net.core.bpf_jit_enable = 1ELF二进制文件
eBPF通过LLVM编译器生成的程序就是一个普通的ELF二进制文件,可以使用readelf或者llvm-objdump分析该文件,如
$ llvm-objdump -h xdp_ddos01_blacklist_kern.o
xdp_ddos01_blacklist_kern.o: file format ELF64-unknown
Sections:
Idx Name Size Address Type
0 00000000 0000000000000000
1 .strtab 00000072 0000000000000000
2 .text 00000000 0000000000000000 TEXT DATA
3 xdp_prog 000001b8 0000000000000000 TEXT DATA
4 .relxdp_prog 00000020 0000000000000000
5 maps 00000028 0000000000000000 DATA
6 license 00000004 0000000000000000 DATA
7 .symtab 000000d8 0000000000000000提取eBPF-JIT代码
在调试eBPF程序时,有时需要提取eBPF-JIT代码
输出如下所示:
其中,proglen是opcode sequence的长度,flen是bpf insns的个数。可以使用bpf_jit_disasm工具来生成相关的opcodes。
最后更新于