01 背景
随着科技的发展,时序数据在我们的认知中占据越来越多的位置,小到电子元件在每个时刻的状态,大到世界每天的新冠治愈人数,一切可观测,可度量,可统计的数据只要带上了时间这个重要的因素就会成为时序数据。在运维领域,时序数据的范围则缩小到软件系统及其关联事物上面。随着数字化,物联网,人工智能等新技术的蓬勃发展,时序数据在运维领域也产生了爆发的增长,那么,究竟什么是时序数据,时序数据在智能运维(AIOps)领域又能为人们带来哪些价值呢?本文将会围绕这两点进行阐述,并拓展介绍一些具体应用时序数据的算法。
(PS:本文约9000字,预计阅读时间18-20分钟)
02 时序数据
(图片来源于网络)
1 定义
简单的说,时序数据就是一串按时间维度索引的数据。具体的说,时序数据描述了某个被测量的对象在每个时间点上的测量值,时间点之间的间隔如果保持不变,比如都是1分钟,那么可以说这个时序数据的时间粒度/时间间隔/频率为1分钟。
从上述对时序数据的具体描述来看,时序数据主要由三个部分组成:对象,时间点,测量值。而我们可以说,一切带有这三个部分的组合的描述,都可以称作时序数据。只要想一想,就会发现,这类组合无处不在:人体每分钟 的 心率,cpu每秒 的 使用率,网站每小时 的 访问量,手机网络 每秒下载的数据量……,下面我们对这三个部分进行进一步解释:
对象:即被测量的主体是什么,一个对象可以有多个维度的属性。以cpu对象为例,可以是A集群、B物理机、C虚拟机的cpu,那么A,B,C就是cpu对象的3个维度属性。
时间点:即对象被测量时的时间位置,一般用时间戳表示。比如上述cpu对象在2022年6月29日上午8点12分38秒(Unix时间戳为:1656461558)被测量了一次,那么这个时间就是时间点。
测量值:一个对象可能有多个测量值,每个测量值都对应一种指标。仍以上面的cpu为例,我们可以测量它在对应时间点的使用率,也可以测量它在对应时间点的使用值。
总的来说,每条时序数据都由对象、时间点、测量值三个部分组成,同一对象的时序数据记录了该对象在时间维度上的状态变化信息,对时序数据的分析就是挖掘时序数据蕴含的规律的过程。
2 特性
时序数据相较其他类型数据有一些显著特点:
- 数据一定带有时间字段/索引
- 数据按时间粒度稳定且持续的产生
- 数据基本不会有更新操作
- 一般而言数据会随着时间流逝而价值逐渐降低,具有时效性
- 数据的处理必须结合时间属性
针对时序数据的特点,业界有很多时序数据库专门用来高效的存储时序数据,如Influxdb,Prometheus等。我们在分析及使用时序数据时也应充分考虑到以上特性。
03 AIOps中的时序数据
上面对什么是时序数据以及时序数据的特性做了介绍,接下来我们看下在AIOps领域,时序数据又有怎么样的应用。
1 来源
在运维领域,为了保障整个软件系统的正常运行,需要在系统的各个层次定义要观测的时序数据,即定义要监控的指标。一般地,成熟的监控指标体系的搭建是以CMDB为骨架,以监控指标为脉络而进行的。因此,在AIOps中,时序数据的表现为监控指标。下图展示了运维领域中监控指标的体系层次,这是运维中的另一个大领域,如感兴趣可点击查看文章:搭建统一监控平台毫无思路?产品大神手把手带你梳理!
2 在AIOps中的应用方向
指标(Metric),日志(Log),调用链(Trace)是运维领域中产生的较为普遍的三种数据类型,因此基于运维数据之上的AIOps对于指标数据的利用也非常广泛,下面对应用成熟度比较高的两个方向进行探讨:
- 指标异常检测
- 指标预测
指标异常检测
(图片来源于网络)
指标异常检测,即判断监控指标体系中的对象指标是否发生了异常情况的过程。如果把软件系统比作人体,那么运维对象指标就对应人体的心率,血压,血糖,视力,激素水平等生理指标(类似上图),运维监控工具则对应各类用于检测的医疗设备。
需要保证软件系统的正常运行,首先就需要将表征/反映其是否健康的指标监控起来,然后再用异常检测算法进行实时或准实时的判断,当出现异常情况时能通过告警工具及时通知运维人员进行进一步检查,以决定是否采取相关措施。就像电视剧里一样,病人生病了,各类仪器在实时监控着病人的情况,当发现监控指标出现异常,就需要及时通知医生查看情况。而在运维领域,为了保证软件系统的高可用性,在软件系统的全生命周期都需要配备监控,并设定异常检测算法(不管是简单的静态阈值还是复杂的算法策略)。
异常的种类
指标的异常,一般指监控对象的指标出现了不符合预期或者不符合正常情况下的变化。比如页面访问成功率突然的下跌,cpu使用率的飙升,内存使用率的缓慢增长(内存泄漏),周末业务量相较过往下跌等等,这里需要明确的是大部分指标的异常并不代表软件系统发生了故障。
另一方面,异常的判断通常需要结合具体的业务情况进行,因为数学统计上的异常不代表实际业务上发生了异常,二者的判断标准是不一样的,在实际的异常检测落地时不能忘记考虑这一点,否则算法就成自嗨的玩具了。
下面对常见的一些指标异常情况进行梳理:
离群点异常:
即当前的指标值与附近时间点的指标值差距较大,或者当前指标值与整个时间窗口内的指标值差距都较大。比如意外的下降或者上升,或者出现整个窗口内的峰值。
变点(change point)异常:
即该指标的出现不但不符合之前的趋势,并且还改变了之后指标的趋势,相当于在这个时间点的前后,指标的表现是两个模式。比如旅游人数,每年10月1日前后会持续10天左右高峰,与平时的情况大为不同,这里的变点可能就是9月30日(放假开始前夕)。
周期性异常:
在周期性指标数据内,某个时间点的指标表现不符合它以往的指标值。比如每晚10点都是英雄联盟游戏的在线人数高峰,但是某天晚10点进行了部分大区的版本更新,导致在线人数不符合之前同时间点的表现。
其他类异常:
比如上面谈到的内存泄露,对于很多指标下图的表现都不能算异常,但是对于内存指标而言却可以肯定的说出现了内存泄露的异常。
指标预测
指标预测,即通过对指标历史数据的分析,挖掘其存在的内部规律(比如趋势性,周期性等),根据这些规律对未来一段时间内的指标值进行预测。比如对业务量进行预测,判断未来半年需要投入多少成本来达到最优成本配置。甚至还可以对股市进行预测,当然,因为股市影响因素极多,很难只从时序数据本身挖掘到规律,自然预测的结果也就毫不可信了。
在AIOps领域,指标预测的应用方向一般有两个:
指标异常检测:
一般使用单步预测即可满足,通过对比预测值和实际值的差异大小来判断指标的异常程度。常用的如移动平均(MA),1阶,2阶,3阶指数平滑等统计类算法。
较长期资源量的预测:
比如存储资源、计算资源、网络资源、资源池等未来使用量的预测。对于业务上公有云的公司来说,资源即成本,能在满足业务使用及一定冗余的情况下尽可能的减少资源的购买量,能够显著提升效益。资源预测如果再配合上自动化工具,即可完成自动扩缩容的场景。对于另一些采购资源周期比较长的公司来说,能根据过去资源的使用情况预测下半年或者下一整年的资源配置是非常重要的,这能尽量使得资源利用率得到提高。
下图是一个时序预测的样例图:
方法汇列
这里对上面提到的两个应用方向介绍些具体的方法。对于异常检测算法,目前来看大致可以分为以下几种:
统计类算法:
复杂度低,计算速度快,泛化能力强,不需要大量的带标签数据做训练。但是某些算法的适用需要先验的了解指标的统计分布特性,并且无法“进化”,因为本质上还是属于某种规则。
机器学习算法:
鲁棒性较好,准确率较高。有的需要进行特征工程,训练模型,泛化能力一般。
深度学习算法:
计算复杂度高,需要进行特征工程,并且需要大量的数据进行训练,对于新标签可以重新训练,“进化”的越来越准。整体来看准确度最高。
但是在运维领域,机器学习和深度学习模型的落地经常会有“水土不服”的现象,主要体现为:
1、异常点的判定标准不统一,如上所说,异常的判定是需要结合业务情况的,而业务情况通常千奇百怪,难以有统一的异常判断标准对所有业务数据进行打标签工作。异常判断标准不同会导致模型的复用性变差,不能覆盖所有指标。
2、标签工具与工作量,很多公司的运维人员可能会面对数以万计乃至百万千万计的监控指标,打标签工具如何与大量的指标结合呢,打标签这么枯燥而繁杂的工作量消耗的人员成本也是巨大的,需要懂各类业务指标,并且能准确的标记,这是很难做到的,而一旦标签数据不准确,就会导致模型的准确率下降。
3、正负标签的样本量差距极大,在目前可用性极高的软件系统中,异常的指标一般占比不足1%,如何平衡正负样本的数量来进行模型训练也是需要解决的问题。
4、模型管理与部署,随着业务变更,资源扩缩,指标的形态是会发生变化的,当模型的准确率下降,是需要重新训练和部署模型的,这其中涉及到MLOps的持续训练了(CT,Continuous Training),需要工程化的流程来支撑,复杂度进一步加大。
5、特征工程,对于时序数据,通常会生成各类时序特征后再输入模型,特征工程的计算量及耗时对于实时性要求比较高的指标异常检测可能是个需要考虑的问题。
考虑到指标异常检测的费效比,是否要上机器学习乃至深度学习模型值得三思。
目前,统计类/无监督学习的算法在异常检测场景中因为“更接地气”,因此也更多的被运维工具/平台所采用。下面列举了一些常用的统计类和无监督机器学习算法,在后面算法介绍的部分会有进一步的说明。
统计类算法:Nsigma(含一阶差分与不差分两类),箱线图,EWMA,KDE
无监督机器学习算法:DBSCAN,孤立森林,LOF局部异常因子,OneClassSVM
对于指标预测算法,从不同的角度看有不同的分类:
*从实现原理的角度,可以分为传统统计学,机器学习(又分非深度学习和深度学习)。
*按预测步长区分,可以分为单步预测和多步预测,简单来说就是一次预测未来一个时间单元还是一次预测未来多个时间单元的区别。
*按输入变量区分,可以分为自回归预测和使用协变量进行预测,区别在于维度中是否含有协变量,例如预测未来销售量时,如果只接受时间和历史销售量数据,则是自回归预测,如果可以接受天气、经济指数、政策事件分类等其他相关变量(称为协变量),则称为使用协变量进行预测。
*按输出结果区分,可以分为点预测和概率预测,很多模型只提供了点预测而不提供概率预测,点预测模型后再加蒙特卡洛模拟(或其他转化为概率预测的方式)往往不能准确反映模型输出的预测概念,而在大多数场景下,概率预测更贴近事实情况,对于未来的预测本身就应该是一种概率分布。
*按目标个数区分,可以分为一元、多元、多重时间序列预测。举例理解,使用历史的销售量预测未来1天的销售量为一元时间序列预测,使用历史的进店人数、销售量、退货量预测未来1天的进店人数、销售量、退货量(预测目标有三个)为多元时间序列预测,使用历史的红烧牛肉面、酸菜牛肉面、海鲜面的销售量预测未来1天的红烧牛肉面、酸菜牛肉面、海鲜面的销售量(预测目标有三种)为多重时间序列预测。[1]
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ15101117,本站将立刻清除。