似曾相识:面向重复类型故障的可操作故障定位

导读

搜索引擎、在线视频和电子银行等在线服务系统在人们的日常生活中有着越来越重要的作用。但是,由于在线服务系统包含众多有着复杂依赖关系的组件(例如服务器、容器和微服务等等),在线服务系统中的故障难以避免,并且难以进行故障定位。本文介绍清华大学 NetMan 实验室在软件工程顶级会议 ESEC/FSE 2022 发表的一篇论文, Actionable and Interpretable Fault Localization for Recurring Failures in Online Service Systems。

该论文提出了一种可操作、可解释的面向在线服务系统中重复类型故障的故障定位方法,DéjàVu。DéjàVu的名字来自一个法语短语 déjà vu,意思是似曾相识。DéjàVu 采用了一种基于图神经网络的定位模型,该模型以故障发生时在线服务系统中各个组件的监控指标和组件间的依赖关系作为输入,输出故障的位置和类型给运维人员。同时,该论文还提出了两种提供可解释性的方法。实验结果表明DéjàVu可以将真正的故障根因平均排序到第 1.66~5.03 名,优于对比算法 54.52%∼97.92%,并且具有良好的时间效率和泛化性。


背景

1.1 在线服务系统

在线服务系统包含数量众多的各种类型的组件,例如服务器、容器、数据库和微服务等。这些组件之间有着复杂的依赖关系,主要包括调用关系和部署关系两类。下图展示了一个小型微服务系统(称为系统 A)中 OSB、服务和数据库之间的调用关系,以及 OSB、服务、容器和服务器之间的部署关系。

在这里插入图片描述

为了监控这样复杂的系统,运维人员在各种组件上会配置许多监控指标,这些监控指标以24 × 7的模式监控组件的状态,一般被认为是故障的最直接的信号。例如,下表展示了 系统 A 中不同类型的组件上的各类监控指标。

在这里插入图片描述

1.2 可操作故障定位

故障定位任务可以有不同的定位范围(Scope),从高层次到底层次,可以定位到不同粒度的结果。一方面,因为在线服务系统中故障的复杂性,根因是非常多样的(例如,业务代码bug、人员操作失误、硬件故障、网络波动、第三方服务失效等等),自动化找到最根本的原因非常困难。另一方面,进行故障止损往往并不需要具体的根因,而故障修复的时效性并不迫切。例如,一次由内存泄露引起的故障,运维人员只需要知道哪台服务器出现了内存不足的问题,就可以通过重启服务器、迁移服务等等手段进行止损,而不需要知道具体导致内存泄漏的进程、代码等真正的根因。

现有的故障定位方法往往聚焦于不可操作的粒度,例如单个指标或者组件。单个指标粒度过细,例如如果仅仅定位到内存使用率,运维人员很难确定具体是什么导致了内存不足,是内存泄露还是流量过高。单个组件粒度过粗,运维人员也还需要进一步的故障定位才能采取止损操作。DéjàVu聚焦于定位到可操作的粒度,即运维人员可以立即采取故障止损操作的粒度。DéjàVu将此定义为“在哪里发生了什么故障”,即故障位置(即组件名称)和故障类型的组合。为了方便,可以称一个组件和其上一种故障类型的组合为一个故障单元,所以DéjàVu的定位目标就是根因故障单元。

1.3 重复类型故障

由于错误或者不及时的故障修复措施、 高使用率导致的问题以及硬件故障等等原因,故障可能重复发生。论文称这样在不同位置发生的、由相同类型根因导致的故障为重复类型故障(Recurring Failures)。该论文调研了一家商业银行一年时间的576 个真实故障,如下图所示,不同的系统中重复类型故障的比例都很高。重复类型主要包括外部原因、硬件原因和中间件原因, 比如非法请求、第三方服务不可用、磁盘损坏、低效的 SQL 查询和数据库索引缺失等等。非重复类型主要是逻辑原因,比如代码缺陷、流程设计缺陷、数据问题 (例如手工维护促销优惠商户名单时操作失误)等。因为重复类型故障的大量存在,DéjàVu 仅面向重复类型故障进行故障定位已经足够重要。

图片

重复类型故障的大量存在还启发作者使用机器学习模型,从大量的同类历史故障中学习故障的症状和根因之间的关联关系。

主要方法

DéjàVu 的工作流程如下图所示。当一个故障事件发生时,监控系统触发 DéjàVu 进行故障定位。DéjàVu使用当前时刻的监控指标和故障依赖图(FDG,在下文中详细介绍)作为输入,输出根因故障单元和对应的解释给运维人员。运维人员完成故障处理之后,将真正的根因记录到历史故障数据库中,用于之后更新定位模型。

在这里插入图片描述

2.1 故障依赖图

基于历史上发生过的故障(“发生过”意味着相同类型故障再出现时就是重复类型故障),运维人员可以总结出每种类型的组件上可能会发生什么类型的故障,并且将故障类型的粒度设定为令自己足以马上采取止损操作的粒度。基于此,通过组合所有的组件和对应的故障类型,可以得到一个在线服务系统中所有已知的故障单元。基于组件间的调用关系和部署关系,可以将这些故障单元连接起来,组成一张故障依赖图。下图展示了系统 A 的故障依赖图(局部)。

在这里插入图片描述

由于在线服务系统中可能会频繁发生硬件、软件或者配置的变更,因此故障依赖图也会经常发生变化。所以,DéjàVu 会在每次故障事件发生时构建一次故障依赖图。

每个故障单元的输入特征是对应的组件上,和该类故障相关的监控指标。例如,对于“服务器 1 服务水平”这个故障单元,对应的输入特征就是服务器 1 上反映服务水平的若干个指标:平均响应时间、成功率和 QPS。每类故障需要哪些指标作为输入,应该由运维人员在定义重复发生的故障类型时一并总结。

2.2 定位模型设计

DéjàVu的定位模型采用了一种二分类的框架:它为每一个故障单元输出一个0 到 1 的根因分数,表示该故障单元是根因的可能性。相比于多分类(为整个故障依赖图输出一个 softmax 的向量),二分类的框架可以让模型在不同位置的同类故障上共享模型参数,从而获得更好的泛化性。

在这里插入图片描述

首先,DéjàVu 使用 GRU 和 CNN 将一个故障单元的指标编码为一个固定长度的向量(所有的故障单元编码到相同的维度)。为了泛化性,同一类的故障单元共享同一个特征提取模型。

然后,DéjàVu 使用 GAT 将当前故障单元在故障依赖图上的结构信息,以及邻域内其他故障单元的特征聚合到一起,以建模故障在不同故障单元上传播的模式。为了建模多跳的故障传播,DéjàVu采用了多层的 GAT。

最后,DéjàVu 使用一个全连接网络为聚合特征计算一个根因分数。为了泛化性,该全连接网络在所有的故障单元间共享。

DéjàVu 将所有故障单元按根因分数降序排序,推荐给运维人员。运维人员可以从前往后依次排查最有可能的根因故障单元。

2.3 可解释性

一方面,为了解释单次定位结果,作者希望给出 DéjàVu 是从哪些历史故障中学到给出当前的定位结果的。为此,作者提出了一种基于 DéjàVu 给出的聚合特征计算故障之间相似度的方法。据此,DéjàVu 可以把和当前故障最相似的历史故障推荐给运维人员。运维人员可以根据这些历史故障对应的工单,理解故障现象和根因之间的联系,并参考其止损方案。

另一方面,为了解释 DéjàVu 模型本身,作者提出使用一组决策树(一种可解释的机器学习模型)模拟训练好的 DéjàVu 模型,尽可能逼近(而不是超越)其结果。然后将这些决策树作为对 DéjàVu 模型的解释。这在可解释机器学习领域被称为 surrogate models 方法。

实验评估

3.1 数据集

如下表所示,该论文在四个系统上进行了实验,包含三个真实系统和一个开源的微服务基准系统,Train-Ticket(https://github.com/FudanSELab/train-ticket)。

在这里插入图片描述

在数据集 A、B 和 D 中,故障事件是通过故障注入的方式生成的,常见的故障注入方式包括 CPU 过载、网络延迟和网络丢包等。

3.2 定位准确率

该论文同若干类故障定位方法中最新的工作进行了对比,部分结果如下图所示:图片

加粗样式
在这里插入图片描述

其中,MAR 表示 DéjàVu 为每个故障根因给出的平均排名,A@k 表示 DéjàVu 给出的前 k 个推荐故障单元中包含真正根因的概率。效应值(Cohen’s d,参见下图或者 https://www.wikiwand.com/en/Effect_size#Cohen’s_d )和 p 值(t-test,小于0.05即显著)表示 DéjàVu 相比于对比算法提升的统计显著性,都是基于 MAR 进行计算的。

在这里插入图片描述

在各个数据集上,DéjàVu 的 MAR 达到了 1.66∼5.03,优于对比算法 11.84%∼99.41%。DéjàVu 的 MAR 平均可以达到 2.82,低于对比算法 54.52%∼97.92%。总的来说,DéjàVu 能够取得良好的故障定位性能,并显著超越对比算法。

3.3 时间效率

如下图所示,DéjàVu 为每个故障进行故障定位的时间开销极小,可以忽略。DéjàVu 的训练开销大约是几十分钟到几小时,完全可以接受。这是因为 DéjàVu 模型实际上非常小,一般只有几万参数。另外,训练是离线进行的,不会影响故障定位的时效性。

在这里插入图片描述

值得注意的是,传统的机器学习模型(决策树、梯度提升、随机森林和支持向量机)需要依赖非常耗时的时序特征提取。因此虽然随机森林等模型的定位性能还不错,但是其并不实用。

3.4 泛化性

如下图所示,DéjàVu 在历史故障中出现过和未出现过(存在同类故障,但是同一位置上未出现过该类故障)的故障事件中都能为根因给出很低的排名,并基本都显著优于对比算法。图片

可复现性(Reproducibility)

该论文的数据集、代码和用于构建 Train-Ticket 数据集的代码都已经开源:https://github.com/NetManAIOps/DejaVu。感兴趣的可以 Star 一下。

在每个数据集中,有几个关键的文件:

  • faults.csv 记录了所有故障时间的时间和根因
  • graph.yml 描述了故障单元的定义和 FDG 的结构
  • metric.csv和metrics.norm.csv是所有的指标,其中后者是前者归一化后的结果,DéjàVu 需要读取后者。

后缀为pkl的文件是 Python pickle输出的文件,仅用于加速读取。FDG.pkl是代码中 FDG类通过 pickle 输出的结果,里面集成了 FDG 、指标和所有的故障。

运行代码可以参考 README 文件中的说明,如下图所示:

在这里插入图片描述

在这里插入图片描述
用于构建 Train-Ticket 数据集的代码位于单独的 GitHub 仓库中:https://github.com/lizeyan/train-ticket

  • deployment/kubernetes-manifests/k8s-with-jaeger中包含了如何在一个k8s集群上部署所有的组件的说明和对应的配置文件
  • FDG_data_collection/ 包含收集指标数据的脚本
  • workload/ 包含生成流量的脚本

讨论

该论文聚焦于在线服务系统中的可操作故障定位问题,并提出了一种面向重复类型故障的可操作、可解释定位方法,DéjàVu。和此前的故障定位工作不同,DéjàVu将定位目标限定在了“性价比”最高的"可操作"层次。

基于对实际系统的调研,DéjàVu 仅面向重复类型故障进行故障定位。实际上,对于非重复类型故障,我们也不太可能让算法给出一个从来没出现过、没定义过的故障类型。但是在实际系统中,非重复类型故障仍然是经常出现的,此时 DéjàVu 给出的定位结果是不可信的。对此,我们可以借助 DéjàVu 中提出的计算故障相似度的方法,如果当前故障和所有历史故障都不太相似,那么它就很可能是非重复类型故障,我们可以通知运维人员采用其他方法得到的定位结果而不依赖 DéjàVu 。

DéjàVu的定位模型通过共享参数以及使用结构无关的网络(即 GAT)等方式实现了泛化性。泛化性对于在线服务系统中的故障定位非常重要。因为庞大的规模,在线服务系统中可能有大量的同类组件,其中一个组件上发生的故障可能在其他同类组件上发生,并引起类似的症状。但是在许多其他领域的故障定位工作中不需要考虑这点。

DéjàVu目前仅仅将指标作为故障单元的输入特征。通过神经网络,可以比较容易地融合日志等多模态数据作为故障单元的输入特征。

DéjàVu存在的一个局限性是难以表征未知的故障类型。因为目前故障单元的定义依赖已知的故障类型和对应的指标组。但是如果发生的故障是新类型时,描述已知类型故障的指标不一定能描述新类型故障,那么此时用已知故障单元的聚合特征计算故障相似度就可能存在问题。如果用每个组件上的所有指标作为输入特征,那么输入维度会过高,难以训练模型。

DéjàVu 没有进行实际意义上的推理或者说根因分析,而更类似将当前故障的症状和有根因标注的历史故障进行匹配。只不过,和一些直接进行上述过程的工作相比(例如论文相关工作中提到的 Fingerprint、iSQUAD和JSS’20),DéjàVu通过深度学习模型实现了更加准确、更加快速和更加有泛化性的故障定位。

6.总结

本文介绍了在线服务系统中一个面向重复类型故障的可操作故障定位方法,DéjàVu。由于篇幅所限,本文没有涉及过多的细节,详细内容请查看原论文。该论文的代码和数据集也都已公开,感兴趣的可以 Star 一下。

论文名称:Actionable and Interpretable Fault Localization for Recurring Failures in Online Service Systems

论文作者:Zeyan Li, Nengwen Zhao, Mingjie Li, Xianglin Lu, Lixin Wang, Dongdong Chang, Xiaohui Nie, Li Cao, Wenzhi Zhang, Kaixin Sui, Yanhua Wang, Xu Du, Guoqiang Duan, Dan Pei

论文地址:https://dl.acm.org/doi/abs/10.1145/3540250.3549092

代码仓库:https://github.com/NetManAIOps/DejaVu

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

49 样式迁移【李沐动手学深度学习v2课程笔记】

1. 样式迁移(Style Transfer) 计算机视觉的应用之一,将样式图片中的样式(比如油画风格等)迁移到内容图片(比如实拍的图片)上,得到合成图片 可以理解成为一个滤镜,但相对于滤镜来讲…

leetcode 常考题-动态规划算法-单词拆分

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例 1: 输入: s "leetcode"…

七分钟,拿下口头offer

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 个人IP:shigen 🧑‍💻🧑‍💻面2:行了…

每日一题 — 最大连续 1 的个数III

解法一:暴力枚举 先定义left和right双指针,left先固定在起始位置,遍历right当值等于1的时候,直接跳过,等于0的时候,zero计数器加一当zero等于k的时候,就开始记录此时最大长度是多少然后left加一…

做抖店要用到的东西:什么是精选联盟?开通到使用一篇详解!

哈喽~我是电商月月 做抖音小店的新手朋友在翻阅资料时一定接触过精选联盟这个东西 但它到底是干嘛的?如何开通。又是如何使用!还没入手的朋友是不知道的 所以,今天我就给大家讲解一下精选联盟的入驻方法,以及在运营时要怎么正确…

蓝桥杯第十届c++大学B组详解

目录 1.组队 2.年号字符 3.数列求值 4.数的分解 5.迷宫 6.特别数的和 7.完全二叉树的权值 8.等差数列 9.后缀表达式 10.灵能传输 1.组队 题目解析:就是在个篮球人中选择这个最大的成绩,每个人只能选择一次不能重复选择。选满5人之后的成绩是最…

企业如何部署有效的防泄密软件策略?

在企业信息化飞速发展的今天,数据泄露的后果可能是灾难性的,不仅会导致经济损失,还可能损害公司的声誉。因此,制定和部署一个全面而有效的防泄密软件策略对于防范这种风险至关重要。策略的目标不仅是阻止外部攻击,更要…

《C++程序设计》阅读笔记【7-堆和拷贝构造函数】

🌈个人主页:godspeed_lucip 🔥 系列专栏:《C程序设计》阅读笔记 本文对应的PDF源文件请关注微信公众号程序员刘同学,回复C程序设计获取下载链接。 1 堆与拷贝构造函数1.1 概述1.2 分配堆对象1.3 拷贝构造函数1.3.1 默…

多线程(进阶篇小白易懂版)

文章目录 多线程为什么要有多线程多线程案例线程通讯分传主线程通讯主传分关闭线程线程锁 多线程 概念:多线程就是多个线程同时工作的过程,我们可以将线程看作是程序的执行路径,每个线程都定义了一个独特的控制流,用来完成特定的…

DataX 数据库同步部分源码解析

在工作中遇到异构数据库同步的问题,从Oracle数据库同步数据到Postgres,其中的很多数据库表超过百万,并且包含空间字段。经过筛选,选择了开源的DataXDataX Web作为基础框架。DataX 是阿里云的开源产品,大厂的产品值得信赖&#xff…

【JavaWeb】Day39.MySQL概述——数据库设计-DQL(二)

数据库设计-DQL 聚合函数 聚合函数查询就是纵向查询,它是对一列的值进行计算,然后返回一个结果值。(将一列数据作为一个整体,进行纵向计算) 语法: select 聚合函数(字段列表) from 表名 ; 注意 : 聚合…

LeetCode 热题 100 | 多维动态规划(二)

目录 1 5. 最长回文子串 2 1143. 最长公共子序列 菜鸟做题,语言是 C 1 5. 最长回文子串 核心思想:把总问题拆解为若干子问题。 总问题:从第 i 个字母到第 j 个字母是回文串子问题:从第 i 1 个字母到第 j - 1 个字母是回文…

Obsidian的初步了解、安装及使用

一、为什么是Obsidian? 笔记软件我用的还是比较多了,一开始用有道云笔记,其实我个人觉得有道云笔记还是做的不错的,除了广告多点、功能弱一点、更新慢一点、偶尔收藏会有问题以外还是不错的,免费软件里性价比算是还可…

前端开发中地图定位与距离计算的应用实践

前端开发中地图定位与距离计算的应用实践 在前端开发中,地图功能的应用日益广泛,无论是用户位置的定位、目标距离的计算,还是地址的解析与展示,地图都发挥着不可替代的作用。本文将重点介绍前端开发中实现地图定位、距离计算以及…

windows 系统下全新下载安装 mysql8.0 数据库(详细)

windows 系统下全新下载安装 mysql8.0 数据库(详细) 段子手168 1、登录官方网站下载: https://dev.mysql.com/downloads/windows/installer/ 2、下载最新版本,一般可能需要注册登录,下载其他历史版本,请…

【LAMMPS学习】八、基础知识(1.3)从一个输入脚本运行多个模拟

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

【智能算法】省时方便,智能算法统计指标——一键运行~

目录 1.常用统计指标2.参数统计检验3.结果展示4.自定义修改测试框架 1.常用统计指标 测试智能算法性能时,常常会用到以下5种常用指标,简单不赘述: 最优值、最差值、均值、中位数、标准差 2.参数统计检验 单纯依靠常用统计指标说服力不足&…

【noVNC】使用noVNC实现浏览器网页访问vnc(基于web的远程桌面)

1.VNC本身提供的http连接方式,可传输文件,画面有卡顿,需要安装jre 2.noVNC访问方式,不可传输文件,画面较为流畅,不用安装插件运行环境 一、noVNC 是什么 Web 端的Vnc软件,通过noVNC&#xff0…

CSS 实现伸缩导航仪表板侧边栏菜单

CSS 实现伸缩导航仪表板侧边栏菜单 效果展示 展开状态 收起状态 CSS 知识点 回顾曲面圆角的实现知识点 字体库准备 菜单的图标使用的是ionicons的图标库&#xff0c;所以需要页面需要引入对应的文件。 <scripttype"module"src"https://unpkg.com/i…

进程间通信 (匿名管道)

一、进程间通信的概念 进程间通信是一个进程把自己的数据交给另一个进程&#xff0c;它可以帮助我们进行数据传输、资源共享、通知事件和进程控制。 进程间通信的本质是让不同的进程看到同一份资源。因此&#xff0c;我们要有&#xff1a; 1、交换数据的空间。2、这个空间不能由…