calculul mediu de încărcare este cel mai bine gândit ca o medie mobilă aproceselor din coada de rulare a Linux marcată în funcționare sau neîntreruptibilă. Cuvintele „gândit” au fost alese dintr-un motiv: așa se interpretează măsurările, dar nu exact ceea ce se întâmplă în spatele cortinei. Este în acest moment al călătoriei noastre când realitatea itall, cum ar fi mecanica cuantică, pare să nu se potrivească modului intuitiv așa cum se prezintă.,
mediile de încărcare afișate de comenzile de sus și de uptime sunt obținute direct de la /proc. Dacă executați kernel-ul Linux 2.4 sau o versiune ulterioară, puteți citi aceste valori cu comanda cat/proc/loadavg. Cu toate acestea, kernel-ul Linux produce acesteavalori în /proc. Mai exact, timer.c și sched.h lucra împreunăface calculul. Pentru a înțelege ce cronometru.c face pentru un trai, theconcept de timp feliere și contorul jiffy ajuta rotunji imaginea.
în kernel-ul Linux, fiecărui proces dispecerabil i se oferă o sumă fixă detimp pe CPU per expediere., În mod implicit, această sumă este de 10 milisecunde sau 1/100 de secundă. Pentru această perioadă scurtă de timp, procesul este atribuitun procesor fizic pe care să-și execute instrucțiunile și să-i permită să preia acel procesor. De cele mai multe ori, procesul va renunța la controlînainte ca 10ms să fie în sus prin apeluri socket, apeluri I/O sau apeluri înapoi la kernel. (Pe un procesor Intel 2.6 GHz, 10ms este suficient timp pentruaproximativ 50 de milioane de instrucțiuni să apară. Este mai mult decât suficienttimp de procesare pentru majoritatea ciclurilor de aplicare.,) În cazul în care procesul utilizează itsfully alocat CPU timp de 10ms, o întrerupere este ridicată de hardware-ul,iar kernel-ul recapătă controlul procesului. Kernel-ul apoi promptpenalizează procesul de a fi un astfel de porc. După cum puteți vedea, că timeslicing este un concept de design important pentru a face sistemul dvs. par torun fără probleme la exterior. De asemenea, este vehiculul care producevalorile medii de încărcare.
10ms timp felie este un concept suficient de important pentru a justifica aname pentru sine: valoarea cuantică., Nu este neapărat anythinginherently special la 10ms, dar acolo este vorba despre quantum valuein general, pentru orice valoare este setată la (acesta este configurabil,dar 10ms este implicit), se controlează cât de des la un minim kerneltakes de control al sistemului de aplicații. Una dintre manychores kernel efectuează atunci când este nevoie de control înapoi este de a incrementits jiffies counter. Jiffies counter măsoară numărul decicoase care au apărut de la pornirea sistemului. Când apare cronometrul Quantum, cronometrul.c este introdus la o funcție în kernel numittimer.,c: do_timer (). Aici, toate întreruperile sunt dezactivate, astfel încât codul nu estelucrează cu ținte în mișcare. În clipe contorul este incrementat cu 1,iar sarcina medie de calcul este verificat pentru a vedea dacă acesta ar trebui să fie calculată.În realitate, sarcina medie de calcul nu este cu adevărat calculat oneach cuantice capusa, dar condus de o valoare variabilă, care se bazează pe theHZ setare de frecvențe și testat pe fiecare cuantice capusa. (HZ nu trebuie să fieconfuz cu ratingul MHz al procesorului. Această variabilă stabilește pulseratul activității kernel-ului Linux și 1HZ este egal cu un cuantum or10ms în mod implicit.,) Deși valoarea HZ poate fi configurată în unele versiunidin kernel, este în mod normal setat la 100. Codul de calcul utilizeazăvaloarea HZ pentru a determina frecvența de calcul. Mai exact, cronometrul.c: calc_load() funcția va rula algoritmul de mediere every5 * HZ, sau aproximativ la fiecare cinci secunde. Următoarea este această funcție în itsentianty:
matricea avenrun conține cele trei medii pe care le-am discutat. Funcția Thecalc_load () este numită de update_times (), găsită și în timer.c, și este codul responsabil pentru furnizarea funcției calc_load () cu parametrul theticks., Din păcate, această funcție nu-i dezvăluieaspectul cel mai interesant: Calculul în sine. Cu toate acestea, canbe localizat cu ușurință în sched.sec, un antet folosit de mult de cod kernel.Acolo, CALC_LOAD macro și valorile asociate sunt disponibile:
Aici este locul unde anvelope cunoștință cu asfaltul. Acum ar trebui să fie evidentcă realitatea nu pare să se potrivească iluziei. Cel puțin, acest lucru nu este cu siguranță tipul de medie majoritatea dintre noi sunt predate în gradeschool. Dar este totuși o medie., Tehnic, este o funcție exponentialdecay și este media mobilă de alegere pentru majoritatea sistemelor UNIXPRECUM și Linux. Să examinăm detaliile sale.
macro are trei parametri: găleata medie de încărcare (unul din cele trei elemente din avenrun), un exponent constant și numărul proceselor de rulare/neîntreruptibile aflate în prezent în coada de rulare. Thepossible exponent constantele sunt enumerate mai sus: EXP_1 pentru 1-minuteaverage, EXP_5 pentru 5 minute de mediu și EXP_15 pentru 15-minuteaverage. Punctul important de observat este că valoarea scadecu vârsta., Constantele sunt numere magice, care sunt calculate de themathematical funcția prezentat mai jos:
Când x=1, atunci y=1884; când x=5, y=2014; și atunci când x=15, y=2037. Thepopose numerelor magice este că permite CALC_LOAD macropentru a utiliza reprezentarea punct fix de precizie a fracțiilor. Magicnumbers nu sunt altceva decât multiplicatori folosiți împotriva mediei runningload pentru ao face o medie mobilă. (Reprezentarea matematică în puncte fixe depășește domeniul de aplicare al acestui articol, așa că nu voi încerca o explicație.,) Scopul exponențială functionis că nu numai netezește goluri și piroane prin menținerea unui usefultrend linie, dar cu precizie scade calitatea a ceea ce este measuresas activitate vârstele. Pe măsură ce timpul avansează, evenimentele CPU succesive crescsemnificația lor asupra mediei de încărcare. Aceasta este ceea ce ne dorim, pentru căactivitatea procesorului mai recentă are probabil mai mult impact asupra stării actuale decât evenimentele antice., În cele din urmă, mediile de încărcare dau un nivel netedtrend de la 15 minute până la minutul curent și ne oferă o fereastră nu numai utilizarea procesorului, ci și cererea medie pentru procesoare. Pe măsură ce încărcarea depășește numărul de procesoare fizice, cu cât CPU-ul este mai utilizat și cu atât mai multă cerere există pentru acesta. Și, pe măsură ce se retrage, cu atât mai puținde o cerere există. Cu această înțelegere, media de încărcare poate fiutilizat cu procentul procesorului pentru a obține o imagine mai exactă a activității procesorului.,
sper că acest lucru servește nu numai ca o practică interpretationof Linux e medii de sarcină, dar, de asemenea, se aprinde o parte din întuneric mathematicalshadows spatele lor. Pentru mai multe informații, un studiu al funcției exponentialdecay și al aplicațiilor sale ar arunca mai multă lumină asupra subiectului. Dar pentru cei mai practic-minded, complot averagevs de încărcare. un număr controlat de procese (adică modelarea efectelor algoritmului CALC_LOAD într-o buclă controlată) vă va oferi o senzație pentru relația reală și modul în care se aplică filtrul în descompunere.