Voglio monitorare l'utilizzo della memoria di un processo e voglio che questi dati vengano registrati. Esiste un tale strumento?
Voglio monitorare l'utilizzo della memoria di un processo e voglio che questi dati vengano registrati. Esiste un tale strumento?
Risposte:
Ho scritto una sceneggiatura per fare esattamente questo . Praticamente campiona ps
ad intervalli specifici, per costruire un profilo di un particolare processo. Il processo può essere avviato dallo stesso strumento di monitoraggio oppure può essere un processo indipendente (specificato da pid o modello di comando).
Occasionalmente, quando sorge la necessità, faccio semplicemente:
$ top -d 1 -b |grep <process> >>somefile
Non è una soluzione elegante, ma svolge il lavoro se si desidera che il rapido valore del greggio verifichi la propria ipotesi.
grep --line-buffered <process> >>somefile
per forzare grep ad emettere ogni riga senza buffering
sar
( System Activity Reporter ) dal pacchetto sysstat è tuo amico in questo caso.
Un altro modo sarebbe il monitoraggio combinato con dati storici, ad esempio Munin, pnp4nagios, rrdtools, ...
sar
essere focalizzato su un solo processo? per lo più sembra monitorare l'intero sistema
pidstat
comando anche dal pacchetto sysstat fornisce un'interfaccia abbastanza piacevole per riportare statistiche su un singolo processo.
Potresti provare Valgrind .
Valgrind è un framework di strumentazione per la creazione di strumenti di analisi dinamica. Esistono strumenti Valgrind in grado di rilevare automaticamente molti bug di gestione della memoria e threading e profilare i tuoi programmi in dettaglio. Puoi anche usare Valgrind per creare nuovi strumenti.
La distribuzione di Valgrind comprende attualmente sei strumenti di qualità della produzione: un rilevatore di errori di memoria , due rilevatori di errori di thread, un profiler di cache e previsione dei rami, un grafico di chiamata che genera cache e profiler di previsione dei rami e un profilatore di heap .
Mi piace la semplice risposta di Sridhar ma ho fatto il mio prima di provare la sua:
import json, psutil, datetime, time
with open('log.txt', 'w') as f:
while True:
json.dump((datetime.datetime.now().isoformat(),
psutil.Process(7274).memory_info()._asdict()), f)
f.write('\n')
f.flush()
time.sleep(1)
Fondamentalmente è utile solo se si desidera un output strutturato. Modificare 7274 come appropriato. Anche Python 3.5 si è rotto qualcosa _asdict()
, quindi usa Python 2.
Il file di output è simile a:
["2019-03-19T11:21:53.784670", {"rss": 220389376, "vms": 538984448, "shared": 15724544, "text": 303104, "lib": 0, "data": 221364224, "dirty": 0}]
["2019-03-19T11:21:54.786136", {"rss": 220438528, "vms": 539119616, "shared": 15724544, "text": 303104, "lib": 0, "data": 221499392, "dirty": 0}]
["2019-03-19T11:21:55.787555", {"rss": 220495872, "vms": 539119616, "shared": 15724544, "text": 303104, "lib": 0, "data": 221499392, "dirty": 0}]
["2019-03-19T11:21:56.788754", {"rss": 220528640, "vms": 539119616, "shared": 15724544, "text": 303104, "lib": 0, "data": 221499392, "dirty": 0}]