Come ottenere l'utilizzo complessivo della CPU (ad es. 57%) su Linux [chiuso]


197

Mi chiedo come sia possibile ottenere l'utilizzo della CPU del sistema e presentarlo in percentuale usando bash, per esempio.

Uscita campione:

57%

Nel caso in cui sia presente più di un core, sarebbe utile calcolare una percentuale media.


1
@julesanchez il valore deve essere convogliato altrove, quindi deve essere un int
user1199739

fare top> myfile.txt E applicare il filtro in post-trattamento, non va bene?
JuSchz,

11
Un comando che non richiede sysstat:ps -A -o pcpu | tail -n+2 | paste -sd+ | bc
RFon

7
Riapertura Non capisco perché questo è stato escluso come fuori tema, a coloro che lo hanno chiuso potrebbe interessarsi elaborare?
Jonathan H,

3
La mia comprensione /proc/statè molto limitata, ma questo one-liner funziona bene anche per me: cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{printf "%.2f%\n", ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'. Con% .2f puoi controllare il numero di decimali che vuoi emettere, e con sleep 1te puoi impostare il tempo su cui vuoi fare la media, cioè se fa quello che penso faccia. Puoi metterlo in loop bash while, per testarlo in tempo reale.
Yeti,

Risposte:


174

Date un'occhiata al cat /proc/stat

grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'

MODIFICA , leggi i commenti prima di copiare e incollare questo o di usarlo per qualsiasi lavoro serio. Questo non è stato testato né utilizzato, è un'idea per le persone che non vogliono installare un'utilità o per qualcosa che funziona in qualsiasi distribuzione. Alcune persone pensano che tu possa "apt-get install" qualsiasi cosa.

NOTA: questo non è l' utilizzo corrente della CPU, ma l'utilizzo complessivo della CPU in tutti i core dall'avvio del sistema. Questo potrebbe essere molto diverso dall'uso attuale della CPU. Per ottenere il valore corrente è necessario utilizzare top (o strumento simile).

L'utilizzo corrente della CPU può essere potenzialmente calcolato con:

awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' \
<(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)

12
Ma devi installare mpstat come raccomandato sopra. Molte persone non hanno questa flessibilità. cat / proc / stat quindi pipe è molto più semplice di mpstat che consigli.
vimdude,

12
+1 Non capisco perché analizzare un'altra utility sia meglio che analizzare/proc/stat
Ripristina Monica Per favore, il

9
sistema + utente + inattivo = 100%. Quindi forse qualcosa del tipo: grep 'cpu' / proc / stat | awk '{cpu_usage = ($ 2 + $ 4) * 100 / ($ 2 + $ 4 + $ 5)} END {stampa cpu_usage "%"}'
vimdude

106
Penso che questa soluzione non mostri il carico attuale della CPU ma il carico medio della cpu dall'inizio della CPU.
Etienne,

11
@jlliagre, sì, è vero. Per calcolare l'utilizzo della CPU CORRENTE non nella media, dovrai prendere un valore di $ 1, quindi ritardare quindi prendere il valore di $ 1 e vedere la differenza. Questo è l'attuale utilizzo della CPU.
vimdude,

102

Puoi provare:

top -bn1 | grep "Cpu(s)" | \
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
           awk '{print 100 - $1"%"}'

11
Ogni volta che eseguo questo comando, ottengo esattamente lo stesso output ( 32.7%).
Alanaktion,

13
Un risultato più accurato è dato quando uso top -bn2, ma richiede molto tempo. Da quello che ho letto, questo sembra essere l'unico modo per ottenere un risultato accurato.
alanaktion,

7
top -bn1sembra incredibilmente impreciso sul mio sistema FC20. top -bn2sembra funzionare bene.
Martin Tournoij,

24
Il comando in questa risposta sembra essere scritto per sistemi in cui top -vritorna procps-ng(ad es. Fedora). Esistono anche procps, ad esempio, Ubuntu e CentOS, in cui il comando non funziona (indica sempre il 100%, poiché l'analisi non riesce a causa della linea con le cifre della CPU formattate diversamente). Ecco una versione che funziona con entrambe le implementazioni:top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }'
mklement0

2
Nota a margine: su OSX, utilizzare il seguente: top -l 2 -n 0 -F | egrep -o ' \d*\.\d+% idle' | tail -1 | awk -F% -v prefix="$prefix" '{ printf "%s%.1f%%\n", prefix, 100 - $1 }'.
mklement0,

38

Prova mpstatdal sysstatpacchetto

> sudo apt-get install sysstat
Linux 3.0.0-13-generic (ws025)  02/10/2012  _x86_64_    (2 CPU)  

03:33:26 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
03:33:26 PM  all    2.39    0.04    0.19    0.34    0.00    0.01    0.00    0.00   97.03

Quindi alcuni cuto grepper analizzare le informazioni necessarie:

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 -  $ 12}'a

1
Non credo che questo mostri la CPU totale
user1199739,

Direi che è al 100% inattivo che è l'utilizzo totale della CPU (in%)
Peter Svensson,

Questa è la percentuale "non" utilizzata. Questa risposta è stata buona, fino al grep | coda | parte
terribile

Vorrei cambiare la awkparte in awk -F " " '{print (100 - $12)"%"}':, che dà l'output formattato come voleva, ma per il resto questo mi sembra buono.
Dan Fego,

1
@jordanm Tutte le verità; Ho votato di più perché funziona. Lo farei personalmente:mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'
Dan Fego,

22

Potrebbe anche dare una risposta effettiva con la mia soluzione, che è stata ispirata da Peter Liljenberg:

$ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }'
0.75%

Questo userà awkper stampare 100 meno il 12 ° campo (inattivo), con un segno di percentuale dopo di esso. awklo farà solo per una linea in cui il 12 ° campo ha solo numeri e punti ( $12 ~ /[0-9]+/).

Puoi anche fare una media di cinque campioni, a un secondo di distanza:

$ mpstat 1 5 | awk 'END{print 100-$NF"%"}'

Provalo in questo modo:

$ mpstat 1 5 | tee /dev/tty | awk 'END{print 100-$NF"%"}'

14
È meglio eseguire "mpstat 2 1 | ..." in modo che mostri le statistiche negli ultimi 1 secondo. Altrimenti, per impostazione predefinita, mpstat mostra le statistiche dall'inizio e questo non cambia molto con il passare del tempo
Sarang

1
"mpstat | awk '$ 12 ~ /[0-9.[+/ {print 100 - $ 11"% "}'" questo lavoro per me.
AloneInTheDark,

@Sarang Grazie mille !! Finalmente posso ottenere anche i risultati conkyvisualizzati. Sfortunatamente, questa linea è MOLTO lenta e richiede quasi un secondo intero per l'esecuzione.
syntaxerror,

6
@syntaxerror Ci vogliono esattamente 2 secondi perché se guardi il comando ti aiuta a vedere che il primo argomento è che è l'intervallo ma viene eseguito solo una volta a causa del secondo argomento, quindi attende 2 secondi interi fino a quando non restituisce il risultato.
Johan Bjäreholt,

La domanda è chiusa, quindi ho aggiunto la mia (simile) risposta alla tua :-) Spero non ti dispiaccia. Come te, sono stato ispirato dalla risposta di Peter Liljenberg.
PJ Brunet,

16

EDITED: ho notato che nella risposta di un altro utente% idle era il campo 12 anziché il campo 11. L'awk è stato aggiornato per tenere conto del fatto che il campo% inattivo è variabile.

Questo dovrebbe ottenere l'output desiderato:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { print 100 - $field }'

Se vuoi un semplice arrotondamento per numeri interi, puoi usare printf:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d%%",100 - $field) }'

2
mpstat 1 1 | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d",100 - $field) }'funziona benissimo per me, grazie. notare mpstat 1 1 per assicurarsi che l'utilizzo della cpu sia campionato per un secondo
chrishiestand

1
Se hai jq:mpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'
nyet
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.