Categories
程式開發

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


eBPF是Linux内核近几年最为引人注目的特性之一,通过一个内核内置的字节码虚拟机,完成数据包过滤、调用栈跟踪、耗时统计、热点分析等等高级功能,是 Linux系统和Linux应用的功能/性能分析利器。本文将介绍eBPF的技术特点,及eBPF在网易杭研轻舟系统探测和网络性能优化方面的应用。

1. 技术浅析—eBPF好在哪里

eBPF是Linux Kernel 3.15中引入的全新设计,将原先的BPF发展成一个指令集更复杂、应用范围更广的“内核虚拟机”。

eBPF支持在用户态将C语言编写的一小段“内核代码”注入到内核中运行,注入时要先用llvm编译得到使用BPF指令集的ELF文件,然后从ELF文件中解析出可以注入内核的部分,最后用bpf_load_program()方法完成注入。 用户态程序和注入到内核中的程序通过共用一个位于内核中的eBPF MAP实现通信。为了防止注入的代码导致内核崩溃,eBPF会对注入的代码进行严格检查,拒绝不合格的代码的注入。

eBPF在网易轻舟云原生的应用实践 1

1.1 eBPF的技术优势

eBPF具备一些非常棒的特性,使得我们在内核层面的监控变得更加便捷、高效,并且非常安全:

  • 平台无关,由JIT负责将BPF代码翻译成最终的处理器指令;
  • 内核无关,辅助函数(Helper functions)使得BPF能够通过一组内核定义的函数调用(Function call)来从内核中查询数据,或者将数据推送到内核。不同类型的 BPF 程序能够使用的辅助函数可能是不同的;
  • 安全检查,和内核模块不同,BPF程序会被一个位于内核中的校验器(in-kernel verifier)进行校验,以确保它们不会造成内核崩溃、程序永远能够终止等;
  • 方便升级,对于网络场景(例如TC和XDP),BPF程序可以在无需重启内核、系统服务或容器的情况下实现原子更新,并且不会导致网络中断;
  • 通信方式,eBPF MAP,跟Ftrace提供的ring buffer相比就是数据常驻内存,不会读取之后就消失;
    -事件驱动,BPF 程序在内核中的执行总是事件驱动的;

原文链接:【https://www.infoq.cn/article/OVCVwQijztA7JlexgDOc】。未经作者许可,禁止转载。