Jak interpretowana jest „średnia obciążenia” na wyjściu „górnym”? Czy to samo dotyczy wszystkich dystrybucji?


12

Chciałbym wiedzieć, czy wyjście linuksa opartego na Red-Hat może być inaczej interpretowane przez linuks oparty na Debianie.

Aby uczynić pytanie jeszcze bardziej szczegółowym, szukam, aby zrozumieć, w jaki sposób interpretowana jest „średnia obciążenia” z pierwszego wiersza toppolecenia w systemie Red-Hat i jak to sprawdzić za pomocą oficjalnego kodu ro dokumentacji.

[Istnieje wiele sposobów podejścia do tego tematu, z których wszystkie są akceptowalnymi odpowiedziami na pytanie]

Jednym potencjalnym podejściem byłoby znalezienie, gdzie te informacje są oficjalnie udokumentowane.
Innym byłoby znalezienie wersji kodu, która topjest zbudowana w konkretnej dystrybucji i wersji, nad którą pracuję.

Otrzymuję polecenie:

    top - 13:08:34 up  1:19,  2 users,  load average: 0.02, 0.00, 0.00
    Tasks: 183 total,   1 running, 182 sleeping,   0 stopped,   0 zombie
    Cpu(s):  0.2%us,  0.2%sy,  0.0%ni, 96.8%id,  2.7%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:   3922520k total,   788956k used,  3133564k free,   120720k buffers
    Swap:  2097148k total,        0k used,  2097148k free,   344216k cached


W takim przypadku jak mogę zinterpretować średnią wartość obciążenia ?
Udało mi się ustalić, że średnie obciążenie wynosi około ostatniej chwili, z jednego źródła dokumentacji i że należy je zinterpretować po pomnożeniu przez 100, przez inne źródło dokumentacji.
Pytanie brzmi:
czy jest obciążone 0,02% czy 2%?
Źródła i wersje dokumentacji:

1) Pierwszy z gwiazdkami

    TOP(1)                        Linux User’s Manual                       TOP(1)

    NAME
           top - display Linux tasks

Źródło: man topw mojej dystrybucji RedHat
Ubuntu ma również wersję z „zadaniami”, która nie wyjaśnia średniej obciążenia w:
http://manpages.ubuntu.com/manpages/precise/man1/top.1.html

2) Drugi zaczyna się od

    TOP(1)                          User Commands                         TOP(1)

   NAME         top

   top - display Linux processes

Źródło:
http://man7.org/linux/man-pages/man1/top.1.htm

3) Ten zaczyna się od:

   TOP(1)

   NAME

   top - display and update information about the top cpu processes

Źródło: http://www.unixtop.org/man.shtml najpierw jeden, można zobaczyć w lub i nie ma żadnego wytłumaczenia dla formatu wyjściowego (ani o średnim obciążeniu , w którym jestem zainteresowany) . Sekund jeden, zawiera krótkie wyjaśnienie, wskazując, że średnie obciążenie ma do czynienia z ostatnim 1 minutę, ale nic o interpretacji jego wartości!

man topRHELonline ubuntu documentation


Cytuję bezpośrednio z drugiego źródła:

2a. Średnie UPTIME i LOAD
Ta część składa się z pojedynczego wiersza zawierającego:
nazwę programu lub okna, w zależności od trybu wyświetlania,
aktualny czas i czas od ostatniego rozruchu
łączna liczba użytkowników
obciążenia systemu przez średnią z ostatnich 1, 5 i 15 minut

Tak więc, jeśli to wyjaśnienie jest rzeczywiście poprawne, wystarczy zrozumieć, że średnia obciążenia wynosi około ostatniej minuty.
Ale to nie wyjaśnia formatu liczby.

W trzecim wyjaśnieniu jest napisane, że:

Podając liczby średnich obciążeń, należy je pomnożyć przez 100.

To wyjaśnienie sugeruje, że 0,02 oznacza 2%, a nie 0,02%. Ale czy to prawda? Dodatkowo, czy jest to poprawne dla wszystkich dystrybucji Linuksa i potencjalnie różnych implementacji top?
Aby znaleźć odpowiedź na to pytanie, próbowałem przejść przez kod, przeszukując go online. Ale znalazłem tam przynajmniej dwie różne wersje topzwiązane z RHEL! builtin-top.ci refactored top.c. Obie chronione prawem autorskim przez Red-Hat, jak napisano w zawiadomieniu na początku kodu, i dlatego wydaje się logiczne, że RHEL używa jednego z nich.
http://lxr.free-electrons.com/source/tools/perf/builtin-top.c
http://lxr.free-electrons.com/source/tools/perf/util/top.c

Zanim zagłębiłem się w ten kod, chciałem uzyskać opinię na temat tego, gdzie należy się skoncentrować, aby dokładnie zrozumieć, w jaki sposób interpretowane jest obciążenie procesora?

Z informacji podanych w odpowiedziach poniżej, oprócz niektórych osobistych poszukiwań, zauważyłem, że:

1 - topUżywam tego, co jest zawarte w pakiecie procps-3.2.8. Które można zweryfikować za pomocą top -v.
2 - W wersji procps-3.2.8, którą pobrałem z oficjalnej strony, wydaje się, że narzędzie uptimepobiera informacje bezpośrednio z procfspliku /proc/loadavg(nie korzystając z funkcji linux getloadavg()).
3 - Teraz dla toppolecenia również nie używa funkcji getloadavg(). Udało mi się zweryfikować, topczy rzeczywiście robi to samo, couptimenarzędzie do wyświetlania średnich obciążeń. W rzeczywistości wywołuje funkcję uptimenarzędzia, która pobiera informacje z procfspliku /proc/loadavg.

Wszystko wskazuje więc na /proc/loadavgplik! Dlatego, aby dokładnie zrozumieć load averagewytworzony przez top, należy przeczytać kod jądra, aby zobaczyć, jak plik loadavgjest zapisywany.
Istnieje także doskonały artykuł wskazany w jednej z odpowiedzi, który zawiera wyjaśnienie dla laika trzech wartości loadavg.
Tak więc pomimo faktu, że wszystkie odpowiedzi były równie przydatne i pomocne, zamierzam zaznaczyć tę, która wskazywała na artykuł http://www.linuxjournal.com//article/9001 jako „odpowiedź” na moje pytanie. Dziękujemy wszystkim za wkład!

Dodatkowo od pytania Zrozumienie górnej i średniej obciążenia znalazłem link do kodu źródłowego jądra, który wskazuje miejsce, w którym loadavgjest obliczany. Jak się wydaje, istnieje ogromny komentarz wyjaśniający, jak to działa, również ta część kodu jest w C!
Link do kodu to http://lxr.free-electrons.com/source/kernel/sched/loadavg.c
Znowu nie próbuję angażować się w żadną formę plagiatu, po prostu dodaję to dla kompletności. Powtarzam więc, że link do kodu jądra został znaleziony w jednej z odpowiedzi w Zrozumienie górnej i średniej obciążenia ...


Co mówią ci wersje? ( top -v)
Fiximan

u góry: wersja procps 3.2.8
Angelos Asonitis

Odpowiedzi:


19

Obciążenie procesora to długość kolejki uruchamiania, tj. Długość kolejki procesów oczekujących na uruchomienie.

uptimeKomenda może być używany, aby zobaczyć średnią długość kolejki przejechany ostatniej chwili, ostatnie pięć minut, a ostatnie 15 minut, podobnie jak to, co zwykle wyświetlane top.

Wysoka wartość obciążenia oznacza, że ​​kolejka uruchamiania jest długa. Niska wartość oznacza, że ​​jest krótka. Tak więc, jeśli średnia wartość obciążenia w ciągu jednej minuty wynosi 0,05, oznacza to, że średnio w tej minucie było 0,05 procesów oczekujących na uruchomienie w kolejce uruchamiania. To nie jest procent. To jest, AFAIK, to samo na wszystkich Uniksach (chociaż niektóre Uniky mogą nie liczyć procesów oczekujących na operacje we / wy, co, jak sądzę, robi Linux; OpenBSD tylko przez pewien czas zliczał wątki jądra, więc obciążenie zawsze wynosiło 1 lub więcej).

Narzędzie Linux toppobiera wartości obciążenia z jądra, do którego je zapisuje /proc/loadavg. Patrząc na źródła procps-3.2.8, widzimy, że:

  1. Aby wyświetlić średnie obciążenia, sprint_uptime()wywoływana jest funkcja top.c.
  2. Funkcja ta mieszka proc/whattime.ci rozmów loadavg()w proc/sysinfo.c.
  3. Ta funkcja po prostu otwiera się, LOADAVG_FILEaby odczytać średnie obciążenia.
  4. LOADAVG_FILEjest zdefiniowany wcześniej jako "/proc/loadavg".

Dziękuję bardzo za odpowiedź, czy jest to gdzieś oficjalnie udokumentowane?
Angelos Asonitis

1
@AgelosAssonitis Ten artykuł w LinuxJournal z 2006 roku może być interesujący. Wskazuje na kilka plików źródłowych w drzewie źródeł jądra Linux, które możesz chcieć obejrzeć. Nie jestem użytkownikiem Linuksa, więc nie mogę stwierdzić, czy te pliki są nadal obecne w najnowszej wersji jądra: linuxjournal.com/article/9001
Kusalananda

Rzeczywiście ciekawy artykuł! Właśnie patrzę na pakiet procps, aby zobaczyć, czy rzeczywiście polecenie top bierze swoją wartość z pliku / proc / loadavg i czy jest to to samo, co wynik funkcji getloadavg ().
Angelos Asonitis

@AgelosAssonitis Zdecydowanym miejscem do dokumentacji średnich obciążeń jest drzewo źródeł jądra. POSIX nie definiuje obciążenia procesora i nigdzie nie wspomina o słowach „średnie obciążenie”. Narzędzia topi uptimenie są narzędziami POSIX, a getloadavg()funkcja biblioteki również nie jest zdefiniowana w POSIX (ma jednak rodowód BSD).
Kusalananda

Tak więc, z tego, co zbieram, nie ma oficjalnej dokumentacji pozwalającej zrozumieć tworzenie tych wartości innych niż samo źródło jądra, czy to prawda? Zanim się tam dostanę, wciąż muszę powiązać wartość przedstawioną w toppliku procfs loadavg ...
Angelos Asonitis

7

Średnia obciążenia jest zwykle obliczana przez jądro. Aplikacje takie jak topi uptimemogą korzystać z getloadavg(3)wywołania biblioteki, aby uzyskać do nich dostęp (ma być przenośny w różnych wersjach Uniksa). W systemie Linux zwykle skutkuje to odczytem z /proc/loadavg. W FreeBSD jest to wywołanie systemowe.

Na przykład:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
  double ld[3];

  int i=getloadavg(ld,3);
  printf("Load %.2f %.2f %.2f\n",ld[0],ld[1],ld[2]);
}

uptimei topoba wykonują podobne połączenia w celu uzyskania swoich danych.

Teraz średnie wartości obciążenia 1/5/15 minuty to liczba procesów w kolejce uruchomieniowej. Różne systemy operacyjne mogą to obliczać na różne sposoby; największą różnicą jest zwykle to, czy procesy oczekujące na We / Wy (np. zablokowane na dysku) liczą się jako działające, czy nie. W Linuksie są.

Tak więc średnia obciążenia wynosząca 3,4 oznacza, że ​​w kolejce uruchomień w oknie próbki było średnio 3,4 procesów (1, 5, 15 minut).

Wysoka średnia obciążenia niekoniecznie oznacza przeciążony serwer. Jeśli masz 16 rdzeni, średnia wartość obciążenia może wynosić 16 bez obciążenia. Możesz także mieć wiele fork()wywołań aplikacji, które mogą spowodować utworzenie / zniszczenie dużej liczby procesów, co prowadzi do wysokiego średniego obciążenia, ale bez znacznego wpływu na wydajność serwera. Należy go traktować jedynie jako przewodnik wraz z innymi miernikami, takimi jak% zajętości procesora.


4

Średnia obciążenia nie jest czymś specyficznym dla konkretnego narzędzia lub dystrybucji, jest to pomiar dostarczany przez jądro, a ściślej program planujący, dlatego jest to pomiar niezależny od dystrybucji. Pomiar jest rejestrowany w systemie plików proc/proc

W interpretacji miara średniej obciążenia nie wskazuje, jak ciężko pracuje procesor, ale ile pracy należy wykonać. Nie sądzę, aby naprawdę trzeba było go pomnożyć przez cokolwiek, ponieważ jest to bezpośredni pomiar liczby procesów w stanie umożliwiającym uruchomienie lub nieprzerwanym.

Spróbuj sprawdzić następujące dwie strony podręcznika: getloadavg(3)i uptimeuzyskać więcej informacji.

Średni wskaźnik obciążenia może być początkowo trudny do zrozumienia, myślę, że wiele osób uważa, że ​​to wskazuje na to, jak ciężko działa procesor, ale tak naprawdę nie jest to.


1
Ok, ale czy jesteśmy absolutnie pewni, że średnia wartość obciążenia opisana w getloadavg()opisie funkcji jest tą samą średnią wartością obciążenia, topktórą pokazuje polecenie w rhel? Pytam o to, ponieważ przeprowadziłem wyszukiwanie pełnotekstowe w nieokreślonej zawartości pakietu procps-3.2.8 (co wskazuje komenda top -v) i nie ma ani jednej wzmianki o funkcji getloadavg ()! Być może top oblicza średnią wartość obciążenia w inny sposób ...
Angelos Asonitis
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.