Il calcolo della media del carico è meglio pensato come una media mobile di processi nella coda di esecuzione di Linux contrassegnata come in esecuzione o uninterruptible. Le parole “thought of” sono state scelte per un motivo: è così che le misure devono essere interpretate, ma non esattamente ciò che accade dietro la cortina. È in questo frangente del nostro viaggio che la realtà di itall, come la meccanica quantum, sembra non adattarsi al modo intuitivo in cui si presenta.,
Le medie di carico visualizzate dai comandi top e uptime sono ottenute direttamente da /proc. Se si esegue il kernel Linux 2.4 o successivo, è possibile leggere questi valori da soli con il comando cat / proc / loadavg. Tuttavia, è il kernel Linux che produce quellivalori in / proc. In particolare, timer.c e sched.h lavorare insieme per il calcolo. Per capire cosa timer.c fa per vivere, theconcept di affettare il tempo e l’aiuto di contatore di jiffy completano l’immagine.
Nel kernel Linux, ad ogni processo dispatchabile viene assegnata una quantità fissa di tempo sulla CPU per spedizione., Per impostazione predefinita, questo importo è di 10 millisecondi o 1/100 di secondo. Per quel breve lasso di tempo, il processo è assegnatoun CPU fisica su cui eseguire le sue istruzioni e ha permesso di prendere processore overthat. Il più delle volte, il processo rinuncerà al controlloprima che i 10 ms siano attivi tramite chiamate socket, chiamate I/O o chiamate al kernel. (Su un processore Intel 2.6 GHz, 10ms è abbastanza tempo per circa 50 milioni di istruzioni. Questo è più che sufficiente tempo di elaborazione per la maggior parte dei cicli di applicazione.,) Se il processo utilizza il tempo di CPU interamente assegnato di 10 ms,viene generato un interrupt dall’hardware e il kernel riprende il controllo dal processo. Il kernel quindi rapidamentepenalizza il processo per essere un tale maiale. Come si può vedere, che timeslicing è un concetto di design importante per rendere il vostro sistema sembra torun senza intoppi sulla parte esterna. È anche il veicolo che produce valori medi di carico.
La fetta di tempo di 10ms è un concetto abbastanza importante da giustificare aname per se stesso: valore quantico., Non c’è necessariamente nulla di speciale su 10ms, ma c’è circa il valore quantico in generale,perché qualunque valore sia impostato (è configurabile, ma 10ms è il valore predefinito), controlla la frequenza con cui il kernel riprende il controllo del sistema dalle applicazioni. Uno dei manychores che il kernel esegue quando riprende il controllo è quello di incrementare il suo contatore jiffies. Il contatore jiffies misura il numero ofquantum zecche che si sono verificati da quando il sistema è stato avviato. Quando thequantum timer si apre, timer.c è inserito in una funzione nel kernel chiamatotimer.,c: do_timer (). Qui, tutti gli interrupt sono disabilitati in modo che il codice non funzioni con bersagli mobili. Il contatore jiffies viene incrementato di 1 e il calcolo della media del carico viene controllato per vedere se deve essere computed.In in realtà, il calcolo del carico medio non è veramente calcolato su ogni tick quantistico, ma guidato da un valore variabile basato sull’impostazione della frequenza HZ e testato su ciascun tick quantistico. (HZ non deve essere confuso con la valutazione MHz del processore. Questa variabile imposta il pulsate di una particolare attività del kernel Linux e 1HZ equivale a un quantum or10ms per impostazione predefinita.,) Sebbene il valore HZ possa essere configurato in alcune versioni del kernel, normalmente è impostato su 100. Il codice di calcolo utilizza il valore HZ per determinare la frequenza di calcolo. In particolare, il timer.c: calc_load() funzione eseguirà l’algoritmo di media ogni 5 * HZ, o circa ogni cinque secondi. Di seguito è riportata la funzione nella sua entità:
L’array avenrun contiene le tre medie di cui abbiamo discusso. La funzione Thecalc_load () viene chiamata da update_times (), che si trova anche nel timer.c, ed è il codice responsabile della fornitura della funzione calc_load () con il parametro tick., Sfortunatamente, questa funzione non rivela la suaaspetto più interessante: il calcolo stesso. Tuttavia, che canbe trova facilmente in sched.h, un’intestazione usata da gran parte del kernel code.In lì, la macro CALC_LOAD e i suoi valori associati sono disponibili:
Qui è dove i pneumatici incontrano il marciapiede. Ora dovrebbe essere evidentthat realtà non sembra corrispondere l’illusione. Almeno, thisis certamente non il tipo di media la maggior parte di noi è insegnata in gradeschool. Ma è comunque una media., Tecnicamente, è una funzione exponentialdecay ed è la media mobile di scelta per la maggior parte dei sistemi UNIX e Linux. Esaminiamo i suoi dettagli.
La macro accetta tre parametri: il bucket load-average (uno dei tre elementi di avenrun), un esponente costante e il numero di processi in esecuzione/uninterruptible attualmente nella coda di esecuzione. Le costanti di esponente possibili sono elencate sopra: EXP_1 per la media di 1 minuto, EXP_5 per la media di 5 minuti e EXP_15 per la media di 15 minuti. Il punto importante da notare è che il valore diminuiscecon l’età., Le costanti sono numeri magici calcolati dalfunzione matematica mostrata di seguito:
Quando x=1, quindi y=1884; quando x=5, quindi y=2014; e quando x=15, quindi y=2037. Lo scopo dei numeri magici è che consente al macro CALC_LOAD di utilizzare la rappresentazione a punto fisso di precisione delle frazioni. I magicnumbers non sono altro che moltiplicatori utilizzati contro la media runningload per renderlo una media mobile. (La rappresentazione matematica del punto fisso va oltre lo scopo di questo articolo, quindi non tenterò una spiegazione.,) Lo scopo della funzione di decadimento esponenziale è che non solo leviga i cali e le punte mantenendo una linea di tendenza utile, ma diminuisce accuratamente la qualità di ciò che misura come attività invecchia. Con il passare del tempo, gli eventi successivi della CPU aumentanoil loro significato sulla media del carico. Questo è ciò che vogliamo, perchél’attività della CPU più recente probabilmente ha più un impatto sullo stato corrente rispetto agli eventi antichi., Alla fine, le medie di carico danno un andamento regolare da 15 minuti al minuto corrente e ci danno una finestra non solo l’utilizzo della CPU ma anche la domanda media per le CPU. Poiché la media del carico supera il numero di CPU fisiche, più la CPU viene utilizzata e maggiore è la domanda. E, mentre si allontana, menodi una domanda c’è. Con questa comprensione, la media del carico può essereusato con la percentuale della CPU per ottenere una visione più accurata dell’attività della CPU.,
È mia speranza che questo serva non solo come interpretazione pratica delle medie di carico di Linux, ma illumini anche alcuni degli oscuri ombre matematiche dietro di loro. Per ulteriori informazioni, uno studio della funzione exponentialdecay e delle sue applicazioni farebbe più luce sul soggetto. Ma per i più pratici, tracciando la media del caricov. un numero controllato di processi (ovvero la modellazione degli effetti dell’algoritmo CALC_LOAD in un ciclo controllato) ti darebbe un’idea della relazione effettiva e di come si applica il filtro decadente.