Cum este sarcina medie, savepearlharbor

Afirmația întrebării

Recent, în timpul unui interviu cu o companie mare, mi sa pus o întrebare simplă, care este sarcina medie. Nu stiu cat de mult am raspuns corect, dar mi-am dat seama ca nu stiu cu adevarat raspunsul exact.






Cei mai mulți oameni știu, probabil, ce medie de încărcare - valoarea medie a sarcinii, pentru o perioadă de timp a sistemului (1,5 și 15 minute). De asemenea, puteți afla câteva detalii din acest articol. despre cum să îl folosiți. În cele mai multe cazuri, această cunoaștere este suficient, că ar fi de valoare pentru a evalua sarcina sistemului LA, dar eu sunt un fizician, și când văd „media pentru perioada de timp“, imediat am devenit frecvență interesantă de eșantionare, la un anumit interval de timp. Și când văd termenul „de așteptare pentru resurse“, devine interesant, ce anume și cât timp ar trebui să aștepte, precum și cât de multe procese triviale nevoie pentru a rula pentru a obține un timp scurt de mare LA. Și principalul lucru este motivul pentru care răspunsurile la aceste întrebări nu dau 5 minute de lucru cu Google? Dacă sunteți interesat de aceste subtilități, bine ați venit la pisică.

Ceva nu este corect ...

Mai întâi, să definim ceea ce știm. În general, Media de încărcare reprezintă numărul mediu de resurse CPU care așteaptă resursele într-unul din cele trei intervale de timp. De asemenea, știm că această valoare în starea normală este în intervalul de la 0 la 1, iar unitatea corespunde unei încărcări de 100% a sistemului cu un singur core fără suprasarcină. În viitor, voi considera sistemul drept un sistem unic, deoarece este mai simplu și mai revelator.
Ce sa întâmplat aici?
În primul rând. știm cu toții că media aritmetică a mai multor cantități este egală cu suma acestor cantități împărțită la numărul lor. Din informațiile pe care nu le-am dat seama în mod absolut este chiar suma. Dacă numărăm procesele de așteptare pentru întregul minut, atunci valoarea medie va fi egală cu numărul de procese pe minut, împărțit la unu. Dacă numărăm fiecare secundă, atunci numărul de procese din fiecare număr va scădea cu intervalul și vom împărți cu 60. Astfel, cu cât este mai mare rata de eșantionare pentru colectarea datelor, cu atât este mai mică valoarea medie obținută.
În al doilea rând, ce înseamnă să aștepți resurse? Dacă avem un număr mare de procese rapide dintr-o dată, toate acestea stau într-o coadă, și logica pentru o perioadă scurtă de timp LA trebuie să crească de curse constantă total ar trebui să fie observate valori inacceptabile și monitorizarea continuă, care, într-o situație normală, nr.
În al treilea rând. un sistem cu un singur nucleu cu sarcină 100% ar trebui să ofere o medie a sarcinii egală cu 1. Dar nu există nicio dependență de parametrii acestui kernel, deși numărul de procese poate fi diferit uneori. Această întrebare poate fi eliminată fie prin definirea corectă a "resurselor de așteptare ale procesului", fie prin prezența unor normalizări asupra parametrilor nucleului.

literatură

O mică magie nucleară

Din aceste materiale puteți vedea că fiecare proces numit are un timp limitat de utilizare a procesorului, în arhitectura standard Intel, acest interval este de 10 ms. Aceasta este o sute de secunde și în majoritatea cazurilor procesul nu are nevoie atât de mult timp. Cu toate acestea, dacă un anumit proces a folosit tot timpul alocat, atunci este apelată o întrerupere hardware și sistemul recuperează controlul procesorului. În plus, la fiecare 10ms se mărește contravaloarea căpușelor (jiffies counter). Aceste căpușe sunt contorizate din momentul în care sistemul este pornit și la fiecare 500 de căpușe (la fiecare 5 secunde) se calculează cu Media de încărcare.






Codul direct la calculul este în fișierul nucleul timer.c (codul este dat pentru versiunea 2.4 la versiunea 2.6, toate acestea sunt oarecum dispersate, dar logica nu este schimbat, atunci, sper, de asemenea, nu există nici o schimbare semnificativă, dar să fiu sincer, de presă recente nu au testat) :

După cum puteți vedea, cele trei valori LA se calculează la rândul lor, însă nu se precizează exact ceea ce este considerat și modul în care este luat în considerare. Aceasta nu este o problemă, codul funcției count_active_tasks () este în același fișier, chiar deasupra:

Și CALC_LOAD se află în sched.h împreună cu câteva constante interesante:

Din toate cele de mai sus, putem spune că fiecare 5 secunde de bază are un aspect mult întregul proces este într-o stare de mers și neîntreruptibilă (întâmplător în alte sisteme UNIX, nu este) și pentru fiecare proces crește contorul de FIXED_1, care este egală cu 1<

Un mic dezintegrare nucleară

Nu, nucleul sistemului nu se destramă aici, doar formula CALC_LOAD, conform căreia sarcina medie se bazează pe legea decăderii radioactive. sau pur și simplu degradare exponențială. Această lege nu este nimic ca soluția unei ecuații diferențiale, adică fiecare valoare nouă este calculată de la cea precedentă și rata de reducere a numărului de elemente depinde în mod direct de numărul elementelor.
Soluția acestei ecuații diferențiale este legea exponențială:

De fapt, Media de încărcare nu este o valoare medie în sensul obișnuit al mediei aritmetice. Aceasta este o funcție discretă care este calculată periodic din momentul în care sistemul este pornit. În acest caz, valoarea funcției este numărul de procese procesate în sistem în condiții de amortizare exponențială.
Vedem o astfel de construcție prin rescrierea părții de calcul din CALC_LOAD în limbajul matematic:

2 ^ 11 pentru noi în acest caz este echivalent cu unitatea, am fixat-o inițial și am adăugat pretutindeni, numărul de procese noi este, de asemenea, calculat în aceste cantități. A, unde T este intervalul de măsurare (1,5 sau 15 minute).
Trebuie notat faptul că pentru un interval de timp fix și un timp fix între măsurători, valorile exponentului pot fi calculate integral în avans și utilizate ca o constantă, care se face în cod. Ultima operație - deplasarea spre dreapta cu 11 biți ne dă valoarea dorită a Mediei de încărcare cu aruncarea comenzilor inferioare.

Acum, înțelegând cum este calculat LA, puteți încerca să răspundeți la întrebările puse la începutul articolului:
1) Valoarea medie nu este media mediei aritmetice, ci este valoarea medie a funcției, care este calculată la fiecare 5 secunde de la începutul sistemului.
2) "Așteptarea resurselor CPU" sunt toate procesele în starea RUNNING și UNINTERRUPTIBLE. Și nu observăm sari semnificative în mediul de încărcare în timpul monitorizării pe termen lung, deoarece exponențiul amortizat joacă rolul unei funcții de netezire (deși se poate observa când se ia în considerare o perioadă de 1 minut).
3) Și aici este una dintre cele mai interesante concluzii. Ideea este că funcția de mai sus Load Average pentru orice valoare de n crește monotonic la această valoare, dacă n

Cu toate acestea, pe lângă răspunsurile la întrebările disponibile inițial, analiza codului introduce și altele noi. De exemplu, este un exponent amortizat aplicabil reducerii numărului de procese de așteptare? Dacă avem în vedere decăderea radioactivă, atunci viteza ei este limitată doar de numărul de nuclee, în cazul nostru, cu un număr mare de procese, totul se va baza pe lărgimea de bandă a procesorului. În mod similar, dacă comparăm formula obținută cu legea exponențială, devine clar că, unde T este durata intervalului setat de date (1,5 sau 15 minute). Astfel, dezvoltatorii kernel-ului cred că rata de scădere a Load Average este invers proporțională cu durata măsurătorilor, ceea ce este oarecum nevăzător, cel puțin pentru mine. Ei bine, nu este dificil să simulezi situații când valori mari LA nu vor afișa într-adevăr încărcarea sistemului sau invers.
În final, se pare că pentru a calcula Media de încărcare a fost aleasă o funcție de netezire care minimizează valoarea acesteia cât mai repede posibil, ceea ce este în general logic pentru obținerea unui număr finit, dar nu reflectă procesul real care se întâmplă. Și dacă cineva îmi va explica de ce exponentul și de ce, în această formă, aș fi foarte recunoscător.







Articole similare

Trimiteți-le prietenilor: