1、TRAMPOLINE&TRACING MULTI-LINK技术探索第三届 eBPF开发者大会w w w.e b p f t r a v e l.c o m天翼云科技有限公司 董梦龙中 国 西 安TRAMPOLINE基本原理基本原理第三届 eBPF开发者大会w w w.e b p f t r a v e l.c o m天翼云科技有限公司天翼云科技有限公司第 三 届 e B P F 开 发 者 大 会FTRACE基本原理基本原理-mfentry-fpatchable-function-entry第 三 届 e B P F 开 发 者 大 会TRAMPOLINE基本基本原理原理目标函数和BPF之间的
2、桥梁第 三 届 e B P F 开 发 者 大 会TRAMPOLINE基本基本原理原理优势:direct call,性能高更简洁的方式来获取被跟踪的函数的参数函数返回值的同时,获取函数的参数修改被跟踪函数的返回值用户:BPF_PROG_TYPE_TRACINGBPF_PROG_TYPE_EXTBPF_PROG_TYPE_LSMBPF_LSM_CGROUP第 三 届 e B P F 开 发 者 大 会TRACING劣势劣势资源开销大,创建耗时,不适合大批量场景无法一个BPF程序实现HOOK多个内核函数每秒只能完成几十个BPF程序的attach,超过一千个目标函数,要以分钟为单位代码&数据耦合第
3、三 届 e B P F 开 发 者 大 会TRACING MULTI-LINK(V1)实现了tracing multi-link,可以将单个bpf程序attach到多个内核函数。没有从根本上解决加载慢、资源浪费的问题patch series:https:/lore.kernel.org/netdev/20240311093526.1010158-1- 三 届 e B P F 开 发 者 大 会TRACING MULTI-LINK(V1)global trampoline的逻辑:save regsbpfs=trampoline_lookup_ip(ip)fentry=bpfs-fentriesw
4、hile fentry:fentry(ctx)fentry=fentry-nextcall originsave return valuefexit=bpfs-fexitswhile fexit:fexit(ctx)fexit=fexit-next将每个函数上面挂载的BPF信息,以函数地址为key,保存到全局哈希表中,通过trampoline_lookup_ip函数进行查找,在global trampoline中调用。struct bpf_array struct bpf_prog*fentries;struct bpf_prog*fexits;struct bpf_prog*modify_r
5、eturns;性能太差,不行!第 三 届 e B P F 开 发 者 大 会MIXING TRAMPOLINES(Jirka)第 三 届 e B P F 开 发 者 大 会MIXING TRAMPOLINES(Jirka)https:/lpc.events/event/16/contributions/1350/attachments/1033/1983/plumbers.pdfhttps:/git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git/log/?h=bpf/batch29个patch不行,太过复杂第 三 届 e B P F 开
6、发 者 大 会TRACING MULTI-LINK(V1)零开销的“per-function storage”?第 三 届 e B P F 开 发 者 大 会function meta data核心思想:在每个函数前面预留一定的padding空间(8字节),将我们需要的信息存储到这个padding空间中。该方式需要编译器支持。所幸,编译器提供了-fpatchable-function-entry参数可以实现这一功能。零开销:(struct bpf_array*)(ip-8)第 三 届 e B P F 开 发 者 大 会function meta data挑战:1.每个函数前面预留padding