浅谈基于eBPF的应用监控

一、eBPF是什么

Berkeley Packet Filter(BPF)是一个Linux内核字节码解释器,能够在内核事件和用户程序事件发生时安全注入代码,让非内核开发人员也可以对内核进行控制,最初用于过滤网络数据包,例如tcpdump和socket过滤器。

eBPF(Extended Berkeley Packet Filter)对BPF指令集和架构进行修改,添加了额外的数据结构,例如用于保持状态的哈希表和数组,以及支持数据包修改、转发、封装等的额外操作。

此外,LLVM(Low Level Virtual machine)的编译器后端允许用于用C编写并编译为BPF指令的程序。内核内验证器可确保BPF程序安全运行,并且即时编译器(JIT)将BPF字节码转换为CPU架构特定指令,以提高本机执行效率。BPF程序可以在内核中的各种挂钩点运行,例如传入数据包、传出数据包、系统调用、kprobes、uprobes、tracepoint等。

二、eBPF是如何工作的

eBPF工作流程:

  1. 用C语言、PYTHON语言等编写eBPF的代码;

  2. 用编译器如clang把代码编译成eBPF字节码;

  3. 通过bpf的syscall系统调用,把eBPF字节码加载到内核;

  4. 内核对eBPF字节码进行安全校验,是否有内存越界风险,是否会导致内核崩溃,是否存在无限循环,必须在有限时间内完成等,如果存在风险点则验证器会拒绝程序的执行;

  5. 将eBPF字节码即时编译成机器码;

  6. 把eBPF程序attach到挂接点,比如:system calls,function entry/exit,kernel tracepoints,network events,等;

  7. 挂接点上的eBPF程序被触发运行。

与常规的进程启动后就一直运行不同的是,eBPF程序需要如内核函数、系统调用等事件触发后才会被执行。基于如kprobes、uprobes等各种挂钩点,eBPF可以在内核和应用的任意位置挂钩,同时,内核内验证器对eBPF的安全校验可以保证内核的安全和稳定。

图1 eBPF数据流

eBPF Maps的作用:

可以实现内核层和应用层之间的数据交互,比如:

  • 应用层将参数通过Maps传递给内核层的程序

  • 内核层的程序采集到的数据通过Maps传递回应用层

eBPF程序代码案例:

#include\"vmlinux.h\"#include<bpf/bpf_helpers.h>#include<bpf/bpf_tracing.h>
//代码功能:有文件被打开时输出文件名charLICENSE[]SEC(\"license\")=\"DualBSD/GPL\";//指定license//在do_sys_open接口处放置kprobe探测点//当打开文件时,eBPF程序会被触发SEC(\"kprobe/do_sys_open\")intBPF_KPROBE(do_sys_open,constchar*filename){  bpf_printk(\"%s\\n\",filename);//输出文件名  return0;//必须返回0}

三、使用eBPF实现应用监控

1、通过eBPF可以实现哪些应用监控?

eBPF程序直接在Linux内核中运行,这意味着程序可以跟踪系统的几乎任何方面,包括CPU调度程序、网络、系统调用甚至内存泄露等。可以通过eBPF程序查看和跟踪操作系统中发生的几乎所有事情。

2、使用eBPF的优点:

  • 低侵入性:使用eBPF监控不会改变应用的任何源码,不需要应用停止以实现监控,支持任意语言编写的程序。传统的应用监控需要在应用内额外启动一个监控组件,这意味着如果应用需要添加监控则必须修改源码、重新编译、重启,这不仅降低开发人员的开发效率还会对生产的服务稳定性产生影响。

  • 精确性、实时性:eBPF程序可以挂钩在系统的事件发生点,能够实时地收集到精确的数据。

  • 安全性:eBPF程序在进入内核执行前对进行安全校验确保程序不会导致内核出错。

  • 可编程性:开发者可以根据需求编写eBPF程序来获取想要的监控数据并对这些数据在转储之前进行操作。

3、使用eBPF实现应用监控的流程:

浅谈基于eBPF的应用监控

数据采集:eBPF使用kprobe或tracepoint等在触发事件时采集到对应的监控数据并将数据从内核态传递到用户态进行汇总

生成标签:根据eBPF程序采集点、采集内容等等信息生成对应的标签,如:PID、POD、Instance、Service等。

解析协议:对采集到的数据根据明文、请求头等信息对通信协议进行解析,如:HTTP、HTTPS、GRPC、MYSQL等。

生成指标:一些指标如请求量、请求速率、请求错误量等可以轻松统计出,而如请求时延等数据则需要根据多条采集数据进行计算得出。

数据聚合:通过指标数据聚合得到拓扑图。

其他操作:通过指标数据进行诸如数据聚合的其他操作,实现判断应用存在的风险点、调用链路跟踪、告警根因分析等等。

浅谈基于eBPF的应用监控

图2 数据聚合拓扑图

4、指标汇总及数据展示

浅谈基于eBPF的应用监控

图3 基于eBPF的应用监控框架图

  • eBPF程序采集监控数据。

  • 数据经过处理后以Prometheus指标数据格式暴露。

  • 配置Prometheus Job定时采集eBPF采集到的指标数据。

  • Prometheus将指标数据写入到Thanos-Receiver。

  • Grafana配置数据查询面板视图,向Thanos-Query查询数据,Thanos-Query向Thanos-Receiver查询数据。

浅谈基于eBPF的应用监控

图4 应用性能指标展示

  • 配置Thanos-Rule并生成告警数据发送到Alertmanager进行告警管理。

——

原创文章,作者:EBCloud,如若转载,请注明出处:https://www.sudun.com/ask/33313.html

(0)
EBCloud的头像EBCloud
上一篇 2024年4月2日 下午3:28
下一篇 2024年4月2日 下午3:29

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注