Come posso ricevere statistiche della CPU top-like dalla shell?


12

Sto cercando di ottenere una lettura accurata della mia CPU usata (in percentuale) da top. Questo è il comando che sto eseguendo per i test:

top -n1 | awk '/Cpu\(s\):/ {print $2}'

Questo ritorna:

10.7%us,

Qual è il dato corretto che desidero. Tuttavia, ogni volta che eseguo il comando ottengo lo stesso output, anche se sto applicando carichi diversi sul mio sistema (e per non parlare del htopfatto che il mio utilizzo è diverso). Sembra che ogni volta che avvio top, l'utilizzo della mia CPU è lo stesso. Solo dopo un paio di fotogrammi mi dà i valori corretti.

Non mi sembra di poter analizzare l'output di top in questo modo, quindi sto cercando altre applicazioni affidabili che mi daranno una lettura accurata dalla shell. Mi piace molto come htopposso darmi una lettura per core.

Ho provato iostate mpstatma sembrano dare valori imprecisi e "lento a cambiare".


2
Non farlo. La domanda corretta da porsi è: come posso ottenere statistiche di utilizzo della CPU di livello superiore dalla shell?
Stéphane Gimenez,

@ StéphaneGimenez grazie ho modificato la mia domanda
n0pe

Risposte:


12

Uso questo script (da questo thread sulle schede Arch ):

#!/bin/bash
read cpu a b c previdle rest < /proc/stat
prevtotal=$((a+b+c+previdle))
sleep 0.5
read cpu a b c idle rest < /proc/stat
total=$((a+b+c+idle))
CPU=$((100*( (total-prevtotal) - (idle-previdle) ) / (total-prevtotal) ))

Linux ha alcune informazioni fantastiche in / proc / - vedi linux.die.net/man/5/proc per tutte le chicche. Fai attenzione che questi sono solo Linux. Non c'è davvero alcun modo multipiattaforma per ottenere tali informazioni se non si utilizza una libreria come Sigar .
Pat Notz,

L'idea è buona, ma alcuni dettagli non sono corretti. Il valore inattivo è la quinta colonna e dovresti anche aggiungere la colonna iowait (sesta colonna) per ottenere una percentuale ragionevole. Per essere del tutto corretti, dovresti aggiungere anche tutti i valori di "riposo", ma spesso sono molto piccoli.
Peter Eisentraut,

Il valore inattivo è la quinta colonna, se si sta contando la colonna "cpu". Altrimenti, è il quarto.
SunSparc,

6

Dai un'occhiata anche a sar . Le implementazioni possono variare ampiamente da nix a nix, ma dovrebbero fornire statistiche di sistema di base, in determinate istantanee. Non sono sicuro di come precisa i valori sono al punto in cui il comando viene prima inizializzato, ma si potrebbe giocare per vedere come si confronta top, iostate così via

L'output è basato su colonne, come top, quindi dovresti essere in grado di reindirizzare l'output awko cutmanipolare i risultati.


Ho provato sarprima con risultati contrastanti. Vado con la risposta di @ jasonwryan qui perché posso facilmente modificarlo per rappresentare l'utilizzo con entrambi i miei core della CPU.
n0pe


0

Quello che ho trovato è simile alla persona che ha posto la domanda sopra, almeno su CentOS 6. Se corro in cima alla modalità batch per una sola iterazione, sembra che raccolga la stessa figura, quasi come se la sua tendenza fosse iniziare con ciò che ricorda per ultimo la visualizzazione. Top sembra aver bisogno di accumulare almeno un paio di cifre per ottenere delta per darti le percentuali corrette. Dopo aver testato più di 10 iterazioni, ho scoperto che la seconda cifra che si presentava mostrava una differenziazione sufficiente ad ogni corsa. Quindi, è abbastanza facile ottenere questa linea tramite

top -b -n 2 | grep Cpu | tail -1

Mi piace incorporarlo con uptime per il caricamento e un filtro grep di processi selezionati da ps, come le query postgres. Un monitor molto semplice può essere espresso con l'alias:

alias postgresmon="watch -d 'uptime;top -b -n 2 | grep Cpu | tail -1;ps -ef | grep postgres\: | grep -v idle'"
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.