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


29

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

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

我们对偶尔的错误并不关心,但是没有特定的阈值。只要我们在五分钟内遇到三个错误,我就可以通知某人,但我敢肯定有更好的方法...

我希望能够根据系统管理员的反馈来调整算法的敏感性。就目前而言,他们希望它相当敏感,即使我们知道我们可以预期会有一些误报。

我不是统计学家,我敢肯定这是显而易见的,并且使用我们现有的工具(SQL Server和老式的ASP JScript)来实现此操作相对简单。我不是在寻找代码的答案,但是,如果它需要其他软件,则可能对我们不起作用(尽管出于我的好奇心,我欢迎提出不切实际但理想的解决方案作为评论)。


1
这似乎对人们很有用,所以我将标题保持原样,但我认为“尖峰”具有误导性。我们实际上正在寻找的是拐点或相对增加。
dbenton

Answers:


44

您问这个问题已经5个月了,希望您已经找到了答案。我将在这里提出一些不同的建议,希望您能在其他情况下找到一些用处。

对于您的用例,我认为您不需要研究峰值检测算法。

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

误差图

您想要的是一个数字指示器,它是错误出现的速度的“度量”。而且此措施应适合阈值设置-您的系统管理员应该能够设置限制,以将哪些敏感度错误变为警告来进行控制。

措施1

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

误差直方图

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

(此时,您可能想知道20分钟的窗口长度是否无法调整。可以调整,并且您可以认为窗口长度是在同时出现的短语错误中一起定义了单词。)

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

措施2

而不是在时间窗口中计算错误,而是跟踪当前错误和最后错误之间的分钟数。如果该值太小,则意味着您的错误变得过于频繁,您需要发出警告。

时差

您的系统管理员可能会将限制设置为10分钟(即,如果错误发生的间隔时间少于10分钟,则为问题)或20分钟。对于不太关键的系统,可能需要30分钟。

该措施提供了更大的灵活性。与度量1不同的是,您可以使用其中的一小部分值,而现在有一个度量可以提供20至30个好的值。因此,您的系统管理员将具有更大的微调范围。

友好的建议

还有另一种方法可以解决此问题。除了查看错误频率外,还可以在错误发生之前对其进行预测。

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

(我知道您说过您不想安装任何软件,并且确实可以使用PerfMon来执行此操作。但是,那里有免费的工具可以为您执行此操作,例如NagiosZenoss。)

对于那些希望在时间序列中找到有关峰值检测的人:

时间序列中的峰值检测

X1个X2

中号ķ=1个-α中号ķ-1个+αXķ

αXķ

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

Xķ-中号ķ中号ķ>20

然后您发出警告。

使用实时数据时,移动平均线很好。但是,假设您已经在一个表中包含了一堆数据,并且只想对它运行SQL查询以查找峰值。

我会建议:

  1. 计算时间序列的平均值
  2. σ
  3. 2σ

关于时间序列的更多有趣的东西

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

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


感谢您提供详尽而有教育意义的答案。我们最终编写了一个存储过程,将每个错误记录到数据库中,并在最近的X分钟内(确定为5分钟)返回错误数。如果该数字超出了我们的阈值Y,则发送警告电子邮件。我们通过实验调整了阈值,直到满意为止。如果我要结束此操作,则将合并您的建议,以计算两次错误之间的时间以获得更大的粒度。
dbenton

8
名人堂回答,鼓掌。加入该社区的唯一目的是支持它。
wesanyer

3

+1用于统计过程控制,有关“ 步检测”的信息在此处。

对于SPC而言,编写Western Electric RulesNelson规则的实现并不难。

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


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


2

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

有关堆栈溢出的更多信息:测量信号的峰值偏差

天真的峰值检测例程的python实现可在github上找到


我搜索了在线检测算法,并发现了很多学术文章。他们可能会给出答案,但不会通过我的个人“简单”测试。如果我错了,请纠正我,但是我不认为我正在寻找峰值检测算法。一旦错误达到顶峰,按照定义,我似乎已经错过了改善最糟糕问题的机会。如果我对“峰值”的使用感到困惑,我们深表歉意。我想我需要预测错误的持续增加或确定大幅度的提高。
dbenton 2012年

1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.