故障排查

内存限制

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 = 1

ELF二进制文件

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。

最后更新于