Kaydedilen hatalardaki bir ani artışı algoritmik olarak tanımlamanın basit yolu


29

Erken bir uyarı sistemine ihtiyacımız var. Yük altında performans sorunları olduğu bilinen bir sunucuyla uğraşıyorum. Hatalar bir zaman damgasıyla birlikte bir veritabanına kaydedilir. Sunucu yükünü azaltmak için atılabilecek bazı manuel müdahale adımları vardır, ancak yalnızca sorundan haberi varsa ...

Hataların oluştuğu bir dizi zaman göz önüne alındığında, hatalardaki bir ani yükselişin başlangıcını (gerçek zamanlı olarak) nasıl belirleyebilirim? Periyodik olarak veya her bir hata oluşumunda hesaplayabiliriz.

Ara sıra yapılan hatalar konusunda endişeliyiz, ancak belirli bir eşiğimiz yok. Beş dakika içinde üç hata alıp söyleyebildiğimizde birine haber verebilirim, ama eminim daha iyi bir yol vardır ...

Algoritmanın hassasiyetini sistem yöneticilerinin geri bildirimlerine dayanarak ayarlayabilmeyi isterdim. Şimdilik, bazı yanlış pozitifler bekleyebileceğimizi bilmemize rağmen, oldukça hassas olmalarını istiyorlar.

Açıkça emin olduğum bir istatistikçi değilim ve bunun uygulanmasının mevcut araçlarımızla nispeten basit olması gerekiyor: SQL Server ve eski okul ASP JScript. Kodda bir cevap aramıyorum, ancak ek bir yazılım gerektiriyorsa, muhtemelen bizim için işe yaramayacaktır (pratikte, ancak merak ediyorum, yorum olarak ideal çözümleri kabul ediyorum).


1
Bu insanlar için faydalı görünüyor, bu yüzden başlığı olduğu gibi bırakacağım, ancak "başak" yanıltıcı olduğunu düşünüyorum. Aslında aradığımız şey bir çekim noktası veya göreceli bir artış.
dbenton

Yanıtlar:


44

Bu soruyu sormanızdan bu yana 5 ay geçti ve umarım bir şey bulmuşsunuzdur. Diğer senaryolarda onlar için bir miktar kullanım bulacağınızı umarak burada birkaç farklı öneride bulunacağım.

Kullanım durumunuz için ani tespit algoritmalarına bakmanız gerekmiyor.

İşte işte: Hadi, bir zaman çizgisinde meydana gelen hataların bir resmini ile başlayalım:

Hata Grafiği

İstediğiniz şey sayısal bir gösterge, hataların ne kadar hızlı geldiğinin "ölçüsü". Ve bu önlem eşikleme için uygun olmalıdır - sistem yöneticileriniz hangi hassasiyet hatalarının uyarılara dönüşeceğini kontrol eden sınırlar koyabilmelidir .

1. Ölçü

"Çivilerden" bahsettiniz, çiviyi almanın en kolay yolu her 20 dakikalık aralıkta bir histogram çizmek :

Hata Histogramı

Sistem yöneticileriniz çubukların yüksekliğine bağlı olarak hassasiyeti ayarlayacaktır, yani 20 dakikalık aralıklarla tolere edilebilecek en fazla hata.

(Bu noktada, o 20 dakikalık pencerenin uzunluğunun ayarlanıp ayarlanamayacağını merak ediyor olabilirsiniz. Yapabilir ve pencerenin uzunluğunu, birlikte görünen tümcecik hataları ifadesinde birlikte sözcüğü tanımlamak olarak düşünebilirsiniz .)

Özel senaryonuz için bu yöntemle ilgili sorun nedir? Değişkeniniz muhtemelen 3'ten küçük bir tamsayıdır. Eşiğinizi 1 olarak ayarlamazsınız, çünkü bu sadece bir algoritma gerektirmeyen "her hata bir uyarıdır" anlamına gelir. Bu yüzden eşik için yaptığınız seçimler 2 ve 3 olacak. Bu, sistem yöneticilerinize çok iyi bir kontrol sağlamıyor.

2. Ölçü

Bir zaman penceresinde hataları saymak yerine, geçerli ve son hatalar arasındaki dakika sayısını takip edin. Bu değer çok küçük olduğunda, hatalarınızın çok sıklaştığı ve bir uyarı vermeniz gerektiği anlamına gelir.

Zaman Farklılıkları

Sistem yöneticileriniz muhtemelen limiti 10 olarak ayarlayacaktır (yani, hatalar 10 dakikadan daha az sürüyorsa, bu bir problemdir) veya 20 dakika. Daha az kritik bir sistem için belki 30 dakika.

Bu önlem daha fazla esneklik sağlar. Birlikte çalışabileceğiniz küçük bir değer kümesinin olduğu Ölçü 1'in aksine, şimdi iyi bir 20-30 değer sağlayan bir ölçüme sahipsiniz. Bu nedenle, sistem yöneticileriniz ince ayar yapmak için daha fazla alana sahip olacaktır.

Arkadaşça tavsiye

Bu soruna yaklaşmanın başka bir yolu var. Hata frekanslarına bakmak yerine, hataları oluşmadan önce tahmin etmek mümkün olabilir.

Bu davranışın, performans sorunu olduğu bilinen tek bir sunucuda gerçekleştiğini söylediniz. Bu makinedeki bazı Temel Performans Göstergelerini izleyebilir ve bir hatanın ne zaman olacağını size bildirmelerini sağlayabilirsiniz. Özellikle, CPU kullanımı, Bellek kullanımı ve Disk G / Ç ile ilgili KPI'lara bakarsınız. CPU kullanımınız% 80'i geçerse, sistem yavaşlayacaktır.

(Herhangi bir yazılım yüklemek istemediğinizi söylediğinizi biliyorum ve bunu PerfMon kullanarak yapabileceğiniz doğru. Ancak, Nagios ve Zenoss gibi bunu sizin için yapacak ücretsiz araçlar var .)

Ve buraya, zaman serilerinde ani saplanma ile ilgili bir şeyler bulmayı umarak gelenler için:

Zaman Serilerinde Spike Detection

Yapmanız gereken en basit şey , girdi değerleriniz için hareketli bir ortalama hesaplamaktır . Seriniz ise , o zaman her gözlem olarak sonra hareketli ortalama hesaplar:x1,x2,...

Mk=(1α)Mk1+αxk

where the α would determine how much weight give the latest value of xk.

If your new value has moved too far away from the moving average, for example

xkMkMk>20%

then you raise a warning.

Moving averages are nice when working with real-time data. But suppose you already have a bunch of data in a table, and you just want to run SQL queries against it to find the spikes.

I would suggest:

  1. Compute the mean value of your time-series
  2. Compute the standard deviation σ
  3. Isolate those values which are more than 2σ above the mean (you may need to adjust that factor of "2")

More fun stuff about time series

  1. Many real-world time-series exhibit cyclic behavior. There is a model called ARIMA which helps you extract these cycles from your time-series.

  2. Moving averages which take into account cyclic behavior: Holt and Winters


Thanks for the thorough and educational answer. We ended up writing a stored procedure to record each error to a database and return the number of errors in the last X (we settled on 5) minutes. If that number was over our threshold, Y, a warning email was sent. We adjusted the threshold by experimentation until we were happy with it. If I were doing it over, I would incorporate your suggestion of counting time between errors for greater granularity.
dbenton

8
Hall of fame answer, applause. Joined this community solely to upvote this.
wesanyer

3

+1 for Statistical process control, there's some useful information here on Step Detection.

For SPC it's not too hard to write an implementation of either the Western Electric Rules or the Nelson Rules.

Just make a USP in SQL server that will iterate through a data set and ping each point against the rules using its neighbouring points. Maybe sum up the number of errors by hour (depending on your needs).


This kind of relates to a question I posted on Stack Overflow a while back (have just penned a quick answer if it helps): Statistical Process Control Charts in SQL Server 2008 R2


2

A search for Online detection algorithms would be a start.

More information located on stackoverflow: Peak Dection of measured signal

A python implementation of a naive peak detection routine is to be found at github


I searched for online detection algorithms, and mostly found academic articles that are over my head. They may hold the answer, but don't pass my personal "simple" test. Correct me if I'm wrong, but I don't think I'm looking for a peak detection algorithm. Once the errors have peaked, it seems that by definition I've missed my opportunity to ameliorate the worst of the issue. Apologies if my use of "spike" was confusing. I guess I need to predict a continued increase in errors or identify a large step up.
dbenton

1

You may want to look at statistical process control. Or time series monitoring. There are tons of work in this direction, and the optimal answer probably depends a lot on what exactly you are doing (do you need to filter out yearly or weekly seasonalities in load before detecting anomalies etc.).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.