运维领域标注获取困难,为海量KPI快速选取相应的算法,实际落地效果差。运维工作中核心监控和分析对象是KPI和日志。本文阐述了相关领域的主要研究内容和关键算法,并概述了该领域最新研究进展,提出了未来研究方向和思路。1AIops领域针对KPI的研究1.1KPIKPI分为业务指标、运营指标、基础监控指标、数据库指标、中间件指标和存储设备指标等[1]。《SRE:Google运维解密》[2]中提出了系统监控的4个黄金指标,分别是延时、使用率、饱和度和错误数或错误率。在区分系统时应意识到一个复杂系统里包含不同类型的子系统,在相互影响和合作的子系统间,如何对相关指标进行关联和呈现,更能体现一个监控系统给用户带来的价值。当KPI出现异常时,说明与其相关的设备或应用程序存在问题。在项目落地过程中,业务指标的总体值发生异常时,定位出根因所在的位置是关键一步。传统的运维方法是依赖运维工程师的个人经验和使用零散工具包进行手动检查,为了解决此问题,最终目标是建立一个能够在真实业务场景下部署并有效检测KPI异常的系统。实际上,指标预测场景正逐渐由基础监控指标的预测转向运营指标的预测。针对多维指标同时异常的情况,提出基于“影响力”的异常检测算法,衡量每个维度组合对整体指标变化(异常)的影响程度,是一种与指标含义无关的异常检测方法。1.2业务指标趋势预测业务指标趋势预测是指根据过去的数据和趋势预测未来的业务指标,通常涉及海量时序数据的分析与挖掘,来识别数据中的趋势和模式[3]。指标中的容量是预先分配给特定应用系统的资源上限,应用能否顺畅运行与CPU使用率、内存使用率和磁盘读写速率等有关,智能运维可以分析历史性能数据并预测未来趋势以提供参考。代数估计、线性回归模型、差分自回归移动平均模型和反向传播神经网络模型是早期研究的常用模型[4]。MASON等[5]使用循环神经网络(RNN)能够更精确预测短期CPU使用率。RAO等[6]和TRAN等[7]利用长短期记忆网络(LSTM)预测App资源未来的利用情况,与传统的预测方法相比,RNN和LSTM具有更优秀的预测精度。丁尹等[8]综合考虑周期数据预测的需求,提出基于双向循环神经网络(BiRNN)周期型容量指标预测模型,为分析容量数据的周期性特征,提出了一种忙闲分布分析算法,使用循环神经网络(RNN)模型,包含一层BiRNN和一层双向长短时记忆网络(BiLSTM),使用系统忙闲分布信息,对BiRNN输出的结果进行优化,实现了准确的容量指标预测。未来研究的可探索之处在于优化预测趋势型和不规则型的准确性,并将模型落地到公司的容量管理规划中。1.3KPI异常检测多维KPI异常检测的数据量巨大,对于单个指标无异常,但综合多个指标有异常;有时单个指标异常,但综合多个指标有可能正常[9]。指标的异常检测是故障定位和根因分析等运维工作的基础,具有较高的时效性要求,故需要能保证预测准确性和时效性的算法。基于统计概率的方法、基于机器学习的方法和基于深度学习的方法可以看作是KPI异常检测的3类方法[10]。基于统计的方法通过假设研究数据集符合某一种分布模型(如正态分布、泊松分布等),当给出的数据在假设分布模型中出现的概率较低,认为该数据是异常数据。其中比较简单的方法如3Sigma准则、箱形图、Grubbs检验和ARIMA算法[11]。中兴通讯对3Sigma准则进行了优化,提出K-MaxMin异常检测算法[12],用于不符合高斯分布的数据异常检测,对于绝大部分近似两点分布但不符合高斯分布的数据,其中有极少数小突刺。如果直接使用箱体法或3Sigma原则会将所有小幅度突刺全部作为异常进行误报,使用K-MaxMin异常检测能够精准检测出真正的异常点。中兴为异常检测建立了相应的算法库,接入系统的数据经过分类算法库,如趋势模块、相关系数和频谱分析,对时序数据分类后采用不同算法进行检测。基于机器学习方法,在过往的研究监督比无监督的方法准确率高,但运维领域算法尽量不用数据标注,因为标注无法通过众包解决且只有运维领域专家才能有效、准确地进行标注。可以使用半监督学习方法[13],基于分类的方法将异常标签看作类别标签,将异常检测问题当作分类问题考虑,需要对数据预先标注。基于分类的多指标异常检测方法可基于正常类个数继续分为Multi-class和One-class。例如,KHREICH等[14]提出使用One-class支持向量机(SVM)实现异常检测算法,使用核函数将数据映射到更高维度,寻找使数据和坐标原点间隔最大的超平面。YANG等[15]提出高斯混合模型(GMM),该方法对正常数据通过高斯混合进行估计和建模,使用期望最大化(EM)算法估计参数[16],模型输入特征后,可以获得正常样本的概率,完成检测过程。互联网已经拥有了海量数据规模,目前的技术多专注于提升深度学习的能力[17]。基于深度学习的半监督方法仅使用正常样本进行训练,相较于异常样本,正常样本更容易获取[18],该类方法通常运用自编码器(AE)[19]和生成对抗网络(GAN)[20]模型。AE由Encoder和Decoder两部分组成,Encoder将数据进行编码,Decoder将数据进行解码,可以用不同的残差比较方法来对比输入数据和重构数据之间的残差,进而检测异常。送入AE训练的数据是正常数据,所以模型学习正常数据的潜在规律。当模型重构异常数据时,重构误差会显著增加,判断数据是否异常通常需要使用固定阈值或者动态阈值进行判断。其中,Donut、Bagel和Buzz是3个典型的方法[21],Donut作为最早提出面向KPI异常检测的深度生成模型,采用基于变分自编码(VAE)的无监督学习架构,在周期性服务KPI上表现优异。Bagel引入条件变分自编码(CVAE)替代Donut的VAE,并将时间信息纳入模型,以提高对时间敏感的KPI异常检测能力。Buzz结合GAN和分区思想,针对非周期性机器KPI表现为复杂数据分布和非高斯噪声进行异常检测。2日志异常检测与根因分析日志异常检测主要的挑战是数据不稳定性和数据标注少[22],解决数据不稳定性的关键是将日志表示为语义向量[23],将其与已知日志进行比较。2.1日志采集日志采集是日志异常检测的第一步,对于分布式软件、大型软件等,数据通常分散在系统的各个部分,不同的节点和组件在不断产生和积累日志。常见日志采集工具包括Logstash、Flume、Fluentd、Kafka等,能够将数据集中存储或通过发布—订阅模式推送给用户端进行后续处理,也可以持续、实时进行数据采集。2.2日志解析日志解析的真正目的是将日志中蕴含的信息从一种书写格式转换为另一种便于进行日志分析的格式,从一种信息编码格式转为另一种编码格式。半结构化的日志数据分为正则消息和特征消息,正则消息包含时间戳、日志等级和产生日志类名称等基本信息,可以使用正则表达式进行提取和分解;特征消息可以看作日志内容的关键部分,日志数据是开发人员编写的输出语句生成。日志解析工具可以根据不同的日志格式进行配置,常见的日志解析工具包括LogParser、ELK[24]、Scribe等。目前研究拟采用一款在线日志模板挖掘工具Drain3,可以从日志消息流中及时提取模板(集群),采用固定深度的解析树指导日志组搜索过程,有效地避免了构造深度大、不平衡的树。2.3模型训练与异常检测应用解析好的日志模板,可以用传统机器学习方法进行训练。将词频-逆向文件频率(TF-IDF)技术用于对日志模板的向量转换,使用meanshift聚类等方法为样本添加label,使用邻近算法(KNN)的方法进行异常检测[25]。由K-prototype聚类和KNN分类组合的日志异常检测算法,利用K-prototype使疑似对象显示出来,用KNN得出检测结论[26]。基于字符串度量和数值度量设计实时在线聚类的算法,可以用于异常检测和网络安全中防范攻击[27]。构建并基于Spark Streaming日志消息计数向量采用K-means进行分类[28],但是传统机器学习算法在日志文本的语义识别、长距离依赖等问题上表现不好。神经网络的输出由最后一层中的单个节点或多个节点组成,从网络中提取的结果值是数值的标量或矢量,需要对深度神经网络的输出进行处理再用于异常检测。一种方案是将结果视为异常分数,该分数表示为呈现给网络的日志事件在一定程度上表示异常,分数通常难以单独解释,因此有必要将其与某个阈值进行比较,估计神经网络的输入是否正常。另一种方法是利用自动编码器的重建误差,自动编码器在低维空间中对输入数据进行编码,尝试将其重建为原始形式,在这种情况下如果输入样本难以重建,即产生大的重建误差,则认为输入样本异常,不对应训练网络的正常数据。采用在预聚类下结合细化分析和多视角的异常提取,实现系统日志的异常检测[29]。通过信息熵获取日志的信息量,用Canopy预聚类提取子集交叠数据,细化分析识别异常日志。对现有基于深度学习的日志异常检测算法Deeplog进行研究和改进,提出一种基于并列门循环单元(GRU)分类模型的日志异常检测方法[30],在训练阶段利用日志模板解析器解析原始日志数据集中的日志模板,生成日志模板滑动窗口数据集和相应的日志模板频度向量集,作为输入训练成并列GRU分类模型;在检测阶段,利用并列GRU分类模型对进程日志序列进行异常检测。2.4根因分析在智能运维体系中,用来分析和建模的数据可以分为Log+Trace+Metric,数据量巨大且数据形态复杂多样。企业不仅要考虑存储系统的吞吐及架构在存储系统上计算引擎的灵活性,同时也要关注成本[31]。故障定位[32]和根因分析等运维工作基础是运维数据的异常检测,具有重要的作用。例如,可以通过调用链[33]等监控数据的方法来探索服务之间的依赖关系,但最终执行根因分析和故障分类时,可以对检测到的异常行为构建故障树或故障传播图,并借助专家经验对根因分析算法进行评判。在AIOps领域,解决复杂的智能运维问题需要进行系统化架构拆解,能够将问题拆分为不同的模块,有些模块可以使用监控方法、自动化方法或已有的运维算法进行有效解决,有些模块则需要针对性地解决。这种方法能够有效解决多种运维场景中的挑战,也符合张钹等[34]AI 3.0理念,即“知识驱动+数据驱动+算法+算力”。3结语目前,智能运维领域拥有一定种类的算法,但针对具体问题的算法选择需要聚焦并与实践紧密结合。对于单指标的异常检测,IT企业实际问题解决中并不需要繁杂的算法,设定基线并动态调整的方法更快捷。运维领域内多指标异常检测方法并没有可靠的效果,仍需要专家选择合适的阈值去判别异常。因此,应尽可能选择无监督的算法,使用多模态数据,不能只看指标、日志或调用链,而要选择更丰富的数据特征去分析。

使用Chrome浏览器效果最佳,继续浏览,你可能不会看到最佳的展示效果,

确定继续浏览么?

复制成功,请在其他浏览器进行阅读