如何用AI降低50%的服务器成本并自动发现系统异常

近年来,全球云计算支出以及云服务的需求出现了爆发式增长。德比软件在AWS上面就有几千台机器在运行公司的各种服务。服务器包括了集群和单个机器等各个业务线的各种应用。所以机器的人力维护成本不断增加,并且复杂性也不断增加。导致了机器的利用率不是最优。使得机器使用的成本大幅增加。因此,优化机器使用率,降低机器成本变得刻不容缓。同时,由于德比软件有成千上万的对接业务导致了很多环节又出错的可能性。任何一个环节出错都可能导致业务的延迟或者停止。目前的报警和人工的查看很难覆盖到所有业务服务器出错的可能性。

人工智能技术正好可以高效解决上述的问题。它通过学习过去的数据来预测和发现问题而无需人工设置规则,从而减轻了人工运维的工作量和更精准地发现问题所在。德比软件利用人工智能技术推出了容量预测和异常检测两个服务解决上述问题。

和容量预测不同的是容量规划很难在大规模的情况下做到精准。主要是因为软件服务的业务有时候是不可测的,分布式服务非常复杂,工程师也是人需要休息,同时知识传承没有扩展性。所以我们把重点放在容量预测上。比如,我们很多服务器集群的利用率非常低。通过我们的容量预测可以告诉相关团队未来可能的安全容量,工程师根据我们的建议结合实际业务做出调整。这样既节省了人力运维又通过工程师和业务的最终确认在降低机器成本的同时也没有牺牲服务的质量和稳定性。如下图所示:

我们通过Quantile Regression模型测试了我们一个Dstorage的服务器集群的TPS和CPU利用率的关系。红线表示CPU随着TPS增加的趋势。黄线表示在99.99%的情况下所在的TPS是不会超过当时CPU 黄色那条线的。这就给了工程师一个非常量化的建议,他们可以根据实际情况和他们的业务经验来调整机器以达到在满足业务的需求的同时使得机器利用率最优并且保证可靠性。

容量预测是对工作负载核心指标的预测,即CPU,内存,磁盘,网络套接字数,网络带宽等的使用。除了使用更先进的计算和存储技术,云服务的容量预测变得日益重要。互联网服务的容量预估则是根据已有的工作负载和资源使用情况下,对未来负载变化和资源使用情况做规划。

单个云计算用户和组的使用是难以预测的,因为它们经常有时间变化的趋势,但是总体使用相对更容易预测。可以尝试预测云计算总体的工作负载。另外,时间序列的特征有周期行为,节假日,变化趋势和特殊事件等。

传统的统计预测方法需要针对每种情况下的增长模式进行调整。例如,一些时间序列呈现线性增长,其他时间序列呈指数增长,其他时间序列可能具有季节性成分。可以通过综合预测方法来应对这一挑战,使我们能够通过最少的手动参数调整在大量时间序列中构建一个稳健的模型。预测常有以下方法:

  • 基于线性回归的方法。经典时间序列模型如自回归积分移动平均值(ARMA /ARIMA)和Holt-Winters指数平滑可用于在线预测。这些模型首先需要使用过去观察结果进行训练,并可以预测即将到来的工作量。
  • 深度学习方法(神经网络,DeepAR)。
  • 其它非线性回归方法(Prophet)

我们研究了上述几种方法之后,综合了准确率和训练运行效率之后选用了Facebook开源的Prophet算法模型。Prophet是一个预测时间序列数据的模型。 它基于一个自加性模型,用来拟合年、周、季节以及假期等非线性趋势。 它在至少有一年历史数据的日常周期性数据,效果最好。 Prophet对缺失值,趋势的转变和大量的异常值是有极强的鲁棒性。在时间序列分析领域,有一种常见的分析方法叫做时间序列的分解(Decomposition of Time Series),它把时间序列分成几个部分,分别是季节项 ,趋势项 ,剩余项  。一般来说,在实际生活和生产环节中,除了季节项,趋势项,剩余项之外,通常还有节假日的效应。所以,在 prophet 算法里面,作者同时考虑了以上四项,也就是:

其中 g(t) 表示趋势项,它表示时间序列在非周期上面的变化趋势;s(t) 表示周期项,或者称为季节项,一般来说是以周或者年为单位;h(t) 表示节假日项,表示在当天是否存在节假日;e(t) 表示误差项或者称为剩余项。Prophet 算法就是通过拟合这几项,然后最后把它们累加起来就得到了时间序列的预测值。下图Facebook的事件数据表现出上面的规律特别适合Prophet算法。

德比软件已经在生产环境部署了容量预测的服务。并且为公司的业务团队提供了容量预测的指导帮助业务团队减少了服务器的容量。下图是给一个集群做的容量预测。

图中绿色圆点表示的是实际的Shop服务的API请求量,蓝色的实线是表示的预测值,阴影部分是预测的置信空间。可以看到过去的实际访问请求量大部分都落到了预测的置信空间里面。容量预测提供了未来24小时的预测值。工程师可以由此来判断未来的访问量决定是否增减机器。

容量预测服务同时也进一步提供了集群机器的数量建议。如下图所示

上图是我们根据AI的预测从原来的12台服务器开始减少服务器,

这个图是我们目前将这个集群的服务器数量从12台降至6台,系统还是在平稳运行,还有更多的优化空间。AI预测给出的机器数已经考虑到40%的余量。工程师根据我们的预测服务的数据支持更有信心地去减少了服务器的数量从而在保证可靠性的前提下提高了机器的利用率。目前德比软件上线容量预测集群 14个,共 114台机器。其中一个集群容量预测由12台机器减少到6台,优化成本50%,另一个集群由9台减少到6台,优化成本30%,第三个集群由9台 m4.2xlarge -> 12台 r5.xlarge,优化成本(0.4*9 – 0.252*12)/ (0.4*9) = 16%。以上的服务已经初见成效。证明上述的方法是正确的路径。未来容量预测服务会推广到公司更多的集群和服务中去。

异常检测(Anomaly detection)是目前时序数据分析最成熟的应用之一,定义是从正常的时间序列中识别不正常的事件或行为的过程。有效的异常检测被广泛用于现实世界的很多领域,例如量化交易,网络安全检测、自动驾驶汽车和大型工业设备的日常维护。以在轨航天器为例,由于航天器昂贵且系统复杂,未能检测到危险可能会导致严重甚至无法弥补的损害。异常随时可能发展为严重故障,因此准确及时的异常检测可以提醒航天工程师今早采取措施。德比软件的成千上万的对接服务也是非常复杂,任何一个地方出错也会导致下游OTA的故障。所以德比软件也推出了异常检测的服务来提升我们服务的质量和稳定性。

在使用异常检测服务之前,德比软件也有基于规则和固定阈值的提醒和报警。这是非常重要的,帮助我们发现了很多问题。但是对于成千上万的对接也会出现一些异常由于各种原因成为漏网之鱼。异常检测可以通过学习历史数据而不需要大量人力去设置规则,从而大大减轻了工程师的工作量并且增加了提醒和报警的覆盖率。

下图是异常检测第一版的架构图:

数据的展示和采集值存在Prometheus,持久化的数据包括历史时序数据和模型输出数据存在AWS的S3,Mysql里面存着所有指标的数据。异常检测在Go的服务中实现了全链路覆盖。

异常检测的服务目前已经上线并且集成到德比软件自己研发的报警系统Beaconfire和Slack。使用异常检测的团队可以根据自己的需求在报警系统设置不同层级的报警提醒功能。异常检测上线以后已经多次为相关的工程师团队提供了很多的报警和提醒。从上线到现在半年多的时间里,我们的准确率是92%,召回率是100%。并且很多提醒都在原来报警之前已经被异常检测发现。还有一些系统的异常没有被现有报警系统发现的也被异常检测发现。比如如下图所示:

在四月二十八日,异常检测算法发现了CPU和Socket数不在预测的范围内。工程师团队当时发布了一个错误的新版本,导致了Router的服务返回了404的错误。工程师在看到异常报警后马上回滚了发布,从而避免了更大的事故的发生。而原来的常规报警在三小时后才发现这个问题。

德比软件创始人的硅谷基因决定了公司的技术创新一直流淌公司的血液中。Innovation团队发起的这次人工智能在公司的应用已经初见成效,并且只是个新的开始。未来我们会把机器学习运用到公司更多的业务场景中去。给我们客户提供更优质更便宜的服务,让旅游变得更加容易。