ModelCoder: A Fault Model based Automatic Root Cause Localization Framework for Microservice Systems
ModelCoder: 基于故障模型的微服务系统自动根源定位框架
论文标题 | ModelCoder: A Fault Model based Automatic Root Cause Localization Framework for Microservice Systems
论文来源 | IWQoS(B) 2021
论文链接 | 未公布
源码链接 | 未公布
论文的主要内容是介绍了一种名为"ModelCoder"的自动故障根本原因定位框架,用于微服务系统中的故障诊断和定位。该框架基于故障模型和深度学习技术,旨在帮助开发人员快速、准确地找到导致微服务系统中故障的根本原因。
论文的主要创新点和关键内容包括:
总的来说,"ModelCoder: A Fault Model based Automatic Root Cause Localization Framework for Microservice Systems"论文介绍了一种创新的故障定位框架,利用故障模型和深度学习技术实现了自动化的故障根本原因定位。该框架在微服务系统中具有潜在的应用价值,可以帮助开发人员快速定位和解决微服务系统中的故障问题。
「Node feature group」:节点特征组,包括目标节点本身,父节点,子节点和双向节点。
「Node feature」:节点特征,节点特征组中 「explicit nodes」 和 「implicit nodes」 分布。
「Fault model」:故障模型,故障根因节点的特征为故障模型。
对于挑战赛的数据集,论文中定义了四种故障模型:
「Node feature code」:节点特征的形式化表示,包含四种故障模型特征。
节点特征 使用 8 位编码表示,按照下文的意思应该只用了 7 位。
按照论文的意思故障模型应该用的是根因节点。
第四五六七位含义模糊。
三元组包含故障根因节点,故障类型,故障模型编码:「(cmdb_id, fault_type, code)」,然后存储在**「标准编码库」**中。
论文中定义了非常多的概念,在阐述方法前先进行解释:
在图中定义了三种类型的节点:
微服务系统是一种架构风格,将单个应用程序开发为一组在其进程中运行并通过轻量级消息机制进行通信的小型服务。虽然微服务架构能够快速、频繁、可靠地交付大型、复杂的应用程序,但对于运维人员来说,定位微服务故障的根本原因越来越具有挑战性,这种故障通常发生在服务节点上,并传播到整个系统。为此,在本文中,我们首先引入部署图和服务依赖图的概念来描述服务节点之间的部署状态和调用关系。然后,我们基于构建的图制定微服务系统中的根本原因定位问题,其中定义故障模型以捕获故障根本原因的特征。后来开发了一种基于故障模型的自动根本原因定位框架,称为 ModelCoder,通过与预定义的故障模型进行比较,找出未知故障的根本原因。我们在跨越 15 天的真实微服务系统监控数据集上评估 ModelCoder。通过大量实验表明,ModelCoder平均可以在80秒内定位故障根因节点,与state-of-the-art根因定位算法相比,根因定位精度(达到93%)提高了12% .索引词——微服务、故障模型、根本原因定位
微服务是一种广泛使用的架构,将单个应用程序划分为一组服务节点。每个服务节点都是一个单独的进程,可以独立部署、编译和运行。服务节点通过轻量级的消息机制相互协调配合,为用户提供完善的服务[1]。
微服务可以提高Web应用的抽象性、模块化和可扩展性[2],但也带来了一些新的问题,其中之一就是故障的根源定位。快速准确地定位根本原因可以减少故障排除时间和经济损失。微服务系统中庞大的服务节点和监控数据使得它成为可能*通讯作者是彪涵。极难快速自动定位根本原因 [3]。现有的工作应用日志分析工具[4]只能提供非常简单的帮助,并且强烈依赖于操作人员的经验。因此,迫切需要设计一个自动的根本原因定位框架。
首先,由于微服务系统有数百个服务节点[5],服务节点之间的调用关系复杂且动态。因此,现有的基于静态拓扑或模型的根本原因定位算法并不适用于微服务系统。
其次,由于一个故障往往涉及多个服务节点[6],单个服务节点的分析无法准确捕捉到故障的所有特征。此外,故障的特征是多种多样的,不同故障的根源节点是正常的还是异常的。因此,我们需要从多节点的规模来分析故障。
为了应对这些挑战,我们首先定义部署图和服务依赖图来描述服务节点之间的复杂关系。将异常节点分为显式节点和隐式节点,进一步表征故障特征。根据上述定义,我们制定了微服务系统的故障根本原因定位问题。为了解决这个问题,我们开发了一个基于故障模型的自动根本原因定位框架ModelCoder,它由三个模块组成:数据预处理、已知故障分析和未知故障分析。基于一种新颖的编码技术,我们定义了故障模型来表示故障的特征,从而将根本原因定位规模从单节点提升到多节点。我们使用真实世界的微服务系统 [7] 的监控数据来评估 ModelCoder。与最先进的根本原因定位算法相比,ModelCoder im 证明定位精度提高了 12%。广泛的实验结果表明,ModelCoder 的根本原因定位时间可以大大减少,而不会显着影响定位精度。
本文的主要贡献如下:
本文的其余部分安排如下。第二节简要回顾了相关工作。第三部分描述了系统模型并制定了根本原因定位问题。第四节提供了我们提出的 ModelCoder 的架构。第五节介绍了ModelCoder的实现细节。第六节讨论了 ModelCoder 的评估结果。第七节总结了论文并指出了未来的工作。
本节回顾与根本原因定位相关的工作,并根据其特点将其分为以下三类。
ModelCoder 与上述方法不同。首先,它分析服务节点之间的调用数据,而不是服务节点内部的事件或函数,从而减少系统的根本原因定位开销。其次,实时构建服务依赖图,及时响应系统的拓扑变化。第三,基于故障模型,从多节点层面对故障进行分析,能够准确提取多种故障的特征。
从用户的角度来看,我们通过从调用初始化开始到获取返回数据结束的运行时间来识别特定调用是否异常。
根据以上定义和讨论,我们从理论上制定了微服务系统中的根本原因本地化问题。当微服务系统发生故障时,我们可以得到如下信息:部署图 G D G_D GD,故障期间的一组服务依赖图 G S G_S GS,不同类别的节点集: V n o r 、 V e x 和 V i m V^{nor} 、V^{ex} 和V^{im} Vnor、Vex和Vim ,以及一组已知故障的数量 F K = f 1 , f 2 , . . . , f N K F_K = {f_1, f_2, ..., f_{NK} } FK=f1,f2,...,fNK。
我们需要定位一组未知故障的根本原因节点 F U = { f 1 , f 2 , . . . , f N U } F_U = \{f_1, f_2, ..., f_{N_U} \} FU={f1,f2,...,fNU}。对于未知故障 f i ( f i ∈ F U ) f_i(f_i \in F_U ) fi(fi∈FU),存在一组候选根本原因节点 C i = { v 1 i , v 2 i , . . . , v N i i } C^i = \{v^i_1 , v^i_2 , ..., v^i_{N_i}\} Ci={v1i,v2i,...,vNii} 。对于候选故障根因节点 v k i ( v k i ∈ C i ) v^i_k (v^i_k \in C^i) vki(vki∈Ci),我们将其特征表示为一个向量 v k i = < x 1 , x 2 , . . . , x m > v^i_k =
定义3.1(特征向量之间的距离)。候选故障根因节点vik的特征向量与已知故障fj的距离定义为:
d ( v k i , f j ) = ∑ 1 ≤ n ≤ m α n c o m p a r e ( v k n j , f j n ) c o m p a r e ( a , b ) = { 1 , i f a = b 0 , i f a ≠ b d(v^i_k, f_j) = \sum_{1≤n≤m}\alpha_n compare(v^j_{kn},f_{jn}) \\ compare(a,b)=\begin{cases} 1,if \ a=b\\ 0,if \ a\neq b \end{cases} d(vki,fj)=1≤n≤m∑αncompare(vknj,fjn)compare(a,b)={1,if a=b0,if a=b
其中 α n \alpha_n αn 为向量中每一位比较结果的权重
在分析未知故障 f i f_i fi 时,我们将其候选故障根节点 C i C^i Ci 分为不同的簇,其中心是已知故障 F K F_K FK 满足:
f k = a r g m i n d ( v k i , f j ) ∣ f j ∈ F K f_k = argmin{d(v_k^i, f_j) |f_j \in F_K} fk=argmind(vki,fj)∣fj∈FK
定义3.2 (候选故障根本原因节点得分) v k i v^i_k vki 之间的距离 f k f_k fk 定义为 v k i v^i_k vki 的分值,将 C i C^i Ci 中的候选故障根因节点按分值从小到大排序,得到未知故障 f i f_i fi 的分析结果 A f i A_{f_i} Afi 。
f i 是 r f i , P ( r f i , A f i ) f_i 是 r_{f_i} , P (r_{f_i} , A_{f_i} ) fi是rfi,P(rfi,Afi) 被定义为 r f i 在 A f i r_{f_i} 在 A_{f_i} rfi在Afi 中的位置。
我们的目标是:
M i n i m i z e ∑ f i ∈ F U P ( r f i , A f i ) Minimize \sum_{f_i\in F_U} P(r_{f_i} , A_{f_i} ) Minimizefi∈FU∑P(rfi,Afi)
本节主要介绍如何基于粒子群优化算法优化的编码分析确定故障根因节点和故障类别。
1) Candidate fault root cause node searching候选故障根因节点查找:由于故障一般从服务依赖图的底层向上传播,我们将底层显式节点和隐式节点作为候选故障根因节点。
2)Code comparing代码比较:我们通过计算两个节点的节点特征代码之间的相似性来计算它们的相似性得分,如(5)和(6)所示。由于代码包含四种节点的类别信息:目标节点本身、其子节点、其父节点和其双向节点,我们设置四个系数: α 1 、 α 2 、 α 3 、 α 4 \alpha_1、\alpha_2、\alpha_3、\alpha_4 α1、α2、α3、α4。
S ( c o d e 1 , c o d e 2 ) = ∑ 1 ≤ i ≤ 4 , 1 ≤ j ≤ 7 α i c o m p l a r e ( c o d e 1 j , c o d e 2 j ) { i = 1 , i f j = 1 i = 2 , i f j = 2 o r 3 i = 3 , i f j = 4 o r 5 i = 4 , i f j = 6 o r 7 c o m p a r e ( a , b ) = { 1 , i f a = b 0 , i f a ≠ b S(code_1,code_2) = \sum_{1≤i≤4,1≤j≤7} \alpha_icomplare(code_{1j},code_{2j}) \\ \begin{cases} i=1,if \ j=1\\ i=2,if \ j = 2 \ or\ 3\\ i=3,if \ j=4 \ or \ 5\\ i=4,if \ j=6 \ or \ 7\\ \end{cases}\\ compare(a,b)=\begin{cases} 1,if \ a=b\\ 0,if \ a\neq b \end{cases} S(code1,code2)=1≤i≤4,1≤j≤7∑αicomplare(code1j,code2j)⎩ ⎨ ⎧i=1,if j=1i=2,if j=2 or 3i=3,if j=4 or 5i=4,if j=6 or 7compare(a,b)={1,if a=b0,if a=b
3) Coeffificient optimization系数优化:由于系数取值空间较大,需要寻找合适的值,在一定时间内,我们选择使用启发式算法,最后应用粒子群优化算法[18]。四个系数的值作为粒子的坐标,ModelCoder的根因定位精度作为适应度函数的返回值。我们建立一个四维空间,让粒子在里面运动。具体实验装置和结果见§VB。
4)Coding analysis 编码分析:对每个候选故障根因节点,将其节点特征码与标准编码库中的特征码进行比较,计算相似度得分,取最大值作为该候选故障根因节点的得分,如图所示在(7)中。
g r a d e n o d e i = m a x S ( c o d e n o d e i , c o d e ) ∣ c o d e ⊆ c o d e s grade_{node_i} = max {S(code_{node_i} , code)|code ⊆ codes} gradenodei=maxS(codenodei,code)∣code⊆codes
将候选故障根因节点按照得分从大到小排序,得到未知故障的分析结果。对于候选故障根因节点节点 n o d e i node_i nodei ,三元组 < c m d i d ′ , f a u l t t y p e ′ , c o d e ′ > < cmd_id' , fault_type' , code'> <cmdid′,faulttype′,code′> 从标准编码库中选出 其中:
c o d e ′ = a r g m a x S ( c o d e n o d e i , c o d e ) ∣ c o d e ⊆ c o d e s code' = argmax {S(code_{node_i} , code)|code ⊆ codes} code′=argmaxS(codenodei,code)∣code⊆codes
1)Dataset数据集:数据集来自2020国际AIOps挑战赛,采集自浙江移动运营商搭建的云环境微服务系统监控数据集。监控数据中注入了81个故障的异常调用数据。每个故障持续5分钟,只包含一个故障根因节点。由于ModelCoder只能处理影响系统对用户请求响应时间的故障,我们从所有故障中选择影响响应时间的63个故障,其余18个故障丢弃。以保证每一类故障都包含足够数量的故障,从而生成标准代码,检验算法的准确性。在这63个故障中,29个故障用于已知故障分析,34个故障用于未知故障分析,以测试ModelCoder的根因定位精度和速度。
2)Baseline approach基线方法:为了说明ModelCoder 的根本原因定位精度,选择随机游走作为基线方法,该方法被广泛用作故障原因定位方法[14]、[16]。对比时,我们先构建服务依赖图,判断异常节点。在此基础上,我们分别运行 ModelCoder 和 random walk 来比较它们的性能。
3) Evaluation criteria评估标准:我们使用[16]和[19]提出的PR@K、MAP、AF P来量化每种方法的性能。
1)Effect of Particle Swarm Optimization Algorithm粒子群优化算法的效果:我们设置粒子群优化算法的参数如下:粒子数为10,迭代次数为30,粒子移动范围为[−10, 10 ],最大粒子速度为1。每轮迭代后,计算所有粒子的平均适应度函数返回值,作为本轮ModelCoder的得分。结果如图2所示,其中横坐标为迭代次数,纵坐标为MAP和AFP的值。如图2所示,ModelCoder的准确率逐渐上升,经过15次迭代后达到最优值。 MAP值从0.896增加到0.929,AFP值从3.835减少到0.8左右。由于我们将MAP值作为粒子的适应度函数值,经过15次迭代后,粒子的分数继续在具有最佳MAP值的区域移动,导致AFP值仍然略有波动。
2)Root Cause Localization Accuracy:将ModelCoder与随机游走进行比较,以评估其根本原因定位精度。根据上一节粒子群优化算法的结果,设置系数 α 1 、 α 2 、 α 3 、 α 4 为 [ 2 , 7 , 3 , 3 ] α_1、α2、α3、α4为[2,7,3,3] α1、α2、α3、α4为[2,7,3,3]。
3)Effect of Service Dependency Graph Density服务依赖图密度的影响:如果我们在故障时间内建立所有的服务依赖图,将会有很多重复的服务依赖图;因此,我们从 m 个服务依赖图中选择一个并改变 m,然后记录 ModelCoder 的准确性和速度的变化。我们对每个 m 值重复实验 10 次,并记录所用时间的 95% 置信区间上限。结果如图4所示。