当前位置:首页 > 新闻中心 >新闻详情

2022 CCF国际AIOps挑战赛赛题与赛制解读

发布时间:2022-03-24 11:46:34


本文根据清华大学计算机系赵能文博士在宣讲会上的赛题&赛制介绍整理而成,全文分为挑战赛背景、挑战赛赛题、数据解读、参赛流程、初赛与复赛的评估方法等部分,最后简要介绍学术界已经发表的相关成果,供选手参考。

背景介绍

近年来软件系统领域有两个显著的趋势。第一个趋势是随着云计算的发展,软件系统架构由单体架构逐渐转变为面向服务的架构。如此便可开发细粒度、松耦合、通过API互相连接的服务,达到持续开发和灵活扩展的目的。其中微服务架构就是典型代表,部署在云上、面向服务的架构可以适应系统规模的快速增长,具备更快的迭代速度、更低的开发复杂性和更好的可扩展性,但它的部署和运维复杂性却大大增加,给故障检测和诊断等运维工作带来挑战。
 
第二个趋势是传统人工运维逐渐向智能运维转变。传统人工运维是基于运维人员的领域知识,人工分析故障原因或者编写自动化脚本进行检查。这一过程耗费大量的时间和人力成本,且人工运维难以应对系统规模增大和复杂度增加带来的挑战。

据Gartner预测,企业IT基础设施平均每年生成的IT运营数据正在以2—3倍的速度不断增长。面对如此海量的数据,伴随人工智能、机器学习和数据挖掘的兴起,智能运维应运而生。运维知识、运维数据和人工智能的结合,就是AIOps研究和实践的核心。
 
为保证软件服务的可靠性与稳定性,AIOps的核心场景是故障的快速发现与诊断,也就是基于软件架构中基础设施层、应用软件层和业务层采集到的监控数据,基于故障图谱、知识图谱和各种算法引擎,实现故障的及时发现、快速诊断乃至提前预警。
 
如今的故障发现和诊断面临两大挑战。首先是云原生的架构下传统面向虚拟机的运维变成了面向容器的运维,且系统复杂性较高。一家大型企业可能有几千个微服务,每个微服务对应一些实例,在海量的实例中又存在复杂的依赖关系。此外,基于云原生架构的软件服务是动态的,随着devops, CI/CD等持续集成技术的发展,软件版本迭代速度随之变快,静态的异常检测、根因定位模型无法适应动态环境的变化。
 
 
 
另一个挑战是多模态的运维数据。运维数据类型较多,比较典型的包括指标、日志和调用链。指标也被叫做KPI,能够反映业务状态和机器性能的时间序列数据。日志是一种程序打印或者执行代码输出的非结构化文本。调用链则是在系统完成一次业务调用的过程中,把服务之间的调用信息连接成的一个树状链条。
 
目前大多数监控系统以及学术界的一些工作主要聚焦单一数据源,比如指标异常检测、日志异常检测等。这些多模态运维数据可以反映系统状态的全方位信息,从而给出更精准的故障发现和诊断结果。但是如何关联和融合多模态数据,并从多模态数据中挖掘关键信息用于故障发现和诊断是算法面临的挑战。
 
针对以上挑战,结合面向云原生架构和多模态的运维数据,“微服务架构电商系统下的故障识别与分类”作为本届挑战赛赛题应运而生。

 
挑战赛赛题解读 
 

本届挑战赛的数据来源于基于微服务架构的模拟电商系统。系统部署在建行云上,其流量和真实业务流量一致。故障场景是由真实系统中总结的故障类型,分批进行故障重放。比赛数据包括应用服务的动态拓扑、实时调用链数据、实时业务黄金指标、性能指标和日志。性能指标来自于容器、操作系统和JVM等。另外在本届比赛结束后,我们计划依托建行云打造AIOps Live benchmark,持续在云上为大家提供丰富数据。
 
这里回顾一下历届挑战赛赛题:
 
相比往届,本届挑战赛有几大亮点:首先是引入了新赛题——故障分类;第二是面向K8s云原生架构这一主流趋势,在不同层级注入更加丰富的故障类型。
 
今年的故障诊断题目从根因指标定位改为故障分类。根因指标定位是一种无监督方法,但是根据实际的运维经验,故障根因的分布是满足28定律的,其80%故障的根因总是那么几种,且完全无监督的方法忽略了历史故障信息。因此为了充分利用历史故障数据,今年改为有监督的故障分类,需要从多模态的运维数据中挖掘历史故障指纹模式用于分类。具体的故障模式可以表现为故障期间的指标异常模式或者日志异常模式。
 
另外,根因指标的定位粒度是指标。但在实际运维中,指标的粒度过于细致,无法给出运维人员可操作的止损决策。且指标间是有关联的,故障发生时可能有多个指标表现异常。相比之下,故障分类可以直接端到端给出故障场景,结果更加明确,使运维人员可以直接采取对应的止损措施。
 
本届挑战赛的系统是基于谷歌开源的hipstershop,由许多不同语言编写的微服务组成。上图的矩形框表示不同的微服务,用户通过前端微服务Frontend访问整个系统。针对每个微服务有相应的容器监控,部署的虚拟机也有对应的监控数据。

 
系统采用动态部署架构,主要包含10个核心service和6个虚拟机。每个service部署了4个Pod,共有40个Pod。这40个Pod动态部署在6个虚拟机上。上图右侧展示了Pod、service和node之间的对应关系。
 
针对比赛的故障场景,我们在三种层级注入故障,分别是service级别、pod级别、node级别。其中service和Pod级别的故障主要针对k8s容器的故障,包括网络延迟、网络丢包、资源包损坏、资源包重复发送、CPU压力突增、内存压力突增、磁盘读压力、磁盘写压力和进程停止。
 
service故障是指对该service下所有的4个Pod都注入故障,而pod故障则是只针对某一个pod进行故障注入。node的故障类型主要有6种,分别为内存压力突增、磁盘空间满、磁盘读、磁盘写、CPU压力和CPU缓慢增长。
 
为了贴合实际,本届挑战赛基于微服务系统收集了海量多模态监控数据,包括指标日志和调用链。指标又包括业务指标和性能指标,业务指标共有4种,性能指标有400种左右。每天的数据压缩后大约有800兆,和实际运维场景的数据量接近。在未来发布数据时,我们会配备详细的数据说明文档,方便大家理解这些海量监控数据。
 
下面详细介绍比赛数据集的数据格式。
 
  • 业务指标,通常也叫黄金指标。它包含10位的UNIX标准时间戳,具体类型分别是系统响应率、业务成功率、交易量和平均响应时间。这里的采样间隔为一分钟,业务指标监控粒度按照服务层面监控,其中service字段标注了该业务指标来自哪个服务。

 
  • 性能指标,记录基础设施层面的性能信息。它的格式包括时间戳、cmdb_id、kpi_name和value。由于K8s的部署架构不同于去年的虚拟机部署架构,所以这里不同类型的性能指标对应的cmdb_id格式可能不同。
 
比赛涉及的性能指标主要有几大类:
 
  • Container指标,主要用于监控容器状态,也就是Pod粒度的监控。Container的cmdb_id是node:pod的格式,也反映了Pod和node之间的动态部署关系。
  • Node指标,用于监控虚拟机状态。node指标的cmdb_id对应的是相应虚拟机名称。
  • JVM指标及Istio指标,用于监控JVM和服务调用。

 
  • 日志格式,包括日志的ID、时间戳、cmdb_id、日志名称和日志原文信息。
  • 调用链格式,包括时间戳、调用链的对象名、父亲span id、本流程的span id、全局的trace_id,以及当前该流程的处理时间。调用类型分为gRPC和https。
 
 

挑战赛赛程介绍



本届挑战赛的正赛部分包括初赛、复赛和决赛三个阶段。报名阶段从3月10日起至4月12日止,目前报名火热进行中。4月12日将开启热身赛,帮助大家提前熟悉数据格式和测试算法。
 
初赛阶段
 
等待选手的建行云资源就绪后,将开始正式比赛环节。初赛阶段选手将在建行云熟悉环境,进行代码的测试和调优,随后进行在线评测,预计5月上旬初赛结束,热身赛也随之结束,按照最后测评的结果排名。进入复赛的选手需要提交代码,原则上不多于20支队伍进入复赛。
 
复赛阶段
 
预计从5月中旬至5月下旬,仍然采用在线评测方式,期间选手不可对代码进行调优。5月下旬复赛结束,选手需要提交代码,原则上不多于10支队伍进入决赛。
 
决赛阶段
 
预计在6月下旬举办决赛答辩,对复赛结果和答辩效果加权计算,根据总成绩决出最终奖项。
 
 
 
本届挑战赛面向全社会开放,但数据集建立和维护过程中能接触到数据的同学不能参赛。参赛队伍不限制参赛人数,但如果一个人同时加入多支队伍,与该人员关联的所有队伍都会被取消资格。具体报名方式如下:
 
建行云资源分配后,需参照官网说明在一周内激活。如果没有按时激活,资源将被回收,一支队伍有一个人登录便算作激活。
 
报名中有两个注意事项。首先是选手报名后,每一位选手都需要填写调查问卷,问卷的地址在“数据”页签下面。另外组队完成后一定要由队长点击确认,才会被认定为已就绪的队伍。只有确认组队完成,主办方才会为选手分配建行云资源。后续我们会在微信群进行赛事通知和相关的技术答疑,建议队伍里的每一位成员入群,扫描上图二维码添加AIOps_Challenge微信号,备注报名参赛即可进群。
 
本届挑战赛注重代码审核,进入复赛和决赛的队伍都需要提交代码,将代码和执行脚本放在云服务器指定路径上。主办方将复现结果,并且检查代码是否有硬编码等违规情况。
 
从首届国际AIOps挑战赛举办至今,大赛官网已累计注册4320余人,微信竞赛交流群吸引了2000多位同行,6个官方微信群成为了活跃的AIOps社区。本届挑战赛奖金池总额为26万元。冠军队伍一支,奖励10万元;亚军队伍两支,分别奖励5万元;季军队伍三支,分别奖励2万元。

 
 
挑战赛评估方法
 
本届挑战赛的初赛和复赛采用在线评测方式。其中微服务系统生成的实时监控数据会转发到主办方的评测机器,处理后通过Kafka发布给选手。选手订阅Kafka,按照指定的topic读取数据进行检测和分类。选手检测到故障后,把结果通过post提交给评测系统,评测系统会展示排行榜。
 
 
整个比赛的数据发布和评测环境都依托于建行云。选手检测到故障后,需要定位到故障发生的位置和故障对应的类别进行提交,具体的提交格式为一个二元组,包括cmdb_id和failure_type。
 
评分规则主要从以下几个方面考虑,分别是故障检测延迟、故障检测准确率、检测召回率、定位准确率和分类准确率。
 
整个故障检测过程中,选手共有k*N次预算,目前的k暂定是3。不过随着赛程的推进,后面可能会根据大家的反馈和实际的得分情况来缩小k值,从而提高对算法准确性的要求。
 
系统以每次故障为单位对选手进行评分,具体细则见上图。
 
为了帮助大家更好地理解评分规则,我简单举例说明。假设adservice-0这个Pod在8:00:00时发生CPU压力突增的故障。那么如果选手甲在8:00:50时提交[adservice-0,K8s容器CPU压力突增]的结果,可以看出故障位置和类别判断均准确,所以loc和clf均得5分。因为在一分钟内检测出来,所以delay_score正好是上限一分,最终得分为满分10分。
 
选手乙在8:00:50时提交[adservice, CPU压力突增],可以看出故障位置是错误的,因为他把Pod的级别误判为service级别的故障;但故障类别是准确的,所以clf等于5,loc等于0。同样因为在1分钟内,所以delay_score等于1,最终得分为5分。
 
选手丙在8:05:50时提交[adservice-0, 内存压力突增],他的位置判断是准确的,但故障分类是错误的,所以loc等于5,clf等于0。因为他在故障发生5分钟后才检测到,所以delay_score等于0.75,最终得分等于0.75×5,共计3.75分。
 
选手丁在8:10时提交[adservice-0, CPU压力突增],故障位置和故障类别都判断准确,但因延迟较高,刚好在最后10分钟时检测出来,所以delay_score正好是下限0.5,所以最终得分等于0.5×10,共计5分。
 
 
上述评分规则是根据实际物理意义制定的初步方案,如果在比赛过程中对评测方案有意见或建议,欢迎大家共同讨论交流。
 
此外,从热身赛到初赛再到复赛,我们会根据实际情况考虑,不断加大难度,对选手的算法提出更高的要求。预计4月初热身赛开始前,在GitHub上公开我们的评测脚本,方便大家更好地理解评测方案,也可以自我验证和测试。
 
 
 
 
参考文献 


我们整理了一些学术界的故障检测、故障分类方法给大家作为参考。
 
单指标异常检测。从比较早的有监督方法到现在流行的无监督方法,逐步解决了数据标注、模型训练等问题。
 
多指标异常检测。对于一个系统而言,单条指标难以表征其整体状况,需要综合多维度指标进行判断。考虑到一些机器性能指标数量巨大,对单一指标做异常检测容易产生很多告警,且模型训练开销大。针对这一问题,近几年学术界有很多关于多指标异常检测的工作,这里列出的4篇都是我们实验室近几年发表的相关论文供大家参考。
 
日志异常检测。目前学术界有很多研究,早期的工作大多采用传统统计方法,比如PCI聚类和不变量挖掘。近几年有很多基于深度学习的日志异常检测工作,分别从不同的角度进行完善。
 
调用链的分析与异常检测。调用链有监督方法如FSE2019,无监督方法如ISSRE2020。具体细节大家可以阅读原文。
 
故障分类。这里的第一篇和第二篇都是我们实验室发表的。
 
除了上述学术论文,2020年和2021年的挑战赛赛题也与故障检测与诊断有关。大家可以参考以往获奖队伍的解决方案,具体方案细节可以通过AIOps workshop (https://workshop.aiops.org/)或者“智能运维前沿”公众号阅览。以上论文和解决方案仅供大家参考。
 
以上是关于本届挑战赛赛题与赛制的全部介绍,预祝各位选手在本届大赛中取得优异成绩,谢谢大家!
 
  
 
   






 

TOP

010-82362970