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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top