如何识别服务器正常运行时间性能数据中的异常值?

机器算法验证 异常值 分位数
2022-03-07 12:07:50

我有一个 python 脚本,它创建服务器正常运行时间和性能数据列表的列表,其中每个子列表(或“行”)包含特定集群的统计信息。例如,很好地格式化它看起来像这样:

-------  -------------  ------------  ----------  -------------------
Cluster  %Availability  Requests/Sec  Errors/Sec  %Memory_Utilization
-------  -------------  ------------  ----------  -------------------
ams-a    98.099          1012         678          91
bos-a    98.099          1111         12           91
bos-b    55.123          1513         576          22
lax-a    99.110          988          10           89
pdx-a    98.123          1121         11           90
ord-b    75.005          1301         123          100
sjc-a    99.020          1000         10           88
...(so on)...

所以在列表形式中,它可能看起来像:

[[ams-a,98.099,1012,678,91],[bos-a,98.099,1111,12,91],...]

我的问题:

  • 确定每列中异常值的最佳方法是什么?或者异常值不一定是解决“坏处”问题的最佳方法?

在上面的数据中,我肯定想知道 bos-b 和 ord-b,还有 ams-a,因为它的错误率很高,但其他的可以丢弃。取决于列,因为更高不一定更糟,也不一定更低,我试图找出最有效的方法来做到这一点。似乎 numpy 被提到了很多这类东西,但不知道从哪里开始(遗憾的是,我比统计学家更像是系统管理员......)。当我在 Stack Overflow 上询问时,有人提到使用 numpy 的 scoreatpercentile 函数并丢弃超过 99% 的任何东西——这看起来是个好主意吗?

(从stackoverflow交叉发布,这里:https ://stackoverflow.com/questions/4606288 )

3个回答

根据您提出问题的方式

异常值不一定是解决发现“坏处”问题的最佳方法吗?

目前尚不清楚您是否正在寻找异常值。例如,您似乎对性能高于/低于某个阈值的机器感兴趣。

举个例子,如果你所有的服务器都是 98±0.1% 的可用性,100% 可用性的服务器将是一个异常值,97.6% 可用性的服务器也是如此。但这些可能在您想要的范围内。

另一方面,可能有充分的先验理由希望在可用性低于 95% 的情况下收到任何服务器的通知,无论是否有一个或多个服务器低于此阈值。

出于这个原因,对异常值的搜索可能无法提供您感兴趣的信息。阈值可以根据历史数据进行统计确定,例如通过将错误率建模为泊松或将可用性百分比建模为 beta 变量。在应用设置中,这些阈值可能会根据性能要求来确定。

找到异常服务器的一种简单方法是假设它们是相同分布的,估计总体参数,并根据它们的可能性对它们进行排序,升序。列可能性将与它们的乘积或它们的最小值(或其他一些 T 范数)相结合。只要异常值很少,这种方法就可以很好地工作。对于异常值检测本身,通常通过删除任何发现的异常值来迭代估计稳定的总体参数,但这并不重要,只要您手动检查列表并因此避免阈值。

对于可能性,您可以尝试使用 Beta 作为比例,使用 Poisson 作为比率。

正如 David 所指出的,异常值检测与可靠性分析并不完全相同,可靠性分析会标记所有超过某个阈值的服务器。此外,有些人会通过损失函数来解决问题——定义当某些服务器处于 50% 的可用性或 500 错误率时你感受到的痛苦,然后根据这种痛苦对它们进行排名。

将给定的数据点识别为异常值意味着存在一些数据生成过程或模型,数据预期来自该过程或模型。听起来您不确定这些模型对于您关注的给定指标和集群是什么。所以,这就是我会考虑探索的内容:统计过程控制图

这里的想法是收集
- %Availability
- Requests/Sec
- Errors/Sec
- %Memory_Utilization

每个集群的指标。对于每个指标,创建仅包含“合理”或可控值的数据子集。根据此控制数据为每个指标构建图表。然后,您可以开始将实时数据提供给您的图表代码,并直观地评估指标是否在控制范围内。

当然,从视觉上为跨多个集群的多个指标执行此操作可能不可行,但这可能是开始了解您所面临的动态的好方法。然后,您可能会为指标失控的集群创建通知服务。沿着这些思路,我使用神经网络将控制图模式自动分类为正常与某些特定的失控风格(例如百分比可用性下降或错误/秒的循环行为)。这样做可以为您提供统计过程控制图表(长期用于制造环境)的优势,但减轻了必须花费大量时间实际查看图表的负担,因为您可以训练神经网络根据您的专家解释对模式进行分类。

至于代码,pypi上有spc包,但我没有任何使用经验。可以在这里找到我使用神经网络(也是朴素贝叶斯)的玩具示例