低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

通过机器学习和时间序列数据理解软件系统行为

2018 年 8 月 08 日

关键要点

  • 在深入了解使用机器学习来了解软件系统行为之前,必须先了解传统的时间序列方法。
  • 时间序列数据的值缺失可能会在分析时导致意外结果,Pandas 库可以帮为你填充合理的默认值。
  • 当人们在使用你的服务时,你应该期望数据具有季节性。在设计预测算法时要考虑到这一点。
  • 请注意你为异常检测设置的阈值。在单个服务器上不太可能发生的事件在对应用程序进行扩展之后很可能会发生。
  • 在分析时间序列时,需要了解你想要实现的目标。确保不要只是使用简单的确定性 SQL 分析工具。了解你的算法的行为,了解你是否正在自动化对算法的解释,或者你是否正在将数据转换为预测残差并使用它们。

2018 年 QCon.ai 大会上,David Andrzejewski 呈现了“通过机器学习和时间序列数据来理解软件系统行为”的演讲。David 是 Sumo Logic 的工程经理,Sumo Logic 是一个基于云的机器数据分析平台。运行软件系统(如应用程序或云群集)的开发人员可以将 Sumo Logic 作为日志记录的后端。Sumo Logic 为机器数据提供持续智能。

我们使用软件来解决很多问题,而人工智能技术开始进入到软件世界。在深入研究机器学习对软件系统行为的影响之前,必须先了解传统的时间序列方法。了解传统方法的局限性可以让你在选择技术时做出明智的权衡。首先,问问自己是否知道要完成什么任务。然后再试着问自己是否可以通过简单或确定性的分析来实现这一目标。只有在其他方法不可行的情况下才考虑是否使用机器学习。

了解软件的运行状况以及为什么会发生故障可能很困难。公司在部署服务时,如果这些服务依赖了其他多个主机上的微服务,那么可以列出这些微服务之间的依赖关系,并绘制成图表,这样有助于理清服务之间的关系。在绘制这些图标之后,你可能会得到一个人们称之为微服务死亡之星的图像:



很多应用程序每天都生成数 TB 的日志,包括千兆字节的源代码,并且每分钟输出数百万个度量指标。手动分析这些数据是不现实的,因此你需要机器智能的帮助。但是,通过分析数据来找出系统运行状况是一项艰巨的任务,即使不是不可能完成。有一篇有趣的论文深入研究了数据的粒度——“神经科学家可以理解一个微处理器吗?”。论文的作者使用模拟器来玩大金刚游戏。因为他们可以访问模拟的内存,所以可以访问系统的完整状态。从理论上讲,这意味着有可能可以通过分析数据从较高层面了解系统正在做什么。不过,尽管这种策略可以提供小的见解,但只通过查看数据似乎并不能让你从更高级层次完全理解大金刚游戏的运行状态。

当你仅使用原始数据来理解复杂、动态、多尺度的系统时,这种剖析变得非常重要。将原始数据聚合到时间序列视图中可以让我们更容易看清问题。谷歌的“Site Reliability Engineering”是一本非常好的参考书,可以免费在线阅读

了解复杂、动态、多尺度的系统对于轮班待命的工程师来说尤为重要。当系统出现故障时,他或她必须能够知道系统在做什么。为此,工程师既需要原始数据,也需要可视化的方法,以及能够聚合数据的更高级别的指标。在这种情况下,工程师通常需要将故障服务器与其他服务器的行为做对比,或与昨天的行为做对比,或与进行软件更新之前的行为做对比。



百分位的好处和不足

在查看一长串日志数据时,你不会只看连续几毫秒的数据细节。你可以按照时间来量化数据。最基本的方法是使用 min、max、average、sum 和 count 等函数。很多人在聚合数据时也喜欢使用百分位。百分位的优势在于它们可以用明确的语言来表达你的数据。例如,“加载一个请求最长的时间是 4,300 毫秒”,这句话很精确,但无法用来确定它与正常操作之间有多少差距。但是,如果说成“p99 小于 2,000 毫秒”,它就可以告诉我们,不超过 1%的客户请求需要超过两秒的加载时间。

百分位的缺点是难以将数据组合成有意义的东西。虽然 50%左右的值趋于稳定,但较高的百分位会有很大差异,并且可能值会呈现出长尾分布。另一个问题是很容易就聚合成对几个数据集的简单分析。你可以基于两个数据集的最小值来计算它们的整体最小值。但是,你不能简单地使用百分位方法。从数学角度来讲,我们不可能将数据集 X 的 p95 与数据集 Y 的 p95 组合在一起。这意味着如果没有进一步的分析,只是组合多个数据集并不一定是有意义的。

重要的时间序列概念

最基本的时间序列监控是比较时间移位。如果你要将一个群集的写入延迟与前一天相同主机的写入延迟进行比较,这一点就尤为重要。它也可以与窗口数据结合在一起,称为“按时间分组”。更多信息可以在 Tyler Akidau 的 2016 年洛杉矶 QCon 的演讲中找到,他基于 Apache Beam 讨论了这个概念。

处理缺失的数据也很重要。在应用机器学习之前,你必须知道如何处理缺失值。使用常数值(如零或无穷大)来代替缺失值可能会导致意外结果。但是,如果不处理缺失值可能会在运行时产生异常。这个问题可以通过使用 Python 的 Pandas 数据分析库来解决,它简直就是处理数据操作问题的瑞士军刀。你可以使用 fillna() 方法,该方法会提供一些合理的默认值。需要注意的是,有很多有趣的方法可以填补数据中的空白,还有其他很多可以使用的研究成果和方法。有些领域称其为“预测”缺失数据,有些领域称其为“插补”、“推断”或“抽样”。你可以进行向前填充,回填或插入。



应用数据

在搭建日志记录系统时需要考虑如何设置固定阈值警报。设置警报的目的是在网站出现故障或发生其他意外事件时能够唤醒某人。在开发警报系统时,很多人会聘请可以为系统设置合理阈值的领域专家。例如,你可以设置一个警报,在 5%的请求需要两秒以上的处理时间时触发警报,此时它会通知正在待命的工程师。

然而,人类专家难以扩展。你可能希望能够自动将机器行为与其他机器行为进行比较,尤其是当你有很多机器并输出很多时间序列时。你无法自己分析和比较所有的时间序列,并且当机器非常多时,更不可能这样做了。此时,你可以尝试应用机器学习。

预测模型和异常值

一种方法是使用预测建模进行异常值检测。通过预测机器的正常行为,就可以在机器的行为超出预测结果范围时检测出它们。但是,在能够实现这样的操作之前,你需要考虑很多因素。你需要问自己四个关键问题:

  • 这种行为是否有规律性?
  • 如何为这种行为建模?
  • 如何基于期望定义主要偏差?
  • 检测意外情况和偏差是否真的很有价值?

在进行预测建模时需要考虑的重要事项是数据的季节性或节奏。任何有人类参与的服务都有潜在的节奏。例如,大多数人在工作中使用 Sumo Logic,这意味着任何给定国家的 Sumo Logic 使用数据将显示出在正常工作时间内有大量的活动,但在这些时间之外不会有太多活动。但是,Netflix 的使用数据可能会显示出相反的趋势。你可以通过手动调整数据或使用傅里叶变换对此进行建模,也有很多人会使用隐藏马尔可夫模型。



基于距离的时间序列数据挖掘

当你有多台计算机时,可能希望将计算机的行为进行相互比较。如果你看到一台机器出现奇怪的行为,就会想知道其他机器的行为是否相同。也许他们运行的是不同版本的软件,也许它们在同一个数据中心中,或者可能正在发生其他事情。要分析这些问题,你需要比较时间序列之间的距离。



你应该使用什么指标来确定两个时间序列之间的相似性?只是通过简单的基于时间的相减肯定会得出错误的结果。在上图中,虽然时间序列非常相似,但得出的指标会告诉你,它们是完全不同的。

你可以使用一整套指标。有一种非常流行的技术,叫作动态时间扭曲,它会询问你为了让时间序列更好地对齐将如何对时间序列进行修改、扭曲或破坏,以及你需要为这些操作付出什么代价。有了这个指标,你就可以找到 N 个具有最类似行为的主机,也可以绘制出主机相似性图表。通过查看谱聚类图像就可以知道主机间的结构情况。



使用日志数据进行异常检测和事件分类

有一些方法可以用于将日志数据转换为时间序列。当你拥有大量的半结构化字符串时,可以对消息进行计数或从中提取信息。这些日志是近似的程序执行跟踪。你的机器一旦进入生产环境就无法再使用调试器,只能通过这些日志消息推断软件的行为。如果你的程序的每个请求在超时时都会打印一个字符串,就可以计算每小时的超时次数。这样你就可以得到一个时间序列,然后将它们用在分析上!

你可能想要为某个时间序列的值设置阈值。但是,你又不想欺骗自己,比如把一个没有意义的事件当成是一个有趣的事件。想象一下,你拥有一个超精确的模型,它会在模式发生的可能性仅为 0.01%时发送警报。当你的服务有一百万个时间序列时,大约会有一百个误报。Baron Schwartz 在他的演讲“为什么没人关心你的异常检测”中详细介绍了应该用什么技术来确定阈值。

深度学习领域近来出现了很多新进展,你可能希望在预测和异常检测上使用深度学习,但深度学习仍然无法让你摆脱理解问题域。你仍然需要找到解决问题的方法,一种可能的方法是使用递归神经网络进行预测。如果你碰巧可以访问大量的训练数据,那么这会是个好主意。但如果没有,你的首要任务应该是在尝试使用数据之前聚合数据。

总之,在检查数据方面需要做很多深入的工作。机器与我们的生活息息相关。这些机器产生数据,但分析数据很复杂,所以我们需要借助机器学习。防止噪音和误报非常重要,要做到这一点,必须确保你明白自己想要做什么,要知道为什么没有使用确定性的 SQL 分析工具,并从数学角度理解你所使用的方法。最后,要知道你自己是否在自动化解释你的算法,或者在将数据转换为预测残差,并将其用于异常预测。

关于作者

Roland Meertens 是一名计算机视觉工程师,致力于为奥迪子公司 Autonomous Intelligent Driving 的自动驾驶汽车提供人工智能解决方案。他从事过很多有趣的工作,如神经机器翻译、小型无人机的避障,以及给老年人使用的社交机器人。除了 InfoQ,有时也会在他的博客 PinchofIntelligence 和 Twitter 上发表有关机器学习的文章。在业余时间,他喜欢参加越野障碍赛。

查看英文原文 Understanding Software System Behaviour With ML and Time Series Data

2018 年 8 月 08 日 18:261362
用户头像

发布了 731 篇内容, 共 370.6 次阅读, 收获喜欢 1865 次。

关注

评论 1 条评论

发布
暂无评论
发现更多内容

从流程、认知上做稳定的系统演进

Skysper

系统设计 质量管理

走出舒适区最好办法别走了,扩大它

乐少

删掉最后一句话

池建强

心理学 情绪控制

喔,明白了,成功也是一种苦难

霍太稳@极客邦科技

创业 身心健康 企业文化 个人成长 心理

《小狗钱钱》——财富离我们并不遥远

尹晓铁

读书笔记 投资 成长 思维方式

规范约束条件

喵叔

C# .net 编码习惯

禁止在构造函数里调用虚函数

喵叔

C# .net 编码习惯

是时候要说再见了,春风十里,不如邮你!

乐少

dubbo-go 中如何实现远程配置管理

joe

golang Apache 开源 微服务架构 dubbo

小议RPA

一品凡心

人工智能 RPA 自动化

分布式数据库是无用的屠龙术吗?

海边的Ivan

企业架构 分布式数据库 业务中台

【深度】为您解读东西方艺术教育的专业设置差异对比~

默聲

多用as少用强制类型转换

喵叔

特别评论:甲骨文的傲气

张晓楠

云计算 互联网巨头 企业文化

初入响应式编程(上)

CD826

spring 微服务 Spring Cloud 响应式编程 reactor

任正非管理哲学中的三个常识和三种科学

霍太稳@极客邦科技

创业 团队管理 华为

做小池塘里的大鱼,还是大池塘里的小鱼?这是个问题。

霍太稳@极客邦科技

创业 团队管理 目标管理

精纯还是混乱?职场十二箴言——重读“成为乔布斯”的思考(二)

石君

创业 乔布斯 成为乔布斯

做产品的同理心

孙苏勇

产品 产品经理 产品设计

探究vscode debug流程,解决无法运行go程序的问题

simpleapples

golang vscode

GitHub知错就改,是个好同志

遇见

GitHub

Elasticsearch文档版本冲突原理与解决

Skysper

elasticsearch 乐观锁 悲观锁

翻译: Effective Go (2)

申屠鹏会

go 翻译

减少装箱与拆箱

喵叔

C# .net 编码习惯

精纯还是混乱?职场十二箴言——重读“成为乔布斯”的思考(一)

石君

职场 乔布斯 成功学

HTTP Methods和RESTful API的设计

孙苏勇

架构 系统设计 RESTful 接口

我的第一个千万阅读量

彭宏豪95

创作 生活 写作

测试

Chonge

如何做一名失败的安全架构师

石君

架构 安全架构师 安全评估

var lady first

喵叔

C# .net 编码习惯

用你喜欢的 emoji 作为页面的 favicon 吧 🎉

遇见

CSS html favicon emoji

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

通过机器学习和时间序列数据理解软件系统行为-InfoQ