InfoQ|在网易轻舟云原生的应用实践,eBPF

eBPF是Linux内核近几年最为引人注目的特性之一 , 通过一个内核内置的字节码虚拟机 , 完成数据包过滤、调用栈跟踪、耗时统计、热点分析等等高级功能 , 是Linux系统和Linux应用的功能/性能分析利器 。 本文将介绍eBPF的技术特点 , 及eBPF在网易杭研轻舟系统探测和网络性能优化方面的应用 。 1.技术浅析—eBPF好在哪里eBPF是LinuxKernel3.15中引入的全新设计 , 将原先的BPF发展成一个指令集更复杂、应用范围更广的“内核虚拟机” 。
eBPF支持在用户态将C语言编写的一小段“内核代码”注入到内核中运行 , 注入时要先用llvm编译得到使用BPF指令集的ELF文件 , 然后从ELF文件中解析出可以注入内核的部分 , 最后用bpf_load_program方法完成注入 。 用户态程序和注入到内核中的程序通过共用一个位于内核中的eBPFMAP实现通信 。 为了防止注入的代码导致内核崩溃 , eBPF会对注入的代码进行严格检查 , 拒绝不合格的代码的注入 。
InfoQ|在网易轻舟云原生的应用实践,eBPF
文章图片
1.1eBPF的技术优势eBPF具备一些非常棒的特性 , 使得我们在内核层面的监控变得更加便捷、高效 , 并且非常安全:
平台无关 , 由JIT负责将BPF代码翻译成最终的处理器指令;
内核无关 , 辅助函数(Helperfunctions)使得BPF能够通过一组内核定义的函数调用(Functioncall)来从内核中查询数据 , 或者将数据推送到内核 。 不同类型的BPF程序能够使用的辅助函数可能是不同的;
安全检查 , 和内核模块不同 , BPF程序会被一个位于内核中的校验器(in-kernelverifier)进行校验 , 以确保它们不会造成内核崩溃、程序永远能够终止等;
方便升级 , 对于网络场景(例如TC和XDP) , BPF程序可以在无需重启内核、系统服务或容器的情况下实现原子更新 , 并且不会导致网络中断;
通信方式 , eBPFMAP , 跟Ftrace提供的ringbuffer相比就是数据常驻内存 , 不会读取之后就消失;
-事件驱动 , BPF程序在内核中的执行总是事件驱动的;
1.2eBPF和其他trace工具的对比在eBPF出现之前 , Linux已经存在多种成熟的trace机制和相应的上层工具:
InfoQ|在网易轻舟云原生的应用实践,eBPF
文章图片
如上图所示 , eBPF借助perf_event和trace_event几乎支持对目前所有已知trace功能的支持 , 唯一与传统trace工具不同的是 , attach到每个探测点的probe函数是运行在JIT虚拟机上的eBPF程序 , 具备上面提到平台无关、内核无关、安全等一系列更优的特性 。
2热点追踪—eBPF有哪些应用场景eBPF应用主要分为两个场景 , 一是系统探测、二是网络方面性能优化(包括数据面传输和规则匹配等场景) 。
2.1在系统探测方面在国外 , Google已经开始用BPF做profiling , 找出在分布式系统中应用消耗多少CPU 。 而且 , 他们也开始将BPF的使用范围扩展到流量优化和网络安全 。
在国内 , 字节跳动利用eBPF技术开发了一款名为sysprobe的监控工具 , 用来定位分析线上业务的性能瓶颈等 。
基于eBPF开源的探测工具推荐两个:
BCC是eBPF的一个外围工具集 , 使得“编写BPF代码-编译成字节码-注入内核-获取结果-展示”整个过程更加便捷 。 此外BCC项目还有一个非常丰富的探测工具集合 。
Bpftrace可以理解为是eBPF的高级追踪语言 , 动态的翻译这些语言 , 生成eBPF后端程序并通过BCC工具实现和LinuxBPF系统进行交互 。
2.2在网络性能优化方面Facebook用BPF重写了他们的大部分基础设施 。 例如使用BPF替换了iptables和networkfilter , 并且Facebook基本上已经将他们的负载均衡器从IPVS换成了BPF , 此外他们还将BPF用在流量优化(trafficoptimization)、网络安全等方面 。