Come registrare la memoria e l'utilizzo della CPU di un'applicazione?


16

Simile alla domanda Come registrare il carico della CPU? , Vorrei registrare la memoria di un processo.

Il processo che voglio registrare, viene interrotto su un server remoto e voglio scoprire il carico della CPU e l'utilizzo della memoria appena prima che venisse ucciso.

[aggiornare]

Sia la piccola sceneggiatura in vero pitone di Stefano Palazzo che

Valori di output di una riga di Michał che sono più piccoli di in topper CPU e Mem. Hai un'idea del perché?

uscita superiore:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
2312 schXX     20   0 1241m 328m  58m S  100  0.3  11:56.68 MATLAB 

uscita sceneggiatura in pitone di Stefano Palazzo:

python memlogger.py 2312
%CPU    %MEM
76.00   0.20
76.00   0.20

Sfortunatamente non posso ancora commentare qui, ma potresti trovare questo post di interesse esplodere perché pspotrebbe differire da top: stackoverflow.com/questions/131303/…
PM

Risposte:


16

È possibile creare un liner in shell:

logpid() { while sleep 1; do  ps -p $1 -o pcpu= -o pmem= ; done; }

per registrare il processo con pid = 123 solo:

logpid 123

o per vedere e scrivere il registro su file:

logpid $$ | tee /tmp/pid.log

Se si desidera che vengano registrati altri dati, modificare le -o {this}opzioni. Vedere la man pssezione "SPECIFICATORI DI FORMATO STANDARD" per i parametri disponibili da utilizzare. Se si desidera una diversa risoluzione temporale, cambiare sleep {this}funzione logpid().


Semplice e fa il lavoro!
rafaelbattesti

3

Se stai seguendo esattamente le topstatistiche potresti eseguire topin modalità batch specificando il pid del processo che stai cercando. Prendendo l'esempio da questa pagina ( http://www.dedoimedo.com/computers/linux-cool-hacks.html ) se hai digitato

top -b -d 10 -n 3 >> top-file

Dovresti "avere il top in esecuzione in modalità batch (-b). Si aggiornerà ogni 10 secondi, come specificato dal flag di ritardo (-d), per un conteggio totale di 3 iterazioni (-n). L'output verrà inviato in un file ". Compreso -ppuoi specificare pidil processo che stai cercando. Questo ovviamente restituirà più che puramente CPU e RAM ma conterrà questi campi. Nel mio caso, ad esempio, otterrei quanto segue durante il monitoraggio di pid 9189 usando top -b -d 10 -n 3 -p 9189 >> ~/top-file:

PID  USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
9189 pmj27     20   0 1617016 808112  27916 S   0.0  0.3   1:36.63 gedit

Questa pagina, sebbene non reindirizzi a un file, esegue alcune modifiche più sofisticate che consentono di ottenere solo la stampa della CPU. Se qualcuno conosce un buon modo per reindirizzare l'output su un file e farlo aggiornare periodicamente, sarei interessato a saperlo. watchnon mi sembra l'ideale per questo: superuser.com/questions/281347/filtering-top-command-output
PM

2

Questo semplice script Python dovrebbe fare quello che vuoi:

import time
import string
import sys
import commands

def get_cpumem(pid):
    d = [i for i in commands.getoutput("ps aux").split("\n")
        if i.split()[1] == str(pid)]
    return (float(d[0].split()[2]), float(d[0].split()[3])) if d else None

if __name__ == '__main__':
    if not len(sys.argv) == 2 or not all(i in string.digits for i in sys.argv[1]):
        print("usage: %s PID" % sys.argv[0])
        exit(2)
    print("%CPU\t%MEM")
    try:
        while True:
            x,y = get_cpumem(sys.argv[1])
            if not x:
                print("no such process")
                exit(1)
            print("%.2f\t%.2f" % (x,y))
            time.sleep(0.5)
    except KeyboardInterrupt:
        print
        exit(0)

Devi prima scoprire l'id di processo del programma che vuoi monitorare, quindi puoi eseguire lo script con il PID come argomento:

python log.py 3912

Stamperà l'utilizzo della cpu e l'utilizzo della RAM in percentuale due volte al secondo:

%CPU    %MEM
0.90    0.40
1.43    0.40
8.21    0.40
...

Puoi quindi reindirizzare il suo output su un file per importarlo in un foglio di calcolo in un secondo momento ( python log.py 9391 > firefox_log.txt) e importare i dati in un foglio di calcolo selezionando Tabcome separatore.

Il programma si chiude quando si preme Ctrl + C o quando il processo viene interrotto.


Caro Stefano, grazie mille per la tua sceneggiatura. Sfortunatamente sembra produrre risultati sbagliati. Hai idea del perché? Si prega di consultare la mia domanda aggiornata.
Framester,

Dalla pagina man di ps man7.org/linux/man-pages/man1/ps.1.html , ps restituisce il "tempo CPU usato diviso per il tempo di esecuzione del processo (rapporto cputime / tempo reale), espresso in percentuale "- quindi ottieni una media dell'utilizzo della CPU da quando è iniziato
Nicolas Charles,
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.