如今,互联网服务通常在由数千台服务器组成的数据中心中运行。在这些级别中,非故障停止性能故障很常见,甚至可能预示着严重的即将发生的故障。因此,运营商希望尽快得到此类问题的通知。尽管存在各种监视工具,但是每个应用程序中已经可用的监视常常被忽略:简陋的控制台日志。
控制台日志的作者和实际操作人员不同,内容不友好,不利于分析,更别提在线分析了!
作者之前的工作在将统计机器学习和信息检索应用于控制台日志分析[28]问题上显示了良好的前景。具体来说,源代码分析从控制台日志恢复结构,异常检测技术推断哪些消息集可能指示操作问题。然而,那篇文章的工作是一种离线算法,该算法检查一个多天操作会话的整个日志,而操作人员需要了解这些问题的发生。
在[28]中使用的相同标记数据集上对本文的技术进行实证评估:
在一个203台机器集群上使用开源应用程序Hadoop File System (HDFS)[1]运行48小时中,产生的2400万行自由文本日志。本文成功地识别了业务问题的异常情况;几乎在所有评价方面,都匹配或超过了离线方法的检测精度,检测延迟较小。 说明本文方法适合在线使用!
本文从控制台日志收集跟踪信息,而不是检测应用程序,因此本文必须处理噪声跟多的数据,而不是由检测产生的数据,本文的分析技术也适用于路径数据
在频繁模式挖掘[7]这一活跃的研究领域中,我们对序列模式挖掘技术尤为感兴趣,它将频繁发生的有序子序列作为模式进行挖掘
本文扩展了这些技术,以解决在第五节中描述的独特问题的挑战
本文的频繁模式分析侧重于异常检测
本小节回顾了能用于本文中的线上方法,必要的预处理如下:
event
来指代包含已解析日志消息元素的数据结构,本文中使用 tuple
处理每条消息———(时间戳,消息类型,[消息变量列表])。在线系统中,控制台日志流经过处理后变成了事件流本文的检测技术依赖于分析踪迹,踪迹是与同一程序对象相关的事件集
例如,一组引用同一文件的打开、定位、写入和关闭的消息将构成该文件的事件踪迹
然而,在事件流中,不同类型和引用不同变量集的事件都是交错的。从流中提取踪迹的一种方法是按事件的特定字段分组,这是流数据处理的典型操作
——问题是如何自动确定分组?
消息数向量是事件踪迹的压缩表达,但是在线上场景中使用该方法时存在有两个问题:
本文使用消息数向量来表示会话,我们将会话定义为表示系统中单个逻辑操作的事件踪迹中的一个子集事件,并且预测的持续时间来进行限制。第四节中展示如何自动发现会话
与[28]等离线方法相比,在线分析的基本问题是我们不能一次看到完整的事件跟踪
举例子——在脱机检测中,由于缺少事件,跟踪可能被标记为异常:
例如,如果对文件的写操作失败,它的跟踪可能缺少关闭消息。在在线分析中,没有办法知道(除了等待运行结束)丢失的事件是否会出现,但是在线检测的全部要点是及时做出评估。在此强调检测时间只取决于算法需要等待多长时间才能做出决定。与此等待相比,检测算法的计算时间可以忽略不计
因此,有效的在线检测需要在准确性和检测时间之间取得平衡。
试想这样的极端情况下,如果我们在尝试在任何检测之前等待看到整个跟踪,那么我们的结果应该与脱机检测一样准确,但是需要花费大量的时间进行检测。在另一个极端,如果我们试图一旦出现单个事件就进行异常检测,我们就失去基于模式(一组相关的事件)来执行异常检测的能力。然而[28]表明,分析模式,而不是分析个别事件是准确检测的关键。
本文通过设计一种两阶段检测方法来权衡这个问题:
图2清楚地显示了为什么需要两阶段方法:
从我们数据中不同事件轨迹的直方图可以看出,有些踪迹非常频繁,而有些踪迹则非常罕见
将主要踪迹标记为正常行为,将罕见的踪迹标记为异常,是很合理的
但这留下了大量既不明显正常也不明显异常的中间地带。这些位于中间地带的踪迹有时是带有随机噪声的正常痕迹,如交错痕迹。
本文希望检测方法能够容忍随机噪声
如果我们减少最小支持级别以包含更多这些中间情况,则模式将引入随机噪声(例如重叠或不正确的排序),从而降低模式的质量。
由于PCA是一种能够匹配不精确模式的统计方法,因此它对随机噪声的鲁棒性比第一阶段使用的频繁模式挖掘更强,能够检测到中间情况下的罕见事件。直观地说:
- (1)基于模式的方法对大多数事件提供了及时的检测,最小化了等待完整跟踪的时间
- (2)而后续基于PCA的检测则处理了第一阶段产生的错误警报,大大提高了检测的准确性
两阶段方法的另一个好处是,阶段1中的频繁模式可以帮助操作人员更好地理解其系统的行为,并优化检测以包含特定于领域的知识
解释频繁模式和PCA结合的好处:
下面详细描述每个阶段
正如第3节中定义的,事件踪迹是报告相同标识符的一组事件。进一步定义:
作者将定义频繁模式的会话及其持续时间分布特点:
条件(1)保证模式覆盖普通情况,因此它可能是一种正常行为。条件(2)保证在短时间内检测到模式。我们定期挖掘归档数据以寻找频繁模式。这些模式用于过滤在线阶段中的正常事件。
我们不能应用一般的频繁序列挖掘技术,因为:
下面描述的算法中,使用频繁模式可以容忍随机会话交错导致的基于时间的分割精度较低的问题。一旦发现频繁模式,就可以使用它来解交错事件,以估计一个准确持续时间模型
本文新方法结合了时间和事件序列信息,采用三步迭代的方法进行准确的模式检测。简而言之:
1.使用时间间隔在每个执行跟踪中查找第一个会话(粗略的)
在这一步中,对于每个执行的追踪程序,我们首先扫描每个事件,直到找到这样一个事件, 其后一个事件的时间间隔长度是执行序列开始以来持续时间的10倍以上(时间间隔大小是一个可配置参数)。 我们将该间隔之前的所有事件视为一个会话(由MCV表示)。
这种分割可能非常不准确:由于会话的交错,可能会在会话中包含不相关的事件,并且由于会话持续时间的随机性,可能会在会话中丢失事件。在下一步发现频繁模式时,可以容忍这种不准确性
2.识别显著会话
这里提出一种在一个会话中包含所有事件的模式。在真实环境的大多数情况下,由于会话的分段方式:发生在很短的时间内的会话有高概率(虽然不总是)表明该会话代表一个单一的逻辑操作,特别是当支持度很高的情况下
我们使用两个标准来选择显著的模式:
(回想一下,会话已经由MCVs表示)
。根据定义, medoid 与所有其他数据点的聚合距离最小,这表明它是所有数据点的良好代表。直观地说,medoid 类似于空间中的质心(或平均值),只是 medoid 必须是实际的数据点
标准(1)保证所选的主要会话是所审查会话的良好代表
标准(2)除了是一个适合的代表之外,还保证所选的会话实际上占主导地位。选择标准在很大范围的最小支持值上是稳定的,因为正常的踪迹在日志中占大多数【我认为这句话说明平均几何中心受到频繁模式影响较大】。事实上,在我们的实验中,到之间的各种支持值都得到了相同的选择结果
我理解的是因为一个踪迹包含多个会话,所以可以按照1,找出每个踪迹的所有会话(预处理阶段,所以不用管),然后按照2计算所有会话MCV的几何中心点,然后找到距离最近并且满足支持度大于的会话当做频繁(模式/会话),这也承接上文说明了这里“不能应用一般的频繁序列挖掘技术”
3.使用频繁会话细化结果并计算持续时间统计信息
步骤2中的模式基于粗分段的会话,并且可能不能反映该类型的所有会话的正确持续时间分布:
因此返回原始数据,找到与频繁会话匹配(注:这里的匹配我开始理解仅仅是数量上的匹配,后来感觉是序列上的匹配)
的所有事件
然后从匹配会话中估计持续时间分布(详细信息见第5节的B小节)
使用持续时间分布,可以计算截止时间(该变量这里第一次出现,代表大多数会话模式应该完成的时间)模式百分位的分布。在第7节的B小节中表明,这一步显著改善了检测结果
我们还从原始跟踪中删除所有匹配的事件,为下一次迭代准备数据。请注意,可能非常长,这是由于某些操作中的持续时间差异很大。在的情况下,该频繁模式被丢弃,在检测阶段不使用。(注:根据这句话我推测本文的方法包含检测阶段和预处理阶段!)
然后,我们返回到步骤1并进行迭代,直到没有保留最低支持度的模式。
因为步骤3总是从数据集中删除一些东西,所以迭代一定会终止。 其余事件用于构建PCA模型。
频繁的模式应该是稳定的。但是,为了适应操作环境的变化,我们将检测器中使用的模式更新为周期性(这个更新不频繁)的离线过程(即检测器使用所发现的模式,但从不在线更新它们)。这样既可以保持在线检测的简单性,又可以避免瞬态异常现象对模式的影响。(注:我理解的是入瞬态的异常模式代表短时间内突然出现的频繁模式,所以既然不经常更新,就不会在频繁模式中加入瞬态的异常模式)
为了实现及时的在线检测,需要知道任何给定的模式需要多长时间才能完成。为此,作者估计每个模式的会话持续时间分布。基于这个分布,我们计算每个模式的截止时间(例如,分布下99.95%满足的时间)。在此之后,该模式的大多数会话将完成。
为了选择一个适合这些的数据分布,首先观察图像3可以发现:
为了估计分布参数,我们采用了[4]中提出的基于Kolmogorov-Smirnov (KS)统计[10]的最大似然拟合方法和拟合优度检验相结合的方法
对于只取整数值的持续时间,考虑概率分布形式是的情况。不难得出,归一化常数由下式计算:
假设已知(估计的方法的讨论在后面),最大似然估计量(Maximum Likelihood Estimator,MLE)的尺寸参数可以近似用下式得出:(注:后面的公式推导都可以在参考文献[4]中找到)
其中是持续时间值时的观察值
为了估算,我们选择一个值,
【图3(c)和(d)】分别为模式1和模式2的经验分布(图中圆形的点)和拟合幂律模型(图中的实线)。由模型可知,幂律分布的CDF是可以用下式得到:
其中在式(1)中定义,然后对于,最大分布百分位的值满足以下公式:
其中在公式(3)中定义。我们在第7节中给出了模式1和模式2混合分布的估计的百分位,以及对检测精度的改进
基于模式的检测器从日志解析器中接收事件流
(注:我感觉就是序列上的匹配)
某个频繁模式在逻辑上尝试将所有事件集匹配到所有模式。这里使用最朴素的全匹配法,因为
具体的处理方法:
(注:我的理解是这种情况表明遍历整个踪迹,都没有找到一个满足条件的会话)
注意,因为通常比小得多,所以该方法可以对大多数事件实现快速检测
检测规则:
这种方法背后的直觉是,只要我们能够合理地确定事件不属于任何被监视的频繁模式,它就会被传递到基于PCA的检测器,称之为非模式事件
从阶段1传递的非模式事件向量的噪声明显比频繁模式大。噪声来自未捕获的交错、持续时间的高度变化和真实的异常。为了从这些噪声数据中发现真正的异常,我们使用了一种基于统计异常检测方法,即PCA检测器,它在从控制台日志和许多其他系统[28]、[13]中进行离线问题检测时是比较准确的。
与频繁模式挖掘一样,主成分分析的目标是发现统计上占主导地位的模式,从而识别数据内部的异常
主成分分析可以通过自动选择一个(小的)坐标集来反映原始坐标之间的协变,从而捕获高维数据中的模式。一旦我们从归档和定期更新的数据中估计出这些模式,我们就使用它们来转换传入的数据,使异常模式更容易检测。
PCA检测也有一个模型建立阶段和一个在线检测阶段:
平方预测误差
为其中表示在置信水平下SPE残差函数的阈值统计量
在实际部署中,模型可以定期更新。请注意,由于此阶段的数据比较混杂,并且非模式数据的依赖于工作负载,因此PCA的模型更新周期通常比频繁模式挖掘的模型更新周期短。
本文使用:
为了将本文的在线方法与[28]中提出的离线算法直接进行比较:
如分布式排序和文本扫描
作者相信这个数据集是一个很有代表HDFS集群
在[28]中,数据集中所有的踪迹都被标记为正常或异常,并且大多数异常都有分类/解释。这为评估本文的结果提供了依据:
请注意,标记过程不考虑任何踪迹的持续时间。本节后面展示这种省略的效果
为了模拟系统操作员将如何使用本文的技术,使用以下两步方法来评估本文的方法:
整个过程是无监督的,因为标签只是为了评估,而不是为了建立模型
多次改变采样数据的子集来构建模型,得到了相同的检测结果。因为我们识别的模式很频繁,随机抽样是稳定的
需要设置两个参数:
这意味着在可疑事件踪迹出现在日志中之后,操作者最多希望在60秒内收到可疑异常的通知
选择的这些基线值为这些算法的公共设置(即在不了解数据的情况下的默认设置值),但是在第7节的B小节中,展示了本文的检测结果在很大范围内对这些参数不敏感
阶段1的目标是删除与正常应用程序行为相对应的频繁模式
举例说明表的意思,该表显示模式1是分配一个写入块所对应的事件序列。踪迹中的20.3%事件被分类为属于此模式的实例,因此将被过滤掉,不会传递到阶段2。此模式的持续时间分布的99.9、99.95和99.99的百分位数分别为11秒、13秒和20秒。我们选择这些高百分位数值是因为我们希望大多数正常会话在这些间隔内完成。
注意, 即使是模式持续时间的99.99的百分位数也明显小于。这一点很重要,因为检测延迟是基于模式持续时间或(以较短的值为准)。由于篇幅的限制,本文仅将设置为每个模式的99.95的百分位值来显示检测结果。其他值的结果类似
具体解释相关模式:
模式1和2都与编写文件块相关。它们在逻辑上属于相同的操作,但是写入会话可以是任意长的:写入文件的应用程序可能在开始写入之后等待任意数量的时间,然后才真正发送数据
由检测延迟有设定阈值,因此本文将会话的开始和结束分为两种不同的模式,以便及时检测。显然,这种分离有一定的局限性,具体将在第8节中详细讨论
模式4到6只包含单个事件。这些事件用于报告一些数字,并不用于基于事件跟踪的检测,因此单个事件完成操作(例如,读取等)
模式5由一个报告异常的事件组成,但是正如我们在[28]中讨论的那样,这确实是一个正常的操作,消息文本表示一个错误的日志记录实践,这让许多用户感到难以判断。相反,由于本文使用模式频率进行检测,因此很容易将这些异常消息识别为正常操作
从[28]中获得每个事件跟踪的label/abnormal label
在我们的数据集中,有575,319条事件踪迹,其中16,916条被标记为异常
在第7节的D小节中与脱机结果进行比较时,将详细介绍检查的误报
直觉上,当太小时,许多逻辑会话(特别是那些没有被主导模式覆盖的会话)被随机切断,而当太大时,许多不相关的会话被组合成相同的消息计数向量,这给PCA检测器引入了太多的噪声。这两种影响都会降低精确度和召回率
正如第5节的B小节中所描述的,我们使用了一个相当复杂的模型来估计会话的持续时间。如果我们假设是一个简单的高斯分布,那么表I中模式1的99.95%的估计为5.3,模式2的估计为4.0,不到本文建模的分布拟合估计的结果时间的一半。使用高斯分布推导的截止时间,假警报的数量增加了45%,精度从86%下降到80%。
因此,持续时间分布估计(第5节的B小节)增加的复杂性较小,而召回率和准确率要高得多
检测延迟(在第5节中定义)捕获检测的及时性,这是在线方法的一个关键目标。
回想一下,最小化检测延迟的困难源自这样一个事实:在发生特定事件或一组事件之前,不可能总是标记踪迹异常。 例如,表I模式1中的分配块消息仅仅表示操作序列的开始;检测器必须缓冲事件并等待进一步的事件。直到模式1的最后一个事件(例如,三个预期接收消息中的最后一个),才会对该消息作出最终决定。然后,包含此分配块事件的跟踪的检测时间就是从发出分配块事件到检测结果生成的时间。
这是因为我们使用截止时间来停止等待更多事件,而不是大多数事件的最大延迟。一些事件需要最大允许的检测延迟:那些不匹配任何模式的事件(默认为)。根据定义,这些事件非常罕见,因此它们较长的检测时间的总体影响是有限的
因此,正如预期的那样,缓冲区中事件的数量很少
表3比较了文献[28]中的离线检测结果以及我们的在线检测中使用基线参数值 产生的结果。
表中第一列的错误标签是直接从[28]得到的。可以看出,我们不仅能像离线方法那样成功地捕捉到所有异常,还能得到更低的假阴性率。
原因是,对于在线检测,我们根据时间持续时间将事件跟踪划分为多个会话,并将检测基于单个会话而不是整个踪迹。因此,发送到检测器的数据不受多个独立会话(例如,某些块的读取频率高于其他块)的应用程序相关的交错所产生的噪声的影响。
表III中的两种误报均为罕见但正常的事件。
例如,假阳性#2(过度复制)是由于特殊的应用程序请求,而不是系统问题。这些确实是罕见的事件(在所有跟踪中只有368次发生),它们对应于罕见但正常的操作。使用完全无监督的检测器很难处理这些情况。为了处理这些情况,我们允许操作人员手动添加模式来编码关于实际问题的特定于领域的知识,并过滤掉这些情况。
表III列举了由于异常定义不清而引起的模糊情况。
例如,我们的在线算法将一些写入会话标记为异常,因为其中一个数据节点的响应时间远远长于其他所有节点,从而导致异常长的写入session1。从系统管理的角度来看,这些情况可能应该标记为异常,因为尽管这些块最终被正确地编写,但是这个场景有效地将整个系统的速度降低到响应最慢的节点的速度。
在线检测的局限性
在线检测的一个明显的局限性是,我们无法捕获跨事件在很长时间内的相关性。
例如,正如在第7节的A小节中所讨论的,表I中的模式1和2之间存在巨大且不可预测的时间间隔,因此我们必须将它们分成两种模式。然而,这种分离的结果是我们失去了观察模式1中的事件与模式2中的匹配事件之间的相关性的能力,这可能会影响我们捕获一类新的操作问题。(例如,模式1中的事件指示有多少数据节点开始写;在模式2中,每个这样的节点都应该有一个相应的结束写入事件。)
这是在线检测固有的局限性,因为需要检测延迟。这可以通过记住更长的历史(可能以更紧凑/聚合的形式)来解决,尽管这会使检测器的设计更加复杂。
因此,我们提出了一种不同的方法:通过利用相对廉价的计算周期,我们可以对存档数据定期执行脱机检测,以发现违反此类未捕获约束的异常。
用例
如表III中的异常1,它是由Hadoop源代码中的确定性错误导致的。由于每次发生的异常报警都会影响操作者的注意力,因此我们对异常进行分层聚类,并报告每种异常类型的数量。空间限制阻止了对集群方法的描述
结论:
作为未来的工作:
[21] K. Rieck and et al. Computation of similarity measures for sequential data using generalized suffix trees. In NIPS’2007. MIT Press, Cambridge, MA, 2007.
[28] Xu W , Huang L , Fox A , et al. [ACM Press the ACM SIGOPS 22nd symposium - Big Sky, Montana, USA (2009.10.11-2009.10.14)] Proceedings of the ACM SIGOPS 22nd symposium on Operating systems principles - SOSP "09 - Detecting large-scale system problems by mining console logs[J]. 2009:117.
1)True positives(TP): 被正确地划分为正例的个数,即实际为正例且被分类器划分为正例的实例数(样本数);
2) False positives(FP): 被错误地划分为正例的个数,即实际为负例但被分类器划分为正例的实例数;
3) False negatives(FN):被错误地划分为负例的个数,即实际为正例但被分类器划分为负例的实例数;
4) True negatives(TN): 被正确地划分为负例的个数,即实际为负例且被分类器划分为负例的实例数。
上图是这四个术语的混淆矩阵。
1)P=TP+FN表示实际为正例的样本个数。
2)True、False描述的是分类器是否判断正确。
3)Positive、Negative是分类器的分类结果,如果正例计为1、负例计为-1,即positive=1、negative=-1。用1表示True,-1表示False,那么实际的类标=TF*PN,TF为true或false,PN为positive或negative。
4)例如True positives(TP)的实际类标=1*1=1为正例,False positives(FP)的实际类标=(-1)*1=-1为负例,False negatives(FN)的实际类标=(-1)*(-1)=1为正例,True negatives(TN)的实际类标=1*(-1)=-1为负例。