Dlaczego przy obliczaniu obciążenia systemu Linux nie stosuje się prostej średniej ruchomej 1/5/15 minuty?


28

Do niedawna myślałem, że średnia obciążenia (jak pokazano na przykład u góry) była średnią ruchomą dla ostatnich ostatnich wartości liczby procesów w stanie „uruchomialnym” lub „uruchomionym”. A n byłoby zdefiniowane przez „długość” średniej ruchomej: ponieważ algorytm do obliczania średniej obciążenia wydaje się uruchamiać co 5 sekund, n byłby równy 12 dla średniej obciążenia 1min, 12x5 dla średniej obciążenia 5 min i 12x15 dla średniej obciążenia 15 min.

Ale potem przeczytałem ten artykuł: http://www.linuxjournal.com/article/9001 . Artykuł jest dość stary, ale ten sam algorytm jest dzisiaj zaimplementowany w jądrze Linuksa. Średnia obciążenia nie jest średnią ruchomą, ale algorytmem, dla którego nie znam nazwy. W każdym razie porównałem algorytm jądra Linuxa ze średnią ruchomą dla wyobrażonego obciążenia okresowego:

wykres obciążenia.

Istnieje ogromna różnica.

Wreszcie moje pytania to:

  • Dlaczego ta implementacja została wybrana w porównaniu z prawdziwą średnią ruchomą, która ma prawdziwe znaczenie dla każdego?
  • Dlaczego wszyscy mówią o „średniej 1min obciążenia”, ponieważ algorytm bierze pod uwagę znacznie więcej niż ostatnią minutę. (matematycznie wszystkie miary od momentu rozruchu; w praktyce, biorąc pod uwagę błąd zaokrąglenia - wciąż wiele miar)

5
Jest to wykładnicza średnia ruchoma (EMA), stosowana również na przykład w finansach (analiza techniczna). Korzyści są prawdopodobnie takie same - EMA można obliczyć na podstawie wcześniejszej i bieżącej wartości, a ostatnie wartości mają większą wagę niż starsze wartości. W standardowym MA najstarsza wartość przyczynia się tak samo do średniej jak najnowsza, a czasami uważamy, że nowsze wartości są ważniejsze.
jg-faustus

Odpowiedzi:


24

Ta różnica sięga pierwotnego Uniksa Berkeley i wynika z faktu, że jądro nie jest w stanie utrzymać średniej kroczącej; w tym celu musiałby zachować dużą liczbę wcześniejszych odczytów, a zwłaszcza w dawnych czasach po prostu nie było na to pamięci. Zamiast tego zastosowany algorytm ma tę zaletę, że całe jądro musi zachować w wyniku wcześniejszych obliczeń.

Należy pamiętać, że algorytm był nieco bliżej prawdy, gdy prędkości komputera i odpowiadające mu cykle zegarowe były mierzone w dziesiątkach MHz zamiast GHz; w dzisiejszych czasach rozbieżności są znacznie dłuższe.


2
Ok, to wyjaśnia wybór implementacji. Czy wiesz, dlaczego wiele osób uważa, że ​​średnia z trzech obciążeń jest obliczana w ciągu ostatnich 1min / 5min / 15min? Myślę, że to źle, algorytm oblicza średnią z wszystkich ostatnich wartości. Rozumiem, że stare wartości mają mniejsze znaczenie niż nowe wartości, ale mimo to wartości starsze niż 1 minuta nadal mają niemały wpływ na średnią wartość obciążenia 1min. Więc moim zdaniem „1min / 5min / 15min” nie ma sensu, ale mogę się mylić (?)
368507

5
Ponieważ taka jest dokumentacja i każdy program, który je zgłosił, zaczynając od oryginalnego BSD uptimei w, jak twierdził; musiałeś spojrzeć na źródła jądra, aby dowiedzieć się, że tak naprawdę nie było to prawdą.
geekozaur

1
to naprawdę szkoda
368507

3
@ user5528 Czasy 1min/5min/15min nie mają sensu. Określają czas, po którym wpływ prądu obciążenia spada o pewien stały współczynnik (prawdopodobnie e = 2,71 .. a może 2). Po prostu spróbuj.
maaartinus,

2
@maaartinus Tak. 1min / 5min / 15min określ czas, po którym starsze miary mają wagę mniejszą lub równą 1 / e w obliczeniach EMA. Precyzja ta nie pojawia się w czasie bezczynności ani u szczytu .
user368507,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.