Ottenere l'utilizzo della CPU in tempo reale


11

Quando eseguo il comando seguente per ottenere l'utilizzo della CPU, ottengo un utilizzo piacevole della CPU + 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 l'utilizzo della CPU in tempo reale in uscita. Aiutatemi a migliorare il mio comando.


monitoraggio in tempo reale askubuntu.com/questions/293426/…
Qasim

Questo semplice script bash fa proprio questo: askubuntu.com/a/450136/243213
Craig van Tonder,

Risposte:


20

Se puoi permetterti un ritardo di un secondo, questo stamperà l'utilizzo della CPU in percentuale semplice:

echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')]

(Senza il ritardo di un secondo, è vmstatpossibile stampare solo valori medi dall'avvio.)


Non mi dà una percentuale accurata (rispetto a htop)
lepe

1
È necessario utilizzare in vmstat 1 2questo modo: in echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')] caso contrario, vmstatsi darà valori dall'avvio che probabilmente non è quello che stai cercando .
Joe,

joe grazie funziona. per favore Paolo, modifica la risposta in modo che tutti possano vedere la riga di comando corretta
Pavlos Theodorou,

Grazie per averlo beccato, Joe e Pavlos! Non ho notato quella parte della pagina man.
Paul,

9

Questo è un problema noto con top. 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. topdivide l'utilizzo della CPU tra utente, processi di sistema e niceprocessi, vogliamo la somma dei tre. Infine, grepla riga che contiene le percentuali di CPU e quindi utilizza gawkper sommare l'utente, il sistema e i processi piacevoli:

    top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
        -----  ------   -----------    ---------   ----------------------
          |      |           |             |             |------> add the values
          |      |           |             |--> keep only the 2nd iteration
          |      |           |----------------> keep only the CPU use lines
          |      |----------------------------> set the delay between runs
          |-----------------------------------> run twice in batch mode

Ogni altro metodo incluso sar, mpstat ... etc mostra un 2/3% mentre questo comando mostra sempre il 50%.
CMCDragonkai,

@CMCDragonkai i numeri dovrebbero cambiare (l'ho appena controllato) sei sicuro di averlo copiato / incollato correttamente? Inoltre, si noti che su sistemi con più CPU, topverrà segnalato l'utilizzo% come percentuale di una singola CPU. Ciò significa che otterrai spesso percentuali molto più elevate. Vedi il punto 9 qui .
terdon,

Penso che questo comando potrebbe non essere compatibile con il mio sistema. Ma è evidente che tutti gli altri metodi che ho provato mi danno una percentuale dell'1 / 2/3%, che è ciò che vedo se eseguo htop, mentre questo comando mi dà un'anomalia.
CMCDragonkai,

@CMCDragonkai è a causa delle CPU multiple. Puoi ottenere il numero restituito da questo e dividerlo per il numero di core oppure puoi usarlo topin modalità interattiva (basta eseguire top) e, una volta lì, premere I(shift + i) per vedere una suddivisione per core.
terdon,

Ho solo 1 CPU.
CMCDragonkai,

7

Ho provato diversi modi, ma questo mi sembra il più preciso:

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)}'

Capito da qui


my linux (Linux machine_name 4.4.0-127-generic # 153-Ubuntu SMP sab 19 maggio 10:58:46 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux) non ha colonna $ 15 (linea cpu del file / proc / stat) : cpu 17411187 27478 594887 646652526 585551 0 31838 0 0 0
Kemin Zhou

1
Migliore risposta! Grazie! La mia variazione: cat <(grep 'cpu' / proc / stat) <(sleep 0.1 && grep 'cpu' / proc / stat) | awk -v RS = "" '{printf "% .1f", ($ 13- $ 2 + $ 15- $ 4) * 100 / ($ 13- $ 2 + $ 15- $ 4 + $ 16- $ 5)}'
maXp

la differenza di maXp è che la sua stampa è arrotondata con un solo decimale: %.1fche, a mio avviso, è più leggibile e utile se si utilizza tale output in altri script.
lepe

0

Usa -n2. Questo produrrà due righe. La prima volta che topstampa la linea non si qualifica per lo stato in quel momento. Quindi regola lo script per ignorare la prima riga.

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.