Ho trovato che pidstat
sarebbe un buon strumento per monitorare i processi. Voglio calcolare l'utilizzo medio della memoria di un particolare processo. Ecco alcuni esempi di output:
02:34:36 PM PID minflt/s majflt/s VSZ RSS %MEM Command
02:34:37 PM 7276 2.00 0.00 349212 210176 7.14 scalpel
(Questo fa parte dell'output di pidstat -r -p 7276
.)
Devo utilizzare le informazioni Resident Set Size (RSS) o Virtual Size (VSZ) per calcolare il consumo medio di memoria? Ho letto alcune cose su Wikipedia e sui forum ma non sono sicuro di capire appieno le differenze. Inoltre, sembra che nessuno di loro sia affidabile. Quindi, come posso monitorare un processo per ottenere il suo utilizzo di memoria?
Qualsiasi aiuto su questo argomento sarebbe utile.
Risposta accettata:
RSS è la quantità di memoria che questo processo ha attualmente nella memoria principale (RAM). VSZ è la quantità di memoria virtuale che il processo ha in totale. Ciò include tutti i tipi di memoria, sia nella RAM che in swap. Questi numeri possono essere distorti perché includono anche librerie condivise e altri tipi di memoria. Puoi avere cinquecento istanze di bash
in esecuzione e la dimensione totale della loro impronta di memoria non sarà la somma dei loro valori RSS o VSZ.
Se hai bisogno di avere un'idea più dettagliata dell'impronta di memoria di un processo, hai alcune opzioni. Puoi passare da /proc/$PID/map
ed elimina le cose che non ti piacciono. Se si tratta di librerie condivise, il calcolo potrebbe diventare complesso a seconda delle tue esigenze (che penso di ricordare).
Se ti interessa solo la dimensione dell'heap del processo, puoi sempre analizzare il [heap]
voce nella map
file. La dimensione che il kernel ha allocato per l'heap del processo può riflettere o meno il numero esatto di byte che il processo ha chiesto da assegnare. Ci sono dettagli minuziosi, interni del kernel e ottimizzazioni che possono sbarazzarsi di questo. In un mondo ideale, sarà quanto necessario al tuo processo, arrotondato per eccesso al multiplo più vicino della dimensione della pagina di sistema (getconf PAGESIZE
ti dirà di cosa si tratta:sui PC, è probabilmente 4.096 byte).
Se vuoi vedere quanta memoria ha allocata un processo , uno dei modi migliori è rinunciare alle metriche lato kernel. Invece, si strumentano le funzioni di (de)allocazione della memoria heap della libreria C con il LD_PRELOAD
meccanismo. Personalmente, abuso leggermente di valgrind
per avere informazioni su questo genere di cose. (Si noti che l'applicazione della strumentazione richiederà il riavvio del processo.)
Nota, poiché potresti anche eseguire il benchmarking dei runtime, che valgrind
renderà i tuoi programmi leggermente più lenti (ma probabilmente entro le tue tolleranze).