Utilizator:Petre/Ce este load average

De la Wiki.lug.ro
Salt la: navigare, căutare
Aceasta pagina este unul din textele incepute de Petre si neterminate, sunteti invitat sa o imbunatatiti (atat dpdv continut cat si ca stil) si, cand devine prezentabila, sa-i gasiti (sau doar sugerati in pagina de discutii) un titlu potrivit unde sa fie mutata spre folosul altor cititori ai wiki-ului). Multumesc!

Practic oricine a folosit un sistem Unix stie despre tripletul de numere numit "load average". Probabil ca traducerea cea mai adecvata ar fi "incarcarea medie", dar practic toti cunoscutii folosesc termenul original (sau hiperneologismul "loadul"), asa ca imi permit sa amestec termenii. Cele trei valori sunt cunoscute si ca "loadul pe un minut, pe 5 minute si pe 15 minute". Foarte multi administratori si utilizatori nu au o idee prea clara ce reprezinta, ci doar ca sunt niste valori zecimale pozitive, afectate de "gradul de incarcare" a sistemului din ultimele 1,5,15 minute. Pe scurt, daca loadul e mare, e de rau. Daca e in scadere, tocmai a trecut raul. Daca nu, ceva trebuie facut.

Cat e loadul corect? La care din cele 3 valori trebuie sa te uiti? Ca multe intrebari similare, raspunsul e frustrantul "depinde". Ca sa lamuresc putin, voi incerca sa explic doua lucruri: ce fel de medie este si a carei valori.

Ca sa incep cu ce e mai simplu, algoritmul de calculare a mediei este asa-numitul EWMA (Exponential Weighted Moving Average, sau pe romaneste, ceva de genul "medie mobila de pondere exponentiala"). Mai exact, se face o medie ponderata a tuturor valorilor trecute ale unui parametru, ponderile scazand exponential in timp (tind exponential la zero pe masura ce te departezi in trecut). Pe langa aspectul practic al functiei (valorile din trecutul apropiat au pondere mai mare decat cele mai indepartate), exista si un avantaj de calcul: functia de ponderi fiind auto-similara, are un 'timp de injumatatire' care permite ca intreg istoricul sa fie pastrat prin aplicarea succesiva a unei constante subunitare convenabil alese. Aici ar trebui sa scriu 1-2 formule, dar sunt deja in articolul de wikipeda despre medii mobile. Care e legatura cu 1,5 si 15 minute, daca functia de pondere se aplica pe tot istoricul? Ei bine, constanta curbei de pondere se alege in asa fel incat mai departe de intervalul respectiv sa scada sub precizia masuratorii (11 cifre binare dupa virgula in cazul kernelului Linux).

Bine, bine, deci cele 3 medii aproximeaza parametrul real si 'netezesc' cumva masuratoarea. Ce reprezinta acea valoare, de fapt? Controversele se nasc din faptul ca acest parametru e masurat nitel diferit in diverse sisteme Unix (si compatibile). Raspunsul ar fi ceva gen 'dimensiunea cozii de procese a schedulerului'. Principala diferenta dintre Linux si alte kernele (cel putin asa stiu, n-am la indemana un BSD sau Sun sau altceva pentru teste sau cod sursa) este ce pe Linux se iau in considerare, pe langa procesele running (R) si cele in uninterruptible sleep (D).

(Inca o) mica paranteza: in Unix, starile in care poate fi un proces sunt, in principiu, running (R), sleeping (S), stopped (T), uninterruptible (D), zombie (Z) si paging (W). In general procesele interactive petrec multa parte din viata in starea S, asteptand sa fie trezite de un anumit eveniment (tastatura, mouse, retea, etc). Pentru rularea efectiva li se aloca acces la procesor, fiind astfel in unele momente in starea R. Interesanta e starea D ceea ce inseamna ca procesul asteapta dupa un device sa termine o operatie de I/O (foarte adesea un filesystem care merge greu), iar pana cand nu termina operatia n-or sa poata raspunde la nici un fel de semnale.

Specific la Linux este ca numara si procesele D pe langa cele R cand calculeaza loadul, asa ca un load mare inseamna fie traditionalul 'procesor incarcat', fie probleme de I/O. Valoarea normala a loadului (in conditii in care nu exista procese care asteapta nici dupa disc, nici dupa procesor) ar trebui sa fie undeva sub numarul de procesoare (da, pe o masina quad, load 4 inseamna ca toate cpu-urile fac ceva).

Pentru cine vrea sa aprofundeze, functia efectiva de calcul a mediilor loadului e in include/linux/sched.h (CALC_LOAD), e apelata in kernel/timer.c (calc_load), care la randul ei numara procesele cu nr_active, definita in kernel/sched.c ca suma a nr_running si nr_uninterruptible pe toate procesoarele, valori care sunt modificate tot prin kernel/sched.c (diverse functii). Interesant e faptul ca nu se recalculeaza mai des de 5 secunde (asta daca am inteles eu corect cum functioneaza timerul).

Daca stie cineva cum stau lucrurile pe kernele non-Linux, let me know.