转载原链接:https://jckling.github.io/2021/01/23/Other/Root%20Cause%20Analysis%20of%20Anomalies%20of%20Multitier%20Services%20in%20Public%20Clouds/
多层服务或云应用涉及上百个组件,而这些组件又分布在不同的主机上。IaaS 云允许租户共享物理计算基础设施,可能影响性能。
公有云上租户的多层服务出现异常,可能是租户自身服务组件的问题,也可能是被其他租户的服务影响。
多层服务组件之间的依赖关系非常复杂,入侵式修改租户的服务组件代码不可行。
考虑错误传播距离、错误传播概率,解决方案包含 2 个部分
在真实世界的小规模云平台上实现并部署了该系统,使用三层 Web 应用程序和 Storm 应用程序进行了实验,证明了解决方案可以在虚拟机级别和进程级别定位异常根源。
对多种原因引起的异常进行了模拟实验,同时说明了在定位算法中采用相似度评分和随机漫步传播两步的合理性和必要性。实验结果表明,在不同场景下,定位异常的平均精度比现有方法提高了 15% ~ 71% 。
Pivot Tracing、伪异常聚类算法…… 云环境下应用程序的性能异常诊断。
当异常沿着服务调用的路径在系统组件之间传播时,对多层服务的请求跟踪对于分析异常的根本原因是必要的。
请求跟踪
社交网络中的谣言源检测旨在从网络中找出异常现象的根源,社交网络中的边缘连接具有确定性,时间是其谣言传播模型中的一个重要维度。
在云环境中,虚拟机之间的边缘连接很难确定,因此本文的异常传播模型不把时间作为一个维度,因为异常传播几乎是实时的。异常是否从一个节点传播到另一个节点受到其他因素的影响,例如它们之间是否存在严重的资源争夺。
异常传播类型
进行实验来证明这些因素是如何影响服务性能
实验环境:5 台物理主机构成的云环境,租户 A 申请 5 台虚拟机,租户 B 申请 3 台虚拟机,一些虚拟机分配在同一个物理主机(资源竞争),两个租户都运行三层 Web 应用程序 RUBiS 。
命题1:云提供商有必要提供服务,帮助租户确定异常的根本原因。
数据收集子系统:在多层服务提供服务时一直运行
根本原因定位子系统:在租户提交异常时被激活,返回一个排序的根本原因列表
租户发现服务请求r的响应时间很长,提交给云提供商异常 a
跟踪在线请求,收集和保存数据。根据收集的数据可以构建请求r的虚拟机通信图(VM Communication Graph, VCG),其中每条边反映了两台虚拟机之间的服务调用关系。
考虑由于资源竞争而导致的虚拟机之间的异常传播,异常传播图包含两种边,并置依赖边(collocation dependency)和服务调用边(service call)。
寻找 APG 中最可能的根本原因,这里的问题是如何评估一个节点是根本原因的可能性。
定义度量标准:相似性。计算多层服务中各组件的服务时间并监控各虚拟机的资源使用情况,在度量数据收集模块中完成。
利用这些度量数据计算 APG 中每个虚拟机的相似性,然后再通过随机游走算法,结合虚拟机传播异常的概率,最终确定可能导致异常a的根本原因。
v m i → v m j vm_i \rightarrow vm_j vmi→vmj 表示 v m i vm_i vmi 依赖 v m j vm_j vmj:事实上,这些依赖边是异常传播的反向方向
云提供商很容易检索共享物理机的虚拟机信息。例如,在 OpenStack 中,云提供商可以通过 nova 项目中实现的 api 获得物理机中的虚拟机分配情况。
一个请求会触发一系列的服务调用,服务调用边将形成一个有向无环图,这里称之为虚拟机通信图(VM Communication Graph, VCG),在图的拓扑结构上,VCG 实际上是对应 APG 的子图。
云提供商无法直接获得租户服务的调用关系信息。他们必须收集和分析数据来推断这些服务调用依赖的边缘。考虑到租户的隐私问题和多层服务的复杂性,云提供商应该在不入侵多层服务的情况下,基于请求跟踪技术构建 VCG 。
在多层服务中,一个请求在操作系统内核或共享库中触发一系列的交互活动,PreciseTracer 使用 Systemtap 捕获这些活动。
当为单个请求提供服务时,一系列具有因果关系或之前发生的关系的活动构成了因果路径图,PreciseTracer 提供了因果路径图,这是一个有向无环图,其中顶点是组件的活动,边表示两个活动之间的因果关系。
PreciseTracer 记录一个发送消息的活动为 S i , j i S^i_{i,j} Si,ji,表示进程i向进程j发送消息,记录一个接收消息的活动为 R j i , j R_j^{i,j} Rji,j,表示进程j 从进程i接收一条消息。下图包含简单的活动序列 { R c , 1 1 , S 1 , 2 1 , R 1 , 2 2 , S 2 , 3 2 , R 2 , 3 3 , S 3 , x 3 } \{R^1_{c,1},S^1_{1,2},R^2_{1,2},S^2_{2,3},R^3_{2,3},S^3_{3,x}\} {Rc,11,S1,21,R1,22,S2,32,R2,33,S3,x3},根据这个图可以计算每个组件(虚拟机)在服务单个请求时的服务时间。对于下图中的请求,机器 B 的服务时间是 t ( S 2 , 3 2 ) − t ( R 1 , 2 2 ) t(S^2_{2,3})-t(R^2_{1,2}) t(S2,32)−t(R1,22),其中 t ( ⋅ ) t(·) t(⋅)为对应活动的时间戳,此外,定义 h ( ⋅ ) h(·) h(⋅)作为运行相应活动的虚拟机的主机名。
下图给出了由 PreciseTracer 在图 1 中所示场景中生成的因果路径图示例, v m i vm_i vmi中的服务 1 调用了两次 v m 4 vm_4 vm4 中的服务 2
服务 2 调用 v m 5 vm_5 vm5中的服务 3 两次,然后再返回给服务 1
不关心服务之间通信的细节,将因果图转换为虚拟机级别的服务调用边,即 VCG 。
使用 nova api 获得并置边,根据 VCG 获得服务调用边。以图 1 所示的场景为例,租户 A 的用户发起的 ViewItem 请求将通过路径 2 传播,对应的 APG 如下图所示。
在本文中,异常是指多层服务请求的响应时间超过了用户能够容忍的时间。定义 Φ a ( i ) \Phi_a(i) Φa(i)为虚拟机 v m i vm_i vmi 是导致异常 a的根本原因的概率, v m r o o t vm_{root} vmroot表示导致异常的根本原因的虚拟机。
定义 R ( r ) \mathbb{R}(r) R(r) 为一个请求的集合,这些请求构成了与r相同的因果路径图;定义 S ( v m i , R ( r ) ) \mathbb{S}(vm_i,\mathbb{R}(r)) S(vmi,R(r))为 v m i vm_i vmi度量数据与 R ( r ) \mathbb{R}(r) R(r) 的请求响应时间之间的相似性,相似性可以在一定程度上推导出其为根本原因的概率。
竞争资源可能导致响应时间增加,但不一定是异常的根本原因。以图 1 所示的场景为例,只有当 S ( v m 1 , R 2 ) \mathbb{S}(vm_1,R_2) S(vm1,R2)和 S ( v m 6 , R 2 ) \mathbb{S}(vm_6,R_2) S(vm6,R2)都很高时,租户 A 的异常才可能是由 v m 6 vm_6 vm6引起。使用随机游走算法来反映异常传播的可能性。
命题2:作为根本原因的虚拟机必须满足两个条件:1)虚拟机的度量数据必须与请求的响应时间 R ( r ) \mathbb{R}(r) R(r)高度相似;2)虚拟机通过 APG 传播异常的可能性必须很高。
度量数据和响应时间在一定程度上可以用于衡量虚拟机是导致异常的根本原因的概率。
仍然以图 1 所示的场景为例,增加 v m 8 vm_8 vm8的 CPU 利用率,同时发送 SearchItemsByCategory 请求。下图显示了通过路径 2 处理请求的响应时间、 v m 5 vm_5 vm5的服务时间、 v m 1 vm_1 vm1的服务时间和 v m 8 vm_8 vm8的 CPU 利用率的变化趋势,其中三条曲线和 v m 5 vm_5 vm5的服务时间都有较强的相关性( t e t_e te和 t s t_s ts之间)。
如图 2 所示,当 v m 8 vm_8 vm8的 CPU 利用率小于某个阈值时,响应时间不会随着 当 v m 8 vm_8 vm8的 CPU 利用率的增加而增加。
如果 v m i vm_i vmi是多层服务的一个组件,根据其服务时间 η i \eta_i ηi计算相似度;对于共享物理主机的虚拟机,首先计算请求的响应时间与不同类型的资源竞争(如 CPU 和内存、I/O 和网络吞吐量)之间的相关性,然后选择这些相关性的最大值来表示其相似性。
定义 t ( r ) t(r) t(r) 表示发起请求 r r r 的时间戳, τ ( r ) \tau(r) τ(r) 表示其响应时间。根据 t s t_s ts 到 t e t_e te 时间段计算的皮尔逊相关性系数,定义函数计算 v m i vm_i vmi 度量值 M M M 与请求 R ( r ) \mathbb{R}(r) R(r) 响应时间的相关性
ℜ ( i , M , R ( r ) , t s , t e ) = C o v ( M t s t e ( M , i ) , T t s t e ( R ( r ) ) ) σ M t s t e ( M , i ) σ T t s t e ( R ( r ) ) \Re(i,M,\mathbb{R}(r),t_s,t_e) = \frac{Cov(\mathbb{M}^{t_e}_{t_s}(M,i),\mathbb{T}^{t_e}_{t_s}(\mathbb{R}(r)))}{\sigma_{\mathbb{M}^{t_e}_{t_s}(M,i)}\sigma_{\mathbb{T}^{t_e}_{t_s}(\mathbb{R}(r))}} ℜ(i,M,R(r),ts,te)=σMtste(M,i)σTtste(R(r))Cov(Mtste(M,i),Ttste(R(r)))
相似度 S ( v m i , R ( r ) ) \mathbb{S}(vm_i,\mathbb{R}(r)) S(vmi,R(r))
S ( v m i , R ( r ) ) = { ℜ ( i , M , R ( r ) , t s , t e ) , if v m i ∈ V C G max { ℜ ( i , M , R ( r ) , t s , t e ) ∣ v ∈ Υ } , otherwise \mathbb{S}(vm_i,\mathbb{R}(r))=\left\{ \begin{array}{rcl} \Re(i,M,\mathbb{R}(r),t_s,t_e), & \text{if}\ vm_i\in{VCG}\\ \max{\{\Re(i,M,\mathbb{R}(r),t_s,t_e)|v\in\Upsilon}\}, & \text{otherwise}\\ \end{array} \right. S(vmi,R(r))={ℜ(i,M,R(r),ts,te),max{ℜ(i,M,R(r),ts,te)∣v∈Υ},if vmi∈VCGotherwise
Υ \Upsilon Υ 表示竞争的资源类型,例如 CPU、内存、I/O、网络
在 v m i vm_i vmi 处理请求 R ( r ) \mathbb{R}(r) R(r) 时,收集 v m i vm_i vmi 的服务时间 η i \eta_i ηi 的历史数据
给定一个因果路径图,根据拓扑排序算法,求得活动序列 § \text{\S} §,然后使用活动 A A A 的属性元组(活动类型,程序名)来表示 § \text{\S} § 中的活动 A A A 。以图 5 为例,可以得到因果路径图序列为 { ( B , P 1 ) , ( S , P 1 ) , ( R , P 2 ) , ( S , P 2 ) , ( R , P 1 ) , ( S , P 1 ) , ( R , P 2 ) , ( S , P 2 ) , ( R , P 3 ) , ( S , P 3 ) , ( R , P 2 ) , ( S , P 2 ) , ( R , P 3 ) , ( S , P 3 ) , ( R , P 2 ) , ( S , P 2 ) , ( R , P 1 ) , ( E , P 1 ) } \{(B,P_1), (S, P_1), (R, P_2), (S, P_2), (R, P_1), (S, P_1), (R, P_2), (S, P_2), (R, P_3), (S, P_3), (R, P_2), (S, P_2), (R, P_3), (S, P_3), (R, P_2), (S, P_2), (R, P_1), (E,P_1)\} {(B,P1),(S,P1),(R,P2),(S,P2),(R,P1),(S,P1),(R,P2),(S,P2),(R,P3),(S,P3),(R,P2),(S,P2),(R,P3),(S,P3),(R,P2),(S,P2),(R,P1),(E,P1)} B B B、 E E E、 S S S、 R R R 表示四种活动, P i P_i Pi 表示进程 i i i 的名称。最后,只需要找出与 r r r 因果路径图具有相同序列的因果路径图。
确定时间点 t s t_s ts 和 t e t_e te
t s = min { t ∣ τ ( r t ) E ( T t − w t ( R ( r ) ) ) } > δ t_s = \min{\{t|\frac{\tau(r_t)}{E(\mathbb{T}^t_{t-w}(\mathbb{R}(r)))}\}>\delta} ts=min{t∣E(Tt−wt(R(r)))τ(rt)}>δ
给定一个 APG G A P G ( V , E ) G^{APG}(V,E) GAPG(V,E) ,定义矩阵 Q Q Q
基准方法
评价指标
定义 N a ( i ) N_a(i) Na(i) 表示在查找到导致异常 a a a 的根本原因 v m i vm_i vmi 前检查过但不是真正的根本原因的虚拟机数量,基于此定义:
如图 1 所示的架构,考虑 4 种情况:
SearchItemsByCategory
的延迟在 2ms ~25 ms接下来采用不同的根本原因分析方法来定位这三种异常的根本原因,在这个实验中度量定义中的 A \mathbb{A} A 包含了上述三种异常情况。
CloudSim 是云计算基础设施和服务的建模和仿真框架,只能模拟非常简单的应用程序模型;Networkcloudsim 在 CloudSim 的基础上进行扩展,可以使用通信元素或任务来模拟应用程序。
首先设计一种算法构建云环境,在租户申请虚拟机时模拟虚拟机分配到物理服务器,然后还设计了一种算法来构建面向云租户的多层服务拓扑结构,最后使用 Networkcloudsim 模拟云和租户服务的运行。
随机游走算法,排除那些仅仅因为相同的周期性用户行为模式而与多层服务高度相关的虚拟机。
租户 A 和租户 B 同时运行 Storm 应用程序,租户 A 同时运行两个进程,如果租户 A 的服务性能异常,必须定位是哪个进程行为异常导致。
Storm 应用程序被建模为一个称为拓扑(topology)的有向图,通常包括两种类型的组件:spout 和 bolt ,spout 是数据流的一个源,而 bolt 使用来自 spout 或其他 bolt 的元组,并按照用户代码定义的方式进行处理。Spout 和 bolt 可以在多个虚拟机上并行执行多个任务,即在一个集群中的工作节点中。
下图包含一个 spout 和两个 bolt 的链式拓扑,数据 spout 是分布式流媒体平台 Kafka 的消费者,数据 spout 订阅 Kafka 的一个主题,Kafka 将自动发送数据到 spout 。数据 spout 连接到一个SplitSentence bolt ,该 bolt 将每一行拆分为单词,并使用字段分组提供给 WordCount bolt ,WordCount bolt 基于不同的输入单词元组递增计数器。
租户 A 将 spout 和 bolt 的并行度设置为 2 ,即对于每个 spout 或 bolt , v m 1 vm_1 vm1、 v m 2 vm_2 vm2 和 v m 3 vm_3 vm3 中都同时运行两个任务。租户 B 将 spout 和 bolt 的并行度设置为 1 。
由于在同一个虚拟机上运行着两个进程,所以云提供商不能使用 PreciseTracer 来执行请求跟踪或直接收集度量数据,Storm 提供了 Thrift API ,可以在不干扰租户服务的情况下监控拓扑的运行。
首先,云提供商可以使用 getExecutors 函数来获取租户 A 的拓扑进程列表。对于每个进程,云提供商可以使用 getComponent_id 函数来获取进程名,再使用 getHost 函数来查找进程运行的虚拟机。根据进程名可以构建进程之间的通信关系,根据虚拟机名称可以通过云平台的 API 找到租户 B 的虚拟机。
有了两种关系,云提供商可以构造如下图所示的 APG。
然后,云提供商可以使用 getComplete_ms_avg 函数来获取元组进程的总时间(从数据 spout 接收句子到 WordCount bolt 完成句子的单词计数的时间),再使用 getExecute_ms_avg 函数获取每个 bolt 进程所花费的时间。
使用这些度量数据,云供应商可以计算出这些节点的相似性。
最后,云提供商可以对 APG 使用随机游走算法,找出根本原因列表及其相应的概率。