legg-gjennomsnittlig beregning er best tenkt som et glidende gjennomsnitt ofprocesses i Linux kjøre kø merket kjører eller avbruddsfri. Thewords «tenkt» ble valgt for en grunn: det er hvordan measurementsare ment å tolkes, men ikke nøyaktig hva som skjer bak thecurtain. Det er på dette tidspunktet i vår reise når virkeligheten av itall, likequantum mekanikk, synes ikke å passe intuitiv måte som det presenterer seg selv.,
legg I gjennomsnitt at den øverste og oppetid kommandoer vise areobtained direkte fra /proc. Hvis du kjører Linux kernel 2.4 eller nyere, kan du lese disse verdiene selv med kommandoen cat/proc/loadavg. Det er imidlertid Linux-kjernen som produserer thosevalues i /proc. Spesielt timer.c og sched.h jobbe sammen todo beregningen. For å forstå hva som tidtaker.c gjør for et levende, theconcept av tid kutting og fei teller hjelp runde ut bildet.
I Linux-kjernen, hver returnerbare prosessen er gitt et fast beløp oftime på CPU per utsendelse., Som standard, dette beløpet er 10 millisekunder,eller 1/100th av et sekund. For kort tid, prosessen er assigneda fysiske PROSESSOR på som å kjøre sine instruksjoner, og fikk lov til å ta overthat prosessor. Oftere enn ikke, vil prosessen gi opp controlbefore den 10ms er opp gjennom socket samtaler, I/O anrop eller anrop backto kjernen. (På en Intel-2,6 GHz-prosessor, 10 ms er nok tid forapproximately 50 millioner instruksjoner å skje. Det er mer enn enoughprocessing tid for de fleste program sykluser.,) Hvis prosessen bruker itsfully avsatte CPU-tid av 10 ms, et avbrudd er reist av maskinvare,og kjernen gjenvinner kontroll av prosessen. Kjernen så promptlypenalizes prosessen for å være en så hog. Som du kan se, at timeslicing er en viktig design konsept for å gjøre systemet synes torun jevnt på utsiden. Det er også bilen som produserer theload-gjennomsnittlige verdier.
10ms tid slice er en viktig nok konseptet til å rettferdiggjøre navn for seg selv: quantum verdi., Det er ikke nødvendigvis anythinginherently om spesialtilbud på hoteller i 10ms, men det er om quantum valuein generelt, fordi uansett hva verdien er satt til (det er konfigurerbar,men 10ms er standard), er det som avgjør hvor ofte på et minimum kerneltakes kontroll av systemet tilbake fra programmene. En av de manychores kjernen utfører når det tar tilbake kontrollen er å incrementits jiffies teller. Den jiffies tiltak antall ofquantum flått som har skjedd siden systemet ble oppstartet. Når thequantum timer dukker, tidtaker.c er oppgitt ved en funksjon i kjernen calledtimer.,c:do_timer(). Her, alle avbrudd er deaktivert, slik at koden er notworking med bevegelige mål. Den jiffies counter er økt med 1,og legg-gjennomsnittlig beregning er sjekket for å se om det bør beregnes.I virkeligheten, laste-gjennomsnittlig beregning er ikke virkelig beregnet oneach quantum kryss, men drevet av en variabel verdi som er basert på theHZ frekvensinnstilling og testet på hver quantum kryss. (HZ er ikke til å beconfused med prosessoren er MHz rating. Denne variabelen angir pulserate av særlig Linux-kjerne aktivitet, og 1 HZ tilsvarer en quantum or10ms som standard.,) Selv om det HZ verdi kan være konfigurert i noen versionsof kjernen, det er normalt satt til 100. Beregningen kode usesthe HZ verdi for å fastsette beregningen frekvens. Spesielt timer.c:calc_load () – funksjonen vil kjøre gjennomsnitt algoritme every5 * HZ, eller omtrent hvert femte sekund. Følgende er at funksjonen i itsentirety:
avenrun tabellen inneholder tre gjennomsnitt vi har diskutert. Thecalc_load () – funksjonen er kalt av update_times(), også funnet i timer.c,og er koden ansvarlig for å levere calc_load () – funksjonen med theticks parameter., Dessverre er denne funksjonen ikke avsløre itsmost interessant aspekt: beregningen seg selv. Men, som canbe ligger lett i sched.h, en overskrift som brukes av mye av kjernen koden.I det, CALC_LOAD makro og tilhørende verdier er tilgjengelige:
Her er der dekkene møte fortauet. Det skal nå være evidentthat virkeligheten ikke stemmer overens med den illusjonen. Minst, thisis sikkert ikke den type gjennomsnitt de fleste av oss er lært opp i gradeschool. Men det er et gjennomsnitt likevel., Teknisk sett, det er en exponentialdecay funksjon og er det glidende gjennomsnittet av valget for de fleste UNIX-systemsas vel som Linux. La oss se på detaljene.
makroen tar i tre parametre: legg gjennomsnittet i bøtte (en ofthe tre elementer i avenrun), en konstant eksponent og numberof kjører/avbruddsfri prosesser for tiden på rømmen køen. Thepossible eksponent konstanter er nevnt ovenfor: EXP_1 for 1-minuteaverage, EXP_5 for 5-minutters gjennomsnittlig og EXP_15 for 15-minuteaverage. Det som er viktig å legge merke til er at verdien decreaseswith alder., Konstantene er magiske tall som er beregnet ved themathematical funksjonen som er vist nedenfor:
Når x=1 og y=1884; når x=5, deretter y= – 2014, og når x=15, deretter y=2037. Thepurpose av den magiske tall er at den tillater CALC_LOAD macroto bruk presisjon fast punkt representasjon av fraksjoner. Den magicnumbers er da ikke noe mer enn multiplikatorer brukt mot runningload gjennomsnittlig for å gjøre det en glidende gjennomsnitt. (Matematikk offixed-punkt representasjon er utenfor omfanget av denne artikkelen, så jeg vil notattempt en forklaring.,) Formålet med combine functionis at det ikke bare jevner dips og toppene ved å opprettholde en usefultrend linje, men det nøyaktig reduserer kvaliteten av hva det measuresas aktivitet aldre. Som tiden går fremover, etterfølgende CPU hendelser increasetheir betydning på legg i gjennomsnitt. Dette er hva vi ønsker, becausemore nyere CPU aktivitet har nok mer av en innvirkning på currentstate enn gamle hendelser., Til slutt, legg i gjennomsnitt gir en smoothtrend fra 15 minutter gjennom gjeldende minutt, og gir oss et vindu intonot bare CPU-bruk, men også den gjennomsnittlige etterspørselen etter Cpuer. Som loadaverage går over antallet fysiske Prosessorer, mer CPU-er beingused og mer etterspørsel det er etter det. Og, som det blir mindre, er det lessof et behov det er. Med denne forståelsen, legg i gjennomsnitt kan beused med CPU prosent for å få et mer nøyaktig bilde av CPU-aktivitet.,
Det er mitt håp at dette fungerer ikke bare som en praktisk interpretationof Linux legg i gjennomsnitt, men også belyser noen av de mørke mathematicalshadows bak dem. For mer informasjon, en studie av exponentialdecay funksjon og dens applikasjoner ville kaste mer lys på thesubject. Men for de mer praktiske-minded, plotting legg averagevs. en kontrollert rekke prosesser (som er, modellering virkninger ofthe CALC_LOAD algoritme i et kontrollert loop) vil gi deg en følelse for theactual forhold og hvordan den råtnende filter gjelder.