Come viene interpretata la "media dei carichi" nell'output "top"? È lo stesso per tutte le distribuzioni?


12

Vorrei sapere se l'output di un Linux basato su Red Hat potrebbe essere interpretato diversamente da un Linux basato su Debian.

Per rendere la domanda ancora più specifica, ciò che cerco dopo è capire come viene interpretata la "media dei carichi" dalla prima riga del topcomando su un sistema Red-Hat e come verificarla con il codice ro della documentazione ufficiale.

[Esistono molti modi per affrontare questo argomento, tutte risposte accettabili alla domanda]

Un approccio potenziale sarebbe quello di trovare dove queste informazioni sono ufficialmente documentate.
Un altro, sarebbe quello di trovare la versione del codice che topè costruita nella distribuzione specifica e la versione su cui sto lavorando.

L'output del comando che sto ricevendo è:

    top - 13:08:34 up  1:19,  2 users,  load average: 0.02, 0.00, 0.00
    Tasks: 183 total,   1 running, 182 sleeping,   0 stopped,   0 zombie
    Cpu(s):  0.2%us,  0.2%sy,  0.0%ni, 96.8%id,  2.7%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:   3922520k total,   788956k used,  3133564k free,   120720k buffers
    Swap:  2097148k total,        0k used,  2097148k free,   344216k cached


In questo caso come posso interpretare il valore medio del carico ?
Sono riuscito a individuare che il carico medio è all'ultimo minuto, da una fonte di documentazione e che dovrebbe essere interpretato dopo essere stato moltiplicato per 100, da un'altra fonte di documentazione.
Quindi, la domanda è:
è caricato allo 0,02% o al 2%?
Fonti e versioni della documentazione:

1) Il primo è protagonista di

    TOP(1)                        Linux User’s Manual                       TOP(1)

    NAME
           top - display Linux tasks

Fonte: man topnella mia distribuzione RedHat
Ubuntu ha anche la versione con "task" che non spiega la media del carico in:
http://manpages.ubuntu.com/manpages/precise/man1/top.1.html

2) Il secondo inizia con

    TOP(1)                          User Commands                         TOP(1)

   NAME         top

   top - display Linux processes

Fonte:
http://man7.org/linux/man-pages/man1/top.1.htm

3) Questo inizia con:

   TOP(1)

   NAME

   top - display and update information about the top cpu processes

Fonte: http://www.unixtop.org/man.shtml

Il primo , può essere visto da man topdentro RHELo dentro online ubuntu documentatione non ha alcuna spiegazione per il formato di output (né sulla media del carico a cui sono interessato) .

Il secondo , contiene una breve spiegazione, sottolineando che la media del carico ha a che fare con l'ultimo minuto, ma nulla sull'interpretazione del suo valore!

Cito direttamente dalla seconda fonte:

2a. Medie UPTIME e LOAD
Questa parte è costituita da una singola riga contenente:
nome del programma o della finestra, a seconda della modalità di visualizzazione
ora corrente e durata dall'ultimo avvio
numero totale di utenti
che caricano il sistema in media negli ultimi 1, 5 e 15 minuti

Quindi, se questa spiegazione è effettivamente corretta, è sufficiente capire che la media del carico è di circa 1 minuto.
Ma non spiega il formato del numero.

Nella terza spiegazione, si dice che:

Quando si specificano i numeri per le medie di carico, è necessario moltiplicarli per 100.

Questa spiegazione suggerisce che 0,02 significa 2% e non 0,02%. Ma è corretto? Inoltre, è corretto per tutte le distribuzioni di Linux e implementazioni potenzialmente diverse di top?
Per trovare la risposta a questa domanda, ho cercato di esaminare il codice cercandolo online. Ma ho trovato, almeno, due diverse versioni di toprelative a RHEL là fuori! il builtin-top.ce il refactored top.c. Entrambi protetti da copyright di Red-Hat come dice l'avviso all'inizio del codice e quindi sembra logico che RHEL utilizzi uno di questi.
http://lxr.free-electrons.com/source/tools/perf/builtin-top.c
http://lxr.free-electrons.com/source/tools/perf/util/top.c

Quindi, prima di approfondire quel codice, volevo un'opinione su dove concentrarsi per formare una comprensione accurata di come viene interpretato il carico della CPU?

Dalle informazioni fornite nelle risposte seguenti, oltre ad alcune ricerche personali, ho scoperto che:

1 - Quello topche sto usando è contenuto nel pacchetto procps-3.2.8. Che può essere verificato utilizzando top -v.
2 - Nella versione procps-3.2.8che ho scaricato dal sito ufficiale sembra che lo strumento uptimeottenga direttamente le sue informazioni dal procfsfile /proc/loadavg(non utilizzando la funzione linux getloadavg()).
3 - Ora anche per il topcomando non utilizza la funzione getloadavg(). Sono riuscito a verificare che topeffettivamente le stesse cose diuptimestrumento per mostrare le medie di carico. In realtà chiama la uptimefunzione dello strumento, che ottiene le sue informazioni dal procfsfile /proc/loadavg.

Quindi, tutto punta al /proc/loadavgfile! Quindi, per formare un'accurata comprensione del load averageprodotto top, si deve leggere il codice del kernel per vedere come loadavgviene scritto il file .
C'è anche un eccellente articolo sottolineato in una delle risposte che fornisce una spiegazione dei termini di un profano dei tre valori di loadavg.
Quindi, nonostante il fatto che tutte le risposte siano state ugualmente utili e utili, segnerò quella che indicava l'articolo http://www.linuxjournal.com//article/9001 come "la" risposta alla mia domanda. Grazie a tutti per il vostro contributo!

Inoltre dalla domanda Comprensione di top e load medium , ho trovato un link al codice sorgente del kernel che punta al punto in cui loadavgviene calcolato. Come sembra che ci sia un grande commento che spiega il modo in cui funziona, anche questa parte del codice è dentro C!
Il link al codice è http://lxr.free-electrons.com/source/kernel/sched/loadavg.c
Ancora una volta non sto cercando di impegnarmi in alcuna forma di plagio, sto solo aggiungendo questo per completezza. Quindi, sto ripetendo che il collegamento al codice del kernel è stato trovato da una delle risposte in Comprensione di top e caricamento della media ...


Cosa ti dicono le versioni? ( top -v)
Fiximan,

in alto: procps versione 3.2.8
Angelos Asonitis,

Risposte:


19

Il carico della CPU è la lunghezza della coda di esecuzione, ovvero la lunghezza della coda di processi in attesa di essere eseguita.

Il uptimecomando può essere utilizzato per visualizzare la lunghezza media della coda di esecuzione nell'ultimo minuto, negli ultimi cinque minuti e negli ultimi 15 minuti, proprio come viene normalmente visualizzato top.

Un valore di carico elevato indica che la coda di esecuzione è lunga. Un valore basso significa che è breve. Quindi, se la media del carico di un minuto è 0,05, significa che in media durante quel minuto c'erano 0,05 processi in attesa di esecuzione nella coda di esecuzione. Non è una percentuale. Questo è, AFAIK, lo stesso su tutti gli Unices (anche se alcuni Unices potrebbero non contare i processi in attesa di I / O, cosa che penso che fa Linux; OpenBSD, per un po ', ha anche contato i thread del kernel, in modo che il carico fosse sempre 1 o Di Più).

L' toputility Linux ottiene i valori di caricamento dal kernel, che li scrive /proc/loadavg. Osservando le fonti per procps-3.2.8, vediamo che:

  1. Per visualizzare le medie di carico, sprint_uptime()viene richiamata la funzione top.c.
  2. Questa funzione vive in proc/whattime.ce chiamate loadavg()in proc/sysinfo.c.
  3. Questa funzione si apre semplicemente LOADAVG_FILEper leggere le medie di carico.
  4. LOADAVG_FILEè definito in precedenza come "/proc/loadavg".

Grazie mille per la tua risposta, questo è ufficialmente documentato da qualche parte?
Angelos Asonitis,

1
@AgelosAssonitis Questo articolo di LinuxJournal del 2006 potrebbe essere interessante. Indica un paio di file sorgente nell'albero dei sorgenti del kernel Linux che potresti voler esaminare. Non sono un utente Linux, quindi non posso dire se quei file sono ancora lì nell'ultima incarnazione del kernel: linuxjournal.com/article/9001
Kusalananda

Articolo interessante davvero! Sto solo esaminando il pacchetto procps per vedere se effettivamente il comando top prende il suo valore dal file / proc / loadavg e se questo è lo stesso del risultato della funzione getloadavg ().
Angelos Asonitis,

@AgelosAssonitis Il posto preciso per la documentazione delle medie di carico è l'albero dei sorgenti del kernel. POSIX non definisce il carico della CPU e non menziona le parole "carico medio" da nessuna parte. Le utility tope uptimenon sono utility POSIX e anche la getloadavg()funzione di libreria non è definita in POSIX (ha comunque una discendenza BSD).
Kusalananda

Quindi, da quello che raccolgo non esiste una documentazione ufficiale per comprendere la formazione di questi valori oltre al sorgente del kernel stesso, è corretto? Prima di arrivarci, però, ho ancora bisogno di legare il valore presentato nel topfile procfs loadavg ...
Angelos Asonitis

7

La media del carico viene generalmente calcolata dal kernel. Le applicazioni come tope uptimepossono utilizzare la getloadavg(3)chiamata in libreria per accedervi (è pensata per essere trasportabile su diverse versioni Unix). Su Linux questo in genere si traduce in una lettura da /proc/loadavg. Su FreeBSD è una chiamata di sistema.

Per esempio:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
  double ld[3];

  int i=getloadavg(ld,3);
  printf("Load %.2f %.2f %.2f\n",ld[0],ld[1],ld[2]);
}

uptimeed topentrambi effettuano chiamate simili per ottenere i loro dati.

Ora le medie di carico di 1/5/15 minuti sono il numero di processi nella coda di esecuzione. Diversi sistemi operativi possono calcolarlo in diversi modi; la più grande differenza normalmente è se i processi in attesa di I / O (ad es. bloccati su disco) contano come eseguibili o meno. Su Linux lo sono.

Quindi una media di carico di 3,4 significa che c'era una media di 3,4 processi nella coda di esecuzione all'interno della finestra di esempio (1, 5, 15 minuti).

Tuttavia, una media di carico elevato non significa necessariamente un server sovraccarico. Se hai 16 core, la media del tuo carico può essere 16 senza stress. Potresti anche avere molte fork()chiamate alle applicazioni che possono comportare la creazione / distruzione di un gran numero di processi, portando a un elevato carico medio, ma senza influire in modo significativo sulle prestazioni del server. Dovrebbe essere usato solo come guida, insieme ad altre metriche come% CPU occupata.


4

La media del carico non è qualcosa di specifico per un particolare strumento o distribuzione, è una misura fornita dal kernel, o più precisamente, lo scheduler, quindi è una misura indipendente dalla distribuzione. La misurazione è registrata all'interno del filesystem proc/proc

Sulla sua interpretazione, la metrica del carico medio non è un'indicazione di quanto la CPU stia lavorando, ma di quanto lavoro debba essere fatto. Non penso che sia davvero necessario moltiplicarlo per nulla perché è una misura diretta del numero di processi in uno stato eseguibile o ininterrotto.

Prova a dare un'occhiata alle seguenti due pagine man: getloadavg(3)e uptimeper maggiori informazioni.

La metrica del carico medio può essere inizialmente un concetto difficile da capire, penso che molte persone pensino che sia un'indicazione di quanto la CPU stia lavorando, ma non è proprio così.


1
Ok, ma siamo assolutamente certi che la media del carico descritta nella getloadavg()descrizione della funzione sia la stessa media del carico che topmostra il comando in rhel? Lo sto chiedendo perché ho eseguito una ricerca di testo completo nei contenuti non tarati del pacchetto procps-3.2.8 (che è indicato dal comando top -v) e non c'è una sola menzione della funzione getloadavg ()! Quindi, forse top calcola la media del carico in modo diverso ....
Angelos Asonitis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.