2
Journal of Software 软件学报
个节点均有可能出现故障,同时,大量并发请求又会引起更多故障的发生.其次,由于隐私保护和系统环境配置
难获取等因素,调试过程无法获得用户的输入和输出文件,难以重现与实际生产环境相同的系统配置,从而使基
于错误重现和调试的故障诊断难以实施.再次,系统的监控能力有限,难以收集全方位、细粒度的系统运行数据
以辅助故障诊断.最后,由于容错机制的存在,系统故障表现并不直观.分布式软件系统容错机制的目标是尽可
能减少局部故障带来的影响,对系统屏蔽故障的发生.而恰恰是因为这类容错机制的存在,当系统发生故障时,
其反应并不敏感,为系统管理人员进行故障排查增加了困难.因此,如何提升故障诊断效率,快速发现系统故障,
定位故障根因成为保障大规模分布式软件系统的高可用性和可靠性的关键.
随着人工智能(Artificial Intelligence,AI)的发展,智能运维(Artificial Intelligence for IT Operations,AIOps)
的概念[5]于 2016 年被 Gartner 首次提出,即通过机器学习(Machine Learning)等算法分析来自于多种运维工具
和设备的大规模数据,自动发现并实时响应系统出现的问题,进而提升信息技术(Information Technology,IT)运
维能力和自动化程度[6].在 AIOps 趋势下,以多源运维数据为驱动,以机器学习等算法为核心的智能化故障发现
与根因诊断技术,引起广泛关注.多源运维数据包括系统运行时数据和历史记录数据(如表单、系统更新文档
等).同历史纪录数据相比,系统运行时数据能够反映系统的动态特征及系统发生故障时的上下文信息,对未知
故障具有更好的探测和表达能力.系统运行时数据主要包括日志数据和监控数据,日志数据是程序开发人员为
辅助调试在程序中嵌入的打印输出代码所产生的文本数据,用以记录程序运行时的变量信息、程序执行状态
等;监控数据指系统运行状态下的资源占用情况,如中央处理器(Central Processing Unit,CPU)使用率、内存使
用率、网络流量、进程数目以及进程资源使用率等.日志数据和监控数据所处层次不同,前者关注细粒度的应
用状态和跨组件的程序执行逻辑,后者则关注系统状态和粗粒度的应用状态如进程状态、服务状态等.对故障
诊断任务而言,日志数据相较监控数据更具优势,表现为:
1、能够支持更加细粒度的故障根因诊断.基于系统监控的故障诊断往往只能定位到某一个资源指标出现
异常波动,而基于日志数据的故障诊断技术可以定位到特定的出错日志及事件信息.
2、能够支持对程序执行逻辑的跟踪,跨组件、跨服务地捕捉程序执行异常和性能异常.每一条请求在系统
内部的执行逻辑通常会经过多个组件或程序模块,每一个组件或程序模块均会输出日志,这些日志可以在一定
程度上反映该请求的执行轨迹.通过对这些日志进行关联和建模,可以刻画复杂的请求执行路径,进而诊断故障
组件及故障程序执行位置.
3、能够支持定位异常请求实例,捕捉故障细节.基于监控数据的故障诊断偏重于统计意义上的故障症状,
而基于日志数据的故障诊断则可以跟踪每一个请求实例,识别异常,并刻画异常请求执行路径上的相关细节.
因此,基于日志数据的故障诊断对于提升分布式软件系统故障诊断效率,进而提升系统可靠性和可用性十
分重要.
本文第 1 节对基于日志数据的大规模分布式系统故障诊断方法的研究框架进行总结,并总结归纳出其中
的四个关键技术(日志处理与特征提取技术、基于日志数据的异常检测技术、基于日志数据的故障预测技术
和基于日志数据的故障根因诊断技术).第 2 节对已有的日志处理与特征提取技术进行总结.第 3 节对已有基
于日志数据的异常检测技术进行总结.第 4 节对基于日志数据的故障预测技术进行总结.第 5 节对基于日志数
据的故障根因诊断技术进行分析.最后在第 6 节以本文提出的研究框架为指导总结分析相关研究工作,并对未
来值得关注的研究方向进行初步探讨.
1 概述
1.1 分布式软件系统日志
分布式软件系统日志通常指分布式软件系统各组件运行时输出的日志,例如 OpenStack 每个组件(如
Nova-compute,Neutron 等),Hadoop 各个组件(如 Resource manager, Node manager)输出的日志.这些日志不
包括操作系统日志,网络日志,硬件设备日志以及上层应用日志.不同的分布式系统由于功能特性的不同导致日
志序列和日志内容,其最普遍和关键的日志特征是以请求(Request)为核心(如 Openstack 的一次虚拟机启动
评论