Ottieni l'utilizzo della CPU nello script di shell?
Domanda
Ne sto eseguendo alcuni JMeter test rispetto a un processo Java per determinare la reattività di un'applicazione Web sotto carico (oltre 500 utenti).JMeter fornirà il tempo di risposta per ogni richiesta web e ho scritto uno script per eseguire il ping di Tomcat Manager ogni X secondi che mi fornirà la dimensione corrente dell'heap JVM.
Vorrei raccogliere le statistiche sul server della% della CPU utilizzata da Tomcat.Ho provato a farlo in uno script di shell usando ps
come questo:
PS_RESULTS=`ps -o pcpu,pmem,nlwp -p $PID`
...eseguendo il comando ogni X secondi e aggiungendo i risultati a un file di testo.(per chi se lo chiede, pmem
= % utilizzo memoria e nlwp
è il numero di thread)
Tuttavia ho scoperto che questo fornisce una definizione di "% di utilizzo della CPU" diversa da quella che vorrei, secondo le manpage di ps, pcpu
è definito come:
utilizzo della CPU del processo in formato "##.#".È il tempo della CPU utilizzato diviso per il tempo di esecuzione del processo (rapporto cputime/realtime), espresso in percentuale.
In altre parole, pcpu
mi dà la% di utilizzo della CPU per il processo per il tutta la vita del processo.
Dato che voglio prelevare un campione ogni X secondi, vorrei raccogliere l'utilizzo della CPU del processo solo al momento attuale, in modo simile a quanto top
Mi darebbe (utilizzo della CPU del processo dall'ultimo aggiornamento).
Come posso raccoglierlo dall'interno di uno script di shell?
Soluzione
Utilizzo top -b
(e altri interruttori se desideri uscite diverse).Verrà semplicemente scaricato su stdout invece di saltare in una finestra di curses.
Altri suggerimenti
Lo strumento più utile che ho trovato per monitorare un server durante l'esecuzione di un test come JMeter su di esso è dstat.Non solo ti fornisce una serie di statistiche dal server, ma genera output in CSV per una facile importazione in un foglio di calcolo e ti consente di estendere lo strumento con moduli scritti in Python.
Carico utente: top -b -n 2 |grep Cpu |tail -n 1 |awk '{print $2}' |sed 's/.[^.]*$//'
Carico del sistema: top -b -n 2 |grep Cpu |tail -n 1 |awk '{print $3}' |sed 's/.[^.]*$//'
Carico a vuoto: top -b -n 1 |grep Cpu |tail -n 1 |awk '{print $5}' |sed 's/.[^.]*$//'
Ogni risultato è un decimale tondo.
A mente fredda, utilizzerei la visualizzazione del filesystem /proc dello stato del sistema: guarda uomo 5 proc per vedere il formato della voce per /proc/PID/stat, che contiene informazioni sull'utilizzo totale della CPU, e utilizzare /proc/stat per ottenere informazioni globali sul sistema.Per ottenere l'utilizzo dell'"ora corrente", probabilmente intendi in realtà "CPU utilizzata negli ultimi N secondi";prendi due campioni a breve distanza l'uno dall'altro per vedere il tasso attuale di consumo della CPU.È quindi possibile trasformare questi valori in qualcosa di utile.In realtà, però, questo è probabilmente più un lavoro Perl/Ruby/Python che un puro script di shell.
Potresti essere in grado di ottenere i dati approssimativi che stai cercando con /proc/PID/status, che fornisce una media del sonno per il processo.Dati piuttosto grossolani però.
usa anche 1 come conteggio delle iterazioni, così otterrai l'istantanea corrente senza aspettare di ottenerne un'altra in $delay time.
top -b -n 1