算法识别记录错误峰值的简单方法

机器算法验证 时间序列 即时的
2022-01-25 17:24:48

我们需要一个预警系统。我正在处理一个已知在负载下存在性能问题的服务器。错误与时间戳一起记录在数据库中。可以采取一些手动干预步骤来减少服务器负载,但前提是有人知道这个问题......

给定一组错误发生的时间,我如何识别错误峰值的开始(实时)?我们可以定期或在每次错误发生时进行计算。

我们不关心偶尔的错误,但没有具体的阈值。我可以在任何时候通知某人,比如说,在五分钟内出现三个错误,但我确信有更好的方法......

我希望能够根据系统管理员的反馈调整算法的灵敏度。目前,他们希望它相当敏感,即使我们知道我们可以预料到一些误报。

我不是统计学家,我敢肯定这很明显,使用我们现有的工具实现这一点需要相对简单:SQL Server 和老式的 ASP JScript。我不是在代码中寻找答案,但如果它需要额外的软件,它可能对我们不起作用(尽管出于我自己的好奇心,我欢迎不切实际但理想的解决方案作为评论)。

4个回答

自从你问这个问题以来已经 5 个月了,希望你能想出一些办法。我将在这里提出一些不同的建议,希望您在其他场景中找到一些用处。

对于您的用例,我认为您不需要查看尖峰检测算法。

所以这里开始:让我们从时间轴上发生的错误的图片开始:

错误图

你想要的是一个数字指标,一个衡量错误出现速度的“衡量标准”。并且这个措施应该适合阈值 - 您的系统管理员应该能够设置限制,以控制哪些敏感度错误会变成警告。

措施 1

您提到了“尖峰”,获得尖峰的最简单方法是每 20 分钟间隔绘制一个直方图:

误差直方图

您的系统管理员将根据条形的高度设置敏感度,即 20 分钟间隔内可容忍的最大错误。

(此时你可能会想,那20分钟的窗口长度是不是不能调整,可以,而且你可以把窗口长度看成是词组errors together出现的词一起定义。)

对于您的特定场景,这种方法有什么问题?好吧,您的变量是一个整数,可能小于 3。您不会将阈值设置为 1,因为这只是意味着“每个错误都是一个警告”,不需要算法。因此,您对阈值的选择将是 2 和 3。这不会给您的系统管理员提供很多细粒度的控制。

措施 2

不要在时间窗口中计算错误,而是跟踪当前错误和最后错误之间的分钟数。当这个值变得太小时,这意味着你的错误变得太频繁了,你需要发出警告。

时差

您的系统管理员可能会将限制设置为 10 分钟(即,如果错误发生的时间间隔不到 10 分钟,这是一个问题)或 20 分钟。对于任务关键性较低的系统,可能需要 30 分钟。

该措施提供了更大的灵活性。与度量 1 不同,度量 1 可以使用一小组值,现在您有一个度量可以提供 20-30 个良好的值。因此,您的系统管理员将有更多的微调空间。

友好的建议

还有另一种方法可以解决这个问题。与其查看错误频率,不如在错误发生之前对其进行预测。

您提到此行为发生在已知存在性能问题的单个服务器上。您可以监控该机器上的某些关键性能指标,并让它们告诉您何时会发生错误。具体来说,您将查看与磁盘 I/O 相关的 CPU 使用率、内存使用率和 KPI。如果你的 CPU 使用率超过 80%,系统就会变慢。

(我知道你说过你不想安装任何软件,而且你确实可以使用 PerfMon 来做到这一点。但是那里有免费的工具可以为你做到这一点,比如NagiosZenoss。)

对于那些希望在时间序列中找到有关尖峰检测的信息的人来说:

时间序列中的尖峰检测

您应该首先做的最简单的事情是计算输入值的移动平均值如果你的系列是x1,x2,...,那么您将在每次观察后计算移动平均值:

Mk=(1α)Mk1+αxk

在哪里α将确定多少重量给出最新值xk.

例如,如果您的新值距离移动平均线太远

xkMkMk>20%

然后你发出警告。

处理实时数据时,移动平均线很好。但是假设您的表中已经有一堆数据,并且您只想对它运行 SQL 查询以找到峰值。

我会建议:

  1. 计算时间序列的平均值
  2. 计算标准差 σ
  3. 隔离那些大于2σ高于平均值(您可能需要调整该因子“2”)

更多关于时间序列的有趣内容

  1. 许多现实世界的时间序列表现出循环行为。有一个名为ARIMA的模型可以帮助您从时间序列中提取这些周期。

  2. 考虑到周期性行为的移动平均线:Holt 和 Winters

+1 用于统计过程控制,这里有一些关于Step Detection的有用信息

对于 SPC,编写Western Electric RulesNelson Rules的实现并不难

只需在 SQL 服务器中创建一个 USP,它将遍历数据集并使用其相邻点根据规则对每个点执行 ping 操作。也许按小时总结错误数量(取决于您的需要)。


这与我不久前在 Stack Overflow 上发布的一个问题有关(如果有帮助,请快速回答):SQL Server 2008 R2 中的统计过程控制图

搜索在线检测算法将是一个开始。

更多信息位于stackoverflow:测量信号的峰值检测

在github上可以找到一个朴素峰值检测例程的 python 实现

您可能想查看统计过程控制。或时间序列监控。在这个方向上有大量工作,最佳答案可能很大程度上取决于您到底在做什么(在检测异常等之前,您是否需要过滤掉每年或每周的负载季节性)。