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.