Time-Series

算法識別記錄錯誤峰值的簡單方法

  • October 24, 2012

我們需要一個預警系統。我正在處理一個已知在負載下存在性能問題的服務器。錯誤與時間戳一起記錄在數據庫中。可以採取一些手動干預步驟來減少服務器負載,但前提是有人知道這個問題……

給定一組錯誤發生的時間,我如何識別錯誤峰值的開始(實時)?我們可以定期或在每次錯誤發生時進行計算。

我們不關心偶爾的錯誤,但沒有具體的閾值。我可以在任何時候通知某人,比如說,在五分鐘內出現三個錯誤,但我確信有更好的方法……

我希望能夠根據系統管理員的反饋調整算法的靈敏度。目前,他們希望它相當敏感,即使我們知道我們可以預料到一些誤報。

我不是統計學家,我敢肯定這很明顯,使用我們現有的工具實現這一點需要相對簡單:SQL Server 和老式的 ASP JScript。我不是在代碼中尋找答案,但如果它需要額外的軟件,它可能對我們不起作用(儘管出於我自己的好奇心,我歡迎不切實際但理想的解決方案作為評論)。

自從你問這個問題以來已經 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。)

對於那些希望在時間序列中找到有關尖峰檢測的信息的人來說:

時間序列中的尖峰檢測

您應該首先做的最簡單的事情是計算輸入值的移動平均值。如果你的系列是,那麼您將在每次觀察後計算移動平均值:

在哪裡將確定多少重量給出最新值.

例如,如果您的新值距離移動平均線太遠

然後你發出警告。

處理實時數據時,移動平均線很好。但是假設您的表中已經有一堆數據,並且您只想對它運行 SQL 查詢以找到峰值。

我會建議:

  1. 計算時間序列的平均值
  2. 計算標準差
  3. 隔離那些大於高於平均值(您可能需要調整該因子“2”)

更多關於時間序列的有趣內容

  1. 許多現實世界的時間序列表現出循環行為。有一個名為ARIMA的模型可以幫助您從時間序列中提取這些週期。
  2. 考慮到週期性行為的移動平均線:Holt 和 Winters

引用自:https://stats.stackexchange.com/questions/41145

comments powered by Disqus

相關問答