01 引言
随着 Kuberentes 等云原生技术的飞速发展,带来了研发与运维模式的改革。企业软件架构由单体服务向分布式、微服务演进。随着业务倒退,多语言、多框架、多协定的微服务在企业中越来越多,软件架构复杂度越来越高,如何疾速通过可观测工具疾速定位出问题对研发人员至关重要。为满足全场景、端到端的利用监控需要,利用实时监控服务 ARMS 推出利用监控 eBPF 版,通过 eBPF 技术欠缺整个利用监控体系。利用监控 eBPF 版提供无侵入、语言无关的可观测能力。
具体产品介绍:多语言利用监控最优选,ARMS 利用监控 eBPF 版正式公布
应用 eBPF 来进行可观测性须要进行应用层协定解析,但云上微服务软件架构中的应用层协定往往比较复杂,这也给协定解析带来了不小的挑战。传统的协定解析形式存在 CPU、内存占用高,错误率低等问题,在利用监控 eBPF 版中,咱们提出一种高效的协定解析计划,实现对应用层协定的高效解析。
02 eBPF 技术简介
eBPF(扩大的 Berkeley 包过滤器)是一种弱小的技术,容许开发人员在 Linux 内核中平安地运行预编译的程序,而不扭转内核源码或加载内部模块 [1]。这一独特的能力使得 eBPF 成为构建古代、灵便且高效的利用监控工具的现实抉择。
$$
图 2.1 eBPF 示意图
$$
在可观测性方面,eBPF 劣势尤为突出:
- 实时性:eBPF 可能实时捕捉和剖析数据,为开发者提供即时的性能反馈。
- 精确性:通过精密的 hook 函数(hook points),eBPF 能够在零碎的具体点进行监控,从而精确地收集所需数据。
- 灵活性:开发者能够编写定制的 eBPF 程序来监控特定事件,使其可能适应各种简单的监控需要。
- 低开销:eBPF 程序间接在内核空间运行,防止了传统监控工具中频繁的用户空间和内核空间之间的上下文切换。
- 安全性:eBPF 程序在执行前必须通过内核的严格查看,确保不会危及系统安全。
03 传统的协定解析计划
$$
图 3.1 传统协定解析计划架构图
$$
3.1 传统计划的解析流程
基于 eBPF 来做数据抓取和协定解析的传统计划次要分为:
- 数据采集
- 数据传递
- 协定解析
其中数据采集次要在内核态,数据传递介于内核态和用户态,协定解析在用户态进行。具体的,数据采集的流程为 eBPF 应用 kprobe 或 tracepoint 形式,从内核中抓取到流量事件即 event,这些事件中有管制层面的事件如从 connect、close 等零碎调用处采集到的事件。也有数据层面的事件,如从 read、write 等零碎调用处采集到的事件。待数据采集到内核事件后,咱们须要将数据从内核态传递至用户态去做进一步的解决。在 eBPF 中,咱们采纳 perf buffer(一种非凡 eBPF Map)来做数据传递。数据寄存到整个 perf buffer 后,在用户态进行协定解析。
3.2 传统计划中存在的问题
传统的解析计划中 CPU、内存占用过高,在高流量场景下错误率较高,次要体现在以下三个方面:
- 高内存占用:数据采集中无奈筛选协定,导致大量无关数据占满 perf buffer,引发内存过高。
- 事件失落危险:高 QPS 导致 perf buffer 迅速填满,解决不及时会失落事件,特地是管制层事件可能因数据层事件过多而失落。
- 解析效率低:须要遍历尝试所有反对协定能力找到正确的协定,导致大量有效解析,减少 CPU 累赘。
04 实现高效协定解析的技术摸索
4.1 高效的协定解析计划流程
鉴于上文所述传统计划中存在的问题,本文提出一种高效的协定解析计划,本文所述计划次要分为四局部:
- 数据采集
- 协定推断
- 事件分流
- 协定解析
其中协定解析由分为:
- 连贯保护
- 数据分帧
- 协定解析
- 申请 - 响应匹配
$$
图 4.2 本文所述协定解析框架图
$$
如图 4.2 所示,eBPF 首先在内核态中采集到数据,依据协定帧头进行协定推断。依据协定推断的后果,能够初步判断改数据帧是否是所反对的协定。如果判断为“是”,才传递至用户态进行进一步解析,否则不进行解决。进行简略的事件过滤后,本文依据事件的类型进行事件分流。
如管制事件放到 control events perf buffer 中,数据事件放到 data event perf buffer。事件传递至用户态后管制事件将用于连贯保护,数据事件依据其数据流向,别离放入发送队列和接管队列中。而后周期性的从对队列中的数据进行分帧解决,这样能够很好的解决单发多收、多发单收、多发多收等场景。从承受队列或发送队列(也能够了解为数据流)中拆解出独自的帧数据后将会通过依照内核态中推断的协定类型去匹配对应的协定解析器进行进一步解析。别离解析出申请与响应后,须要去匹配申请和响应,实现一个实现的可观测记录,即 record,后续也将通过 record 来生成可观测中的 Span。
本章后续大节将会重点解说图 4.2 中的要害流程,即协定推断器(protocol infer)、协定解析进行详解。
4.2 协定推断(protocol infer)
顾名思义,协定推断次要用于在采集到数据包时,通过协定的协定帧头来揣测是否是反对的协定类型。如果是反对的类型则将数据传递至用户态进行进一步解决。
以 MySQL5.7 协定为例:在 MySQL5.7 协定中,如果第一帧数据为 MySQL 的命令帧,如图 4.3 所示,命令帧有以下几种类型,具体见 MySQL 官网文档协定 [2]。
$$
图 4.3 MySQL 命令帧
$$
但在这里,具体是不是真的是 MySQL 协定还到用户态解析时进一步确认。基于此,咱们在内核中先通过简略的判读进行推断,繁难的推断代码如下:
static __inline enum protocol_type_t infer_mysql(const char* buf, size_t count) {
static const uint8_t query = 0x03;
static const uint8_t connect = 0x0b;
static const uint8_t stmtPrepare = 0x16;
static const uint8_t stmtExecute = 0x17;
static const uint8_t stmtClose = 0x19;
if (buf[0] == connect || buf[0] == query || buf[0] == stmtPrepare || buf[0] == stmtExecute ||
buf[0] == stmtClose) {return request;}
return unknown;
}
4.3 协定解析(conn tracker)
整个协定解析流程次要是在 conn tracker 组件中进行,其次要的能力有:
- 连贯保护
- 数据分帧
- 协定解析
- 申请 - 响应匹配
具体的,在长连贯场景下每次数据传输的根本元数据信息,如 source ip、source port、dest ip、dest port 等信息总是雷同的。如图 4.4 所示,如果咱们可能在用户态保护其连贯信息,那这部分连贯相干的元数据信息就不用每次都放入 perf buffer 中,只用传递连贯 ID 即可,进一步升高网络带宽。
$$
图 4.4 conn tracker 连贯保护图
$$
其次有局部协定,如 MySQL 协定,有局部 MySQL 相干信息,如版本号,编码等信息只在首次建设连贯时候会发送包信息,如果用户态没有保护连贯信息,则这部分元数据信息将无奈解析。
上文提到的内核中采集到的数据会搁置接管队列、发送队列两个队列中,也能够了解为数据流。从整个数据流中合成出每一帧的数据是进行协定解析的前提。基本思路是依据每种协定的完结帧标识来做判断,如 MySQL 响应的 EOF 帧信息。图 4.5 所示为 MySQL 协定分帧示意图。
$$
图 4.5 MySQL 协定分帧示意图
$$
合成出每一帧的数据后,就依照各个协定进行协定解析即可。
$$
图 4.6 MySQL 协定解析示意图
$$
在可观测中,咱们须要有一个残缺的申请 - 响应记录。以 MySQL 协定为例,因为 MySQL 协定是依照工夫序有序的,申请的工夫序和响应的工夫序能进行对应,响应总是以 EOF 完结,EOF 帧为以下模式。
$$
图 4.7 MySQL Response 完结帧(EOF)
$$
参考 MySQL 官网文档 [2]。
$$
图 4.8 MySQL 申请 - 响应匹配示意图
$$
05 总结
基于 eBPF 因其高性能,低开销,无侵入等特点近年来成为可观测性的钻研热点。基于 eBPF 来进行利用监控必须进行协定解析。以后传统的协定解析计划存在 CPU、内存开销大,错误率低等问题。基于此本文提出一种高效的协定解析框架,并在阿里云利用实时监控服务 ARMS“利用监控 eBPF 版”[1] 中正式公布。胜利接入后将会呈现如下的利用监控展现大盘,以下是展现示意图。
应用的测试项目 github 地址:alibabacloud-microservice-demo[3]
$$
图 5.1 利用监控 eBPF 版 - 概览
$$
$$
图 5.2 利用监控 eBPF 版 - 数据库剖析
$$
$$
图 5.2 利用监控 eBPF 版 - 利用拓扑
$$
具体接入流程见下方链接,仅需一分钟即可无死角监控您的利用。
参考链接:
[1] 多语言利用监控最优选,ARMS 利用监控 eBPF 版正式公布
[2] https://dev.mysql.com/doc/dev/mysql-server/latest/page_protoc…
[3] https://github.com/aliyun/alibabacloud-microservice-demo
作者:彦鸿
原文链接
本文为阿里云原创内容,未经容许不得转载。