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.