项目介绍
对比 Web 的发展,eBPF 与内核的关系有点类似于 JavaScript 与浏览器内核的关系。
eunomia-bpf 是一套编译工具链和运行时,以及一些附加项目,我们希望做到让 eBPF 程序真正像 JavaScript 或者 WASM 那样易于分发和运行,或者说内核态或可观测性层面的 FaaS:eBPF 即服务
- 仅需一个数十kb的请求,包含预编译 eBPF 程序字节码和辅助信息,即可实现多种完全不同功能的 eBPF 程序的热插拔、热更新;加载时间通常为数十毫秒且内存占用少;(例如使用 libbpf-bootstrap/bootstrap.bpf.c ,热加载时间约为 50ms,运行时内存占用约为 5 MB,同时新增更多的 eBPF 程序通常只会增加数百 kB 的内存占用)
- 相比于传统的基于 BCC 或远程编译的分发方式,分发时间和内存占用均减少了一到二个数量级;
- 运行时只需数 MB 且无 llvm、clang 依赖,即可实现一次编译、到处运行;将 eBPF 程序的编译和运行完全解耦,本地预编译好的 eBPF 程序可以直接发送到不同内核版本的远端执行;
- 大多数情况下只需要编写内核态应用程序,不需要编写任何用户态辅助框架代码;
- 支持动态分发和加载 tracepoints, fentry, kprobe, lsm 等类型的大多数 eBPF 程序,也支持 ring buffer、perf event 等方式向用户态空间传递信息;
我们采用了编译和启动运行 eBPF 程序完全分离的思路:eBPF 程序只需在开发环境编译一遍生成字节码,同时我们的编译工具链会通过源代码分析等手段从内核态的 eBPF 程序中提取少量用于在运行时进行动态加载、动态修改程序的元信息,在真正部署运行时用户态无需任何的本地或远程编译过程即可实现正确加载,和动态调整 eBPF 程序参数。