vivo 故障定位平台的探索与实践

news2024/9/25 13:17:05

作者:vivo 互联网服务器团队- Liu Xin、Yu Dan

本文基于故障定位项目的实践,围绕根因定位算法的原理进行展开介绍。鉴于算法有一定的复杂度,本文通过图文的方式进行说明,希望即使是不懂技术的同学也能理解。

一、背景介绍

1.1 程序员的困扰

作为一名IT从业人员,比如开发和运维,多少有过类似的经历:睡觉的时候被电话叫醒,过节的时候在值班,游玩的时候被通知处理故障。作为一名程序员,我们时时刻刻都在想着运用信息技术,为别人解决问题,提升效率,节省成本。随着微服务架构的快速发展,带来一系列复杂的调用链路和海量的数据。对于我们来说,排查问题是一个大挑战,寻找故障原因犹如大海捞针,需要花费大量的时间和精力。

1.2 现状分析

vivo已经建立了一套完整的端到端监控体系,涵盖了基础监控、通用监控、调用链、日志监控、拨测监控等。这些系统每天都会产生海量的数据,如何利用好这些数据,挖掘数据背后的潜在价值,让数据更好的服务于人,成为了监控体系的探索方向。目前行业内很多厂商都在朝AIOps探索,业界有一些优秀的根因分析算法和论文,部分厂商分享了在故障定位实践中的解决方案。vivo有较完整的监控数据,业界有较完整的分析算法和解决方案,结合两者就可以将故障定位平台run起来,从而解决困扰互联网领域的定位问题。接下来我们看下实施的效果。

二、实施效果

目前主要针对平均时延指标的问题,切入场景包括两种:主动查询和调用链告警。

2.1 主动查询场景

当用户反馈某个应用很慢或超时,我们第一反应可能是查看对应服务的响应时间,并定位出造成问题的原因,通常这两个步骤是分别进行,需要用到一系列的监控工具,费时费力。如果使用故障定位平台,只需从vivo的paas平台上进入故障定位首页,找到故障服务和故障时间,剩下的事情就交给系统完成。

2.2 告警场景

当收到一条关于平均响应时间问题的调用链告警,只需查看告警内容下方的查看原因链接,故障定位平台就能帮助我们快速定位出可能的原因。下图是调用链告警示例:

图1 调用链告警

调用链是vivo服务级监控的重要手段,上图红框内原因链接是故障定位平台提供的根因定位能力。

2.3 分析效果

通过以上两种方式进入故障定位平台后,首先看到的是故障现场,下图表示服务A的平均响应时间突增。

图2 故障现场

上图红框区域,A服务从10:00左右,每分钟平均时延从78ms开始增长,突增到10:03分的90ms左右。

直接点击图2蓝色的【根因分析】按钮,就可以分析出下图结果:

图3 根因分析结果

从点击按钮到定位出原因的过程中,系统是如何做的呢?接下来我们看下系统的分析流程。

三、分析流程

图4 分析流程
红色箭头各部分组成了一个递归调用

图4是根因分析的主要流程,下面将通过文字详细描述:

  • 第一步:前端将异常服务名和时间作为参数通过接口传递到后端;

  • 第二步:后端执行分析函数,分析函数调用检测算法,检测算法分析后,返回一组下游数据给分析函数(包括下游服务及组件、波动方差及pointType);

  • 第三步:分析函数根据pointType做不同逻辑处理,如果pointType=END_POINT,则结束分析,如果pointType=RPC_POINT,则将下游服务作为入参,继续执行分析函数,形成递归。

    RPC_POINT包含组件:HTTP、DUBBO、TARS

    END_POINT包含组件:MYSQL、REDIS、ES、MONGODB、MQ

最终分析结果展示了造成服务A异常的主要链路及原因,如下图所示:

图5 链路及原因

在整个分析过程中,分析函数负责调用检测算法,并根据返回结果决定是否继续下钻分析。而核心逻辑是在检测算法中实现的,接下来我们看下检测算法是如何做的。

四、检测算法

4.1 算法逻辑

检测算法的大体逻辑是:先分析异常服务,标记出起始时间、波动开始时间、波动结束时间。然后根据起始时间~波动结束时间,对异常服务按组件和服务名下钻,将得到的下游服务时间线分成两个区域:正常区域(起始时间~波动开始时间)和异常区域(波动开始时间~波动结束时间),最后计算出每个下游服务的波动方差。大体过程如下图所示:

图6 检测算法

图中异常服务A调用了两个下游服务B和C,先标记出服务A的起始时间、波动开始时间、波动结束时间。然后将下游服务按时间线分成两个正常区域和异常区域,标准是起始时间 到 波动开始时间属于正常区域,波动开始时间 到 波动结束时间属于异常区域。

那么波动方差和异常原因之间有什么关联呢?

其实波动方差代表当前服务波动的一个量化值,有了这个量化值后,我们利用K-Means聚类算法,将波动方差值分类,波动大的放一起聚成一类,波动小的放一起聚成一类。如下图:

图7 K-Means聚类      

最后我们通过聚成类的波动方差,过滤掉波动小的聚类,找到最可能造成异常服务的原因。以上是对算法原理的简要介绍,接下来我们更进一步,深入到算法实现细节。

4.2 算法实现

(1)切分时间线:将异常时间线从中点一分为二,如下图:

图8 切分时间线

(2) 计算波动标准差:运用二级指数平滑算法对前半段进行数据预测,然后根据观测值与预测值计算出波动标准差,如下图:

图9 计算波动标准差

(3)计算异常波动范围:后半段大于3倍波动标准差的时间线属于异常波动,下图红线代表3倍波动标准差,所以异常波动是红线以上的时间线,如下图:

图10 计算异常波动范围

(4)时间点标记:红线与时间线第一次相交的时间点是波动开始时间,红线与时间线最后一次相交的时间点是波动结束时间,起始时间和波动结束时间关于波动开始时间对称,如下图:

图11 时间点标记

(5)服务下钻:根据起始时间~波动结束时间,对异常服务按组件和服务名下钻,得到下游服务时间线,如下图:

图12 服务下钻

(6)计算正常区域平均值:下游服务的前半段是正常区域,后半段是异常区域,先求出正常区域的平均值,如下图:

图13 计算正常区域平均值

(7)计算异常区域波动方差:根据异常区域波动点与正常区域均值之间的波动计算波动方差和波动比率,如下图:   

图14 计算异常区域波动方差

(8)时间线过滤:过滤掉波动方向相反、波动比率小于总波动比率的1/10的时间线,排除正常时间线,如下图:

图15 时间线过滤

(9)对剩余下钻时间线进行KMeans聚类,如下图:

图16 进行KMeans聚类

五、简要总结

1、一种小而美的根因定位算法,利用方差量化波动,再通过排除法过滤掉波动小的下游,留下可能的下游作为原因。这种算法可以利用我们较完善的链路数据,可实现的成本低;

2、针对下游依赖场景的原因定位,准确率可达85%以上。但没有覆盖自身原因造成的故障(如GC、变更、机器问题等);

3、分析结果只能提供大概的线索,最后一公里还是需要人工介入;

4、故障定位算是AI领域的项目,开发方式与传统的敏捷开发有一定的区别:

  • 角色职责:领域专家(提出问题) → AI专家(算法预研) → 算法专家(算法实现和优化) → 应用专家(工程化开发)

  • 操作步骤:调研论文和git(业界、学界、同行) → 交流 → 实践 → 验证

  • 项目实施:复杂问题简单化,先做简单部分;通用问题特例化,找出具体案例,先解决具体问题。

六、未来展望

1、故障预测:当前我们主要关注服务出现异常后,如何检测异常和定位根因,未来是否能够通过一些现象提前预判故障,将介入的时间点左移,防患于未然;

2、数据质量治理:当前我们的监控数据都有,但数据质量却参差不齐,而且数据格式的差异很大(比如日志数据和指标数据),我们在做机器学习或AIOps时,想要从中找出一些有价值的规律,其实挺难的;

3、经验知识化:当前我们的专家经验很多都在运维和开发同学的脑海中,如果将这些经验知识化,对于机器学习或AIOps将是一笔宝贵的财富;

4、从统计算法往AI算法演进:我们故障定位现在实际用的是统计算法,并没有用到AI。统计往往是一种强关系描述,而AI偏向弱关系,可以以统计算法为主,然后通过AI算法优化的方式。

参考资料

  • [1]Dapper, a Large-Scale Distributed Systems Tracing Infrastructure[EB/OL],2010-04-01.

  • [2]Holt-Winters Forecasting for Dummies (or Developers)[EB/OL],2016-01-29.

  • [3]k-means clustering[EB/OL],2021-03-09.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/151241.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023最新连锁店软件排名,国内十大连锁店管理软件新鲜出炉!

普通的数据工具、人工管理难以满足连锁店老板们的需求,正所谓“有需求就有市场”,随着连锁店、加盟店如雨后春笋般在城市里出现,连锁店软件也越来越多。究竟哪一款连锁店管理软件,才能满足老板们的需求?小编收集了国内…

9/365 java 数组 内存

1.数组 声明: int[] a;//首选 int a[];//一般不用 创建: int[] a new int[10]; // 需指定数组大小 初始化: 静态初始化: int[] a {8,9,10}; String[] s {new String("hello"), new String("world")…

南邮研究生考试历年真题知识点总结

下边的知识点是我在做南京邮电大学考研历年真题时遇到自己不会的题时整理出来的。第九部分是做mooc课后习题时整理出来的,希望对各位同学有所帮助。 md文档网址:https://gitee.com/infiniteStars/wang-dao-408-notes/blob/master/考研笔记/南邮数据结构知…

内存函数:学习笔记7

目录 一.前言 二. memcpy模拟实现 三. memmove模拟实现 四.memcmp模拟实现 一.前言 计算机内存的实质就是以字节为编号单元的二进制序列集合,操作内存时我们应具有这样的视角。 二. memcpy模拟实现 库函数memcpy函数首部:void *memcpy( void *dest, …

量子计算机“九章”

1.中国量子计算机“九章”实现量子霸权 2020年12月,中国科学技术大学宣布该校成功构建光子量子计算原型机“九章”。“九章”是中国科学技术大学潘建伟团队、中科院上海微系统所和国家并行计算机工程技术研究中心合作完成。“九章”的名字是来源于中国历史上最重要…

算法设计与分析-分支限界法习题

7-1 布线问题印刷电路板将布线区域划分成 nm 个方格阵列,要求确定连接方格阵列中的方格a 点到方格b 的最短布线方案。在布线时,电路只能沿直线布线,为了避免线路相交,已布了线的方格做了封锁标记,其他线路不允许穿过被…

大数据开发之利剑 -- TDengine

前言 在大数据技术全球爆炸的时代,以及大数据在各行各业的实际应用,大数据的快速发展就像计算机和互联网一样,很可能成为新一轮的技术革命。数据处理、机器学习、AI等新兴技术诞生,会改变数据世界的许多算法和理论基础&#xff0c…

DAY-1 | Java数据结构之链表:删除无头单链表中等于给定值 val 的所有节点

目录 一、题干 🔗力扣203. 移除链表元素 二、题解 1、思路 2、完整代码 一、题干 🔗力扣203. 移除链表元素 二、题解 1、思路 题干的意思是,要删除链表中所有指定的元素。最暴力的方法是,依次遍历链表中的各个节点&#x…

Day3 XML方式的Spring应用

全文总结基于XML配置1、学习了bean标签,2、三种配置bean的方式:1、静态工厂;2、实例工厂和3、自定义实现factorybean1 SpringBean 的配置类inin-method 与构造方法不同,构造方法是创建对象的,等对象创建以后使用inin-m…

2023年全国最新消防设施操作员精选真题及答案

百分百题库提供消防设施操作员考试试题、消防设施操作员考试预测题、消防设施操作员考试真题、消防设施操作员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 1、对外观目测判断,下列哪种情况不应报废?(  ) A、铭牌标志脱落 B、瓶…

pyqt5加载matplotlib图形

matplotlib的图形处理非常强大。今天花了很长时间才将matplotlib图形嵌入到pyqt5中。在这里记录一下,便于以后查寻。有些可能还理解不到位。开始要导入几个模块:from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvasFigur…

tomcat下载和配置(简单,详细)

下载 官网:http://tomcat.apache.org/ 找到需要的版本,点击download 在download页面,选择需要下载的。(分为压缩版和安装版,我比较推荐压缩版,省事解压缩就好) 配置 首先!&…

[ 数据结构 ] 集合覆盖问题(贪心算法)

0 集合覆盖问题 假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号 广播台覆盖地区K1北京,上海,天津K2广州,北京,深圳K3成都,上海,杭州K4上海,天津K5杭州,大连 思路分析①:穷举法,…

LeetCode 64 最小路径和 | 解题思路分享

原题链接:64. 最小路径和 题目难度:中等 题目描述 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 **说明:**每次只能向下或者向右移动一步。 示例 1&…

Apache Spark + 海豚调度:PB 级数据调度挑战,教你如何构建高效离线工作流

2010年,我国进入移动互联网,数据规模成几何式增长。在大数据开源技术领域,以Hadoop为核心的大数据生态系统面对海量数据也不断发展与迭代,大数据处理流程中的各个开源组件,也一起开启了狂飙突进的大数据时代&#xff0…

MyBatis---初入

MyBatis快速入门 文章目录MyBatis快速入门MyBatisMyBatis开发步骤添加MyBatis的坐标创建user数据表编写user实体类编写映射文件UserMapper.xml编写核心文件SqlMapConfig.xml编写测试类MyBatis Mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只…

疫情放开后,如何保护居家员工的办公安全?

随着疫情的放开,大多数企业的员工因“阳”不得不在家办公。据当前的趋势来看,一线城市的大小企业已经出现高比例的员工感染,不少工作人员或出于安全的考虑选择居家办公。但无论是被迫居家隔离,还是主动远程办公,大多数…

Redis缓存何以一枝独秀?——从百变应用场景与热门面试题中感受下Redis的核心特性与使用注意点

大家好,又见面了。 本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。 作为《深入理解缓存原理与实战设计》系列专栏,在…

国产高清卫星影像时代来了,打造中国版“谷歌地球”!

随着国家数字化战略转型进程不断加快,卫星遥感影像作为基础数据,应用越来越广泛。目前已经成为资源环境调查、监测、评价和管理等不可或缺的技术手段。 不止于此,在推动行业发展、提高生产力以及节约成本等方面,卫星遥感影像都实…

【半监督医学图像分割 2022 CVPR】S4CVnet 论文翻译

【半监督医学图像分割 2022 CVPR】S4CVnet论文翻译 论文题目:When CNN Meet with ViT: Towards Semi-Supervised Learning for Multi-Class Medical Image Semantic Segmentation 中文题目:当CNN与ViT相遇:面向多类医学图像语义分割的半监督学习 论文链接…