2. 北京云星宇交通科技股份有限公司, 北京 100078
2. Beijing Yunxingyu Traffic Technology Co. Ltd., Beijing 100078, China
随着现实业务规模的扩大, 对应的信息系统也变得越来越复杂. 另一方面, 业务人员对于系统稳定性的要求却越来越高, 这对运维的质量提出了很高的挑战. 一旦业务系统发生故障, 运维人员很难精准定位故障发生的原和快速修复系统. 传统监控系统通常难以发现潜在的故障, 因为在业务系统非常复杂的情况下, 每一时刻都会产生大量有关或无关的运行状态数据、日志数据, 使得通过规则编码或者人工排查进行故障预警变得越来越不显示.
本文通过两个步骤完成基于日志的系统故障预警工作的研究. 包括:
(1)借助ELK平台收集汇总各个系统中的日志, 实现日志的集中化管理. 这样一方面可以方便运维人员的日常查询、搜索、管理日志, 提高运维效率. 另一方面也可提供后续研究打下数据基础, 为日志预警模型筛选出确实有效的原始数据.
(2)基于LSTM模型, 通过对原始数据的清洗、规范化等工作, 结合历史环境下系统相关告警信息, 进而训练得到基于日志的故障预警模型.
研究内容对于发现潜在故障, 快速定位故障来源, 准确识别故障原因, 缩短故障恢复时间, 提高运维人员工作效率都具有一定的帮助.
2 研究现状 2.1 日志分析工具传统上通常直接使用Shell或者Python脚本对单机日志进行分析. 当这种方式不能满足海量日志分析要求的时候, 分布式的日志采集、分析系统应运而生, 并且逐渐成为了各大互联网企业的标准配置[1].
当前主流的日志管理系统通常由采集端和服务端两部分构成.采集端通常为在各主机安装的代理(agent)或客户端应用(client), 这些代理或客户端将采集到的日志数据推送到服务端. 服务端则实现方式众多, 有的单纯提供存储、查询功能, 也有提供存储、计算分析、查询等复杂功能的庞大的分布式系统[2,3].
常见的日志管理系统有Cloudera开源的Flume[4], Elastic[5]公司开源的 ELK Facebook开源的Scribe[6]和Apache的Chukwa[7]等. 本文选用Elastic公司开源的ELK套件来实现日志的采集、查询和管理.
2.2 深度学习及框架深度学习(deep learning)是机器学习的分支, 是一种以人工神经网络为架构, 对数据进行表征学习的算法. 其最大的好处是使用无监督或半监督的特征学习和分层特征提取算法来替代手工获取特征, 从而大大减少研究人员对研究领域知识的依赖.
当前深度学习中有很多成功的模型, 例如深度神经网络、卷积神经网络、循环神经网络等等. 这些模型广泛应用于多个研究领域, 在计算机视觉、语音识别、自然语言处理以及生物信息学等领域都取得了极好的效果.
针对各种成熟的深度学习模型, 研究者们提出了多种不同的框架, 目前使用最广泛的包括TensorFlow、Caffe、Keras、PyTorch等. 其中TensorFlow由Google公司出品, TensorFlow框架更新维护频繁, 同时具备python与C++接口, 同时具备完整教程, 收到了广大开发工作者和学术人员的青睐, 目前已经成为深度学习框架中最受欢迎的选择. 本文所有模型训练工作均采用TensorFlow框架完成.
3 模型选型与模型构建 3.1 模型选型(1) CNN
CNN开始普遍用于图像识别中, Yoon Kim在2014年提出了TextCNN, 将卷积神经网络CNN应用于文本分类中, 利用多个不同size的Kernel来提取句子中的关键信息. 但CNN有个最大问题是固定filter_size的视野, filter_size的超参调节很繁琐. 另外由于CNN的特性, TextCNN对词的顺序很不敏感, 无法从上下文中获取信息.
(2) RNN
RNN模型结构最大的特点在于会将上一时刻的结果作为当前时刻的输入, 基本模型结构可以用以下公式表示:
${h_t} = \tanh \left( {W\left( {\begin{array}{*{20}{c}} {{x_t}} \\ {{h_{t - 1}}} \end{array}} \right)} \right)$ |
其中,
RNN相比于CNN在文本上最大的优势在于考虑到了上文的信息. 从公式中可以看出,
(3) LSTM
LSTM (Long Short-Term Memory) 可以认为是RNN的一种特殊形式, 模型结构如图1所示.
LSTM模型通过门控状态来对信息进行选择性的记忆, 满足了需要长时间记忆信息和遗忘信息的需求.
LSTM弥补了RNN在长文本中存在的缺点, 即可以选择性遗忘不重要的信息, 在长文本中只保留重要信息的关联性. 本文基于日志的故障预测模型就是以LSTM为基础完成的.
3.2 模型构建深度学习模型构建可以简化为4部分内容, 即模型结构的选择、激活函数的选择、损失函数的选择以及下降梯度的选择. 本文在模型上使用标准的LSTM模型, 在模型结构上不需要进行额外设定.
模型在损失函数上采用Softmax, 即交叉熵损失, 相比于范数损失、均方误差等, 交叉熵损失在分类上收敛速度要更加迅速.
模型在梯度下降上采用SGD的方式. 需要提及的是这里分别使用过Adam算法、AdaDelta算法和几种GD方法. Adam与AdaDelta方法虽然收敛速度更快, 但是由于训练数据本身的质量一般, 最终模型的准确率往往很差, 而GD的收敛速度虽然最慢, 但最终得到的效果要优于其他几项, 为了避免GD出现局部最优的现象, 最终选定SGD方法.
4 系统案例分析本文选取首发集某业务系统作为试点, 实现系统基于日志的故障预测完整流程, 包括日志分析、日志处理、模型训练与验证工作.
4.1 日志文件分析该业务系统的不同日志文件中, 虽然告警内容的格式也有所不同, 但告警信息内容的结构基本上是相同的.
如图2所示, 所有告警日志基本包含以下几部分内容.
(1) ERROR_time: 告警日志产生的时间
(2) ERROR_label: 告警标签, 显示当前错误的类别, 这个类别信息是日志自己生成的, 而非通过告警产生的人工标签.
(3) ERROR_label_detection: 部分告警会有简单的描述或解释, 这一部分信息不是必须的.
(4) ERROR_content: 告警内容本身, 这是用于模型训练的关键数据.
4.2 模型训练(1)数据准备
本文总共选取了18年1整年的tomcat告警日志作为训练数据, 日志每天产生告警信息20~50条不等, 共计训练数据8000多条. 同时通过采集到的告警信息对日志数据进行标定, 将数据分为产生预警和不产生预警两类.
(2)数据处理
对日志数据进行处理, 包括结构化、时间格式标准化、日志格式转化、文本序列化、文本长度截取等工作, 最终得到可以直接进入模型的训练数据.
(3)参数调整
模型主要需要调整的参数包括隐层数量、遗忘门偏置(drop值)、最大序列化值(embedding_size)以及最大文本长度.
隐层数量决定模型可以识别内容的复杂程度上限, 层数越多可以完成的分类越复杂, 但是耗费的时间与资源也会相应增加, 经过调整, 隐层数量为40时已经可以满足模型预测目标.
遗忘门偏置一般要求大于等于1.0即可, 当模型容易陷入局部最优时可以适当增大, 本文在构建模型时已经选择了不易出现局部最优的SGD梯度, 因此设置为1.0即可.
embedding_size的合理大小是需要在模型训练过程中不断去调整的, 值过大会导致加入很多干扰项, 影响模型准确率; 值过小则进入训练的数据信息太小, 同样会造成模型准确率下降. 经过反复调试, 故障预警模型的embedding_size在800~1000之间准确率最高, 目前模型的embedding_size值为1000.
最大文本长度同样会影响最终训练模型的质量, 一般情况下的最大文本长度可以设置为最长文本的60%到70%左右, 但对于日志文件来说不同文件间的长度差异过大, 需要反复多次试验才能得到最佳值, 本次故障预警模型使用的最大文本长度为500.
对于不同模型也需要对上述参数反复调整, 最终保证训练模型达到最优.
(3)模型训练
模型开始训练后会输出运算步数以及loss值, 作为准确率参考依据, 如图3所示.
当step增加到一定程度后, 模型的loss值就不再下降了, 一般情况下需要经过3W–5W次的迭代. 模型训练最终生成文件样例如图4.
4.3 结果验证
模型训练完成后随机选取4096条未进行训练的数据进行故障预警模型测试.
测试结果如图5所示.
图5中左侧表示日志实际分类状态, 右侧表示日志预测分类状态, 测试数据共计4096条, 其中识别正确的数据为3376条, 故障预测模型最终准确率为82%.
5 结论本文首先采用ELK工具实现了日志采集、存储工作, 为后续故障识别与模型训练提供基础. 之后, 使用这些日志在TensorFlow框架中对标准LSTM模型进行训练, 最终实现故障识别模型. 经测试, 障预测模型最终准确率为82%, 准确性良好.
本文采用的整套流程具备很强的可操作性, 可用于实际系统相关的故障预测工作, 可为运维人员提供工作效率、保障业务系统稳定性提供一定帮助. 同时也存在一些不足, 例如尚未考虑日志与日志、告警与告警之间的关联性问题, 模型训练中未对词汇表的进一步研究与调整工作等, 这些都可以作为后续的研究内容, 帮助进一步提升模型的准确率.
[1] |
陈飞, 艾中良. 基于Flume的分布式日志采集分析系统设计与实现. 软件, 2016, 37(12): 82-88. DOI:10.3969/j.issn.1003-6970.2016.12.019 |
[2] |
Goetz PT, O’Neill B. Storm分布式实时计算模式. 董昭, 译. 北京: 机械工业出版社, 2015. 1–9.
|
[3] |
陆世鹏. 基于Spark Streaming的海量日志实时处理系统的设计. 电子产品可靠性与环境试验, 2017, 35(5): 71-76. DOI:10.3969/j.issn.1672-5468.2017.05.014 |
[4] |
拉斐尔, 酷奇. 深入理解Elasticsearch. 张世武, 译. 北京: 机器工业出版社, 2017. 18–11.
|
[5] |
Scribe. https://github.com/facebookarchive/scribe/wiki. [2018-09-17].
|
[6] |
张川, 邓珍荣, 邓星, 等. 基于Chukwa的大规模日志智能监测收集方法. 计算机工程与设计, 2014, 35(9): 3263-3269. DOI:10.3969/j.issn.1000-7024.2014.09.055 |
[7] |
刘季函. 基于Spark的网络日志分析系统的设计与实现[硕士学位论文]. 南京: 南京大学, 2014.
|
[8] |
Socher R, Lin CCY, Ng AY, et al. Parsing natural scenes and natural language with recursive neural networks. Proceedings of the 28th International Conference on Machine Learning(ICML11). Bellevue, WA, USA. 2011. 129–136.
|
[9] |
İrsoy O, Cardie C. Deep recursive neural networks for compositionality in language. Proceedings of the 27th International Conference on Neural Information Processing Systems. Cambridge, MA, USA. 2014. 2096–2104.
|