Load average

De la Wiki.lug.ro
Versiunea din 15 septembrie 2011 05:05, autor: Bmbogdan (Discuție | contribuții) (A protejat "Load average" [edit=autoconfirmed:move=autoconfirmed])

(dif) ← Versiunea anterioară | Versiunea curentă (dif) | Versiunea următoare → (dif)
Salt la: navigare, căutare

Load average (în traducere liberă încărcare medie) este o tripletă de valori zecimale pozitive care descriu încărcarea sistemului în ultimele 1/5/15 minute.

Aceste valori sunt conținute în fișierul /proc/loadavg și se pot citi din consolă cu comenzile uptime, w sau top precum şi diverse utilitare pentru interfaţa grafică.

În termeni simpli, valorile mai mari decât numărul de procesoare semnifică faptul că sistemul este încărcat la capacitatea de procesare sau peste, cu alte cuvinte procesele sau aplicațiile care rulează la momentul respectiv solicită la maximum puterea de calcul, iar valori mai mici faptul că sistemul este subutilizat (o parte din puterea de calcul este nefolosită și disponibilă pentru lansarea unei alte aplicaţii, de exemplu).

Modul de calculare

Valorile de încărcare medie a unui sistem se calculează pe baza așa-numitului EWMA (Exponential Weighted Moving Average), o medie a valorilor de la momente din trecut ale unui parametru în care ponderea unei valori este cu atât mai mare cu cât este mai recentă, tinzând exponenţial la zero pentru valorile din trecut. Pe lângă aspectul practic al funcției (valorile din trecutul apropiat au pondere mai mare decât cele mai îndepărtate), funcţia de ponderi fiind auto-similară, are un 'timp de injumătăţire' care permite ca întreg istoricul să fie păstrat prin aplicarea succesivă a unei constante subunitare convenabil alese. Constanta curbei de pondere se alege în așa fel încât mai departe de intervalul respectiv să scadă sub precizia măsurătorii (11 cifre binare dupa virgulă în cazul nucleului Linux).

Cu alte cuvinte, cele 3 medii aproximează parametrul real și 'netezesc' măsurătoarea. Această valoare este masurată puţin diferit în diverse sisteme de tip Unix și reprezintă 'dimensiunea cozii de procese a scheduler-ului'. Principala diferență dintre Linux și alte nuclee este aceea că pe Linux se iau în considerare, pe langa procesele care rulează la un moment dat (R) şi cele în uninterruptible sleep (D).

În sistemele de operare de tip Unix, stările unui proces pot fi: running (R), sleeping (S), stopped (T), uninterruptible (D), zombie (Z) sau paging (W). În general, procesele interactive petrec multă parte din viaţă în starea S, aşteptând să fie trezite de un anumit eveniment (tastatură, mouse, reţea etc). Pentru rularea efectivă li se alocă acces la procesor, trecând în starea R. În starea D, procesul aşteaptă ca un device sa termine o operaţie de intrare/ieșire (I/O), de exemplu citirea de informații de pe un sistem de fișiere, din rețea etc.

Specific pentru nucleul Linux este faptul că la calcularea valorilor de încărcare medie se iau în considerare și procesele D pe lângă cele R, aşa că o valoare mare poate însemna fie tradiţionalul 'procesor incărcat', fie probleme de I/O. Valoarea normală a loadului (în condiţii în care nu există procese care aşteaptă nici după disc, nici dupa procesor) este mai mică decât numarul de procesoare (de exemplu, pe o maşină cu 4 procesoare, load 4 sau mai ridicat înseamnă că toate cele 4 procesoare fac ceva).

Funcţia care calculează efectiv valorile pentru load average se află în include/linux/sched.h (CALC_LOAD), fiind apelată în kernel/timer.c (calc_load) care la rândul ei numără procesele cu nr_active, definită in kernel/sched.c ca suma a nr_running şi nr_uninterruptible pe toate procesoarele, valori care sunt modificate tot prin kernel/sched.c (diverse funcţii).

Încărcare CPU vs utilizare CPU

Mai multe informaţii