Ottenere lo stesso utilizzo della CPU ogni volta.


13

Quando eseguo il comando seguente per ottenere l'utilizzo della CPU, ottengo un uso della CPU piacevole + utente.

top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' 

Produzione:

14.5

Qui sto ottenendo il problema è che l'output dipende dal comando top quindi non cambia istantaneamente come comando top. Quindi non ottengo subito la CPU corretta. Fornisce lo stesso output e non cambia.

Voglio ottenere in tempo reale cpuusage in output. Aiutatemi a migliorare il mio comando.


1
E la domanda è?
Dennis Kaarsemaker, il

Prova a eseguire il comando anteposto time. Sul mio sistema ci vogliono solo 0,165 secondi.
depquid

Per favore dammi il comando modificato.
Ketan Patel,

Prova:time (top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' )
depquid

nessuna differenza in uscita, dopo aver testato in diversi sistemi
Ketan Patel,

Risposte:


13

Hai ragione, topsembra dare un uso errato della CPU alla prima iterazione. Puoi aggirare questo problema in questo modo:

top -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

Ciò richiederà ovviamente il doppio del tempo, ma funzionerà comunque.

Se vuoi ancora che funzioni più velocemente, puoi usare l' -dopzione, ad esempio per un periodo di misurazione totale di 1 secondo, usane metà:

top -d 0.5 -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

serverfault.com/a/436499/134517 inoltre ci vorrà molto più del doppio del tempo in quanto impiegherà all'incirca un secondo anziché quasi nessuno.
Altendky,

Oltre al commento di Altendky, vedi anche la risposta di Terdon per la spiegazione del perché il problema è in primo luogo presente.
Ruslan,

6

Tecnicamente il primo topnon sempre produce lo stesso valore; emette solo il carico medio della CPU dall'ultimo avvio. Poiché toputilizza il delta delle /proc/statstatistiche per calcolare il carico della CPU, il primo valore viene calcolato confrontando con zero, producendo risultati errati (ma WAD).

Se non si desidera utilizzare top, è possibile analizzare direttamente /proc/stat:

cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5) "%"}'

È anche più veloce e più preciso in questo modo.

Puoi provarlo con stress:

stress -c 1 -q &

E fai

killall stress

dopo.


Bello. E se il tuo comando viene inserito in un file chiamato 'cpu', allora watchpuò essere eseguito su di esso:watch -n1 "bash ./cpu"
Brent Faust,

Lo script awk da analizzare /proc/statè piuttosto interessante, ma sembra avere lo stesso inconveniente della prima iterazione di top: genera il carico medio della CPU dall'ultimo avvio, non quello corrente.
pieroxy,

5

Solo per espandere la risposta di @ Ruslan, topdividere l'utilizzo della CPU tra utente, processi e niceprocessi di sistema , vogliamo la somma dei tre. Quindi, possiamo eseguire topin bmodalità atch che ci consente di analizzarne l'output. Tuttavia, come spiegato qui , la prima iterazione di top -brestituisce le percentuali dall'avvio, quindi abbiamo bisogno di almeno due iterazioni ( -n 2) per ottenere la percentuale corrente. Per velocizzare le cose, puoi impostare l' delay tra le iterazioni su 0.01:

top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'

4

Forse usare questo basato pssull'output:

ps aux  | awk 'BEGIN { sum = 0 }  { sum += $3 }; END { print sum }

0

Usa il comando watch o per loop in shell,

vale a dire watch -n1 "top -b -n1 | grep 'Cpu(s)' | awk '{print \$2 + \$4}'"


Stessa cosa succede con l'orologio
Ketan Patel,

0

Perché ti interessa l'utilizzo della CPU? La media del carico è un indicatore molto migliore:

cat /proc/loadavg

Se hai davvero bisogno dell'utilizzo della CPU, l'analisi /proc/statè probabilmente la strada da percorrere.


1
La media del carico è sostanzialmente un tempo integrale dell'uso della CPU (diviso per il tempo). Perché diresti che una caratteristica integrale è un indicatore molto migliore [di tutto] rispetto a una differenziale quando hanno casi d'uso completamente diversi? Inoltre, /proc/statnon fornisce l'utilizzo della CPU così com'è, bisogna leggerlo due volte con un po 'di tempo tra le letture ed eseguire alcuni calcoli per ottenere l'utilizzo della CPU. Questo è proprio quello che topfa.
Ruslan,

Non posso matematica, quindi devo ammettere che non capisco davvero la differenza tra integrale e differenziale: / "La media del carico è fondamentalmente un integrale del tempo di utilizzo della CPU" - è davvero? AFAIK un processo che si blocca nello stato D provoca un aumento del carico, ma nessun utilizzo della CPU. "Perché dovresti dire ..." - OP non dice ciò che vuole veramente realizzare, quindi ad essere sincero, presumo solo che voglia misurare il suo carico di sistema e ho pensato che l'utilizzo della CPU sarebbe stato il miglior indicatore per questo , quindi gli ho chiesto di caricare la media.
Martin von Wittich,

Dal tuo link: "I sistemi calcolano la media del carico come media mobile esponenzialmente smorzata / ponderata del numero di carico". e "il carico del sistema è una misura della quantità di lavoro computazionale". Lo stato D non richiede alcun lavoro di calcolo. Ciò che sta prendendo sono i processi che utilizzano il tempo della CPU. Quindi il carico medio è sostanzialmente la percentuale di tempo in cui la CPU non è stata inattiva per un certo periodo di tempo (diciamo da minuti a decine di minuti). E l'utilizzo della CPU è una percentuale di tempo in cui la CPU non è inattiva su una scala temporale di millisecondi, vale a dire aggiornata ogni volta che la leggi e riflette lo stato corrente .
Ruslan,

-2

Usando il sarcomando

sar 1 10

Ciò significa: ottieni 10 volte il risultato ogni secondo

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.