2009-07-03 7 views
7

Come si controlla la memoria di picco consumata da un processo in Linux? Questo non è un programma che posso modificare internamente per misurare l'utilizzo di memoria di picco.misurazione della memoria di picco del processo a lunga esecuzione in linux

non voglio davvero misure dettagliate, né voglio loro di rallentare eccessivamente il mio programma .. così valgrind o niente pesi massimi non è quello che sto cercando ... E come gli altri posti in precedenza [Peak memory usage of a linux/unix process, tempo -v non sembra segnalare memoria per la mia macchina ...

Posso solo eseguire in alto o ps ed estrarre le stringhe di memoria consumate per id mio processo utilizzando un semplice script. Tuttavia, il mio processo viene eseguito per circa 20-30 minuti, quindi voglio essere in grado di accedere e ottenere il massimo. Posso tollerare campioni a grana grossa ... ogni 1 minuto circa ... Specificamente come faccio a-> 1. forgiare questo semplice script mem-measure in zsh? 2. uccidere quando termina il processo sotto test?

+0

http://www.serverfault.com? –

risposta

2

In realtà, quello che ho detto prima:

"""

provare

/usr/bin/time -v yourcommand 

che dovrebbe aiutare se si utilizza solo. "Tempo", bash eseguirà il built-in (che non abbia "-v")

"""

non funziona (restituisce 0).

ho fatto il seguente script Perl (che ho chiamato smaps):

#!/usr/bin/perl 
use 5.010; 
use strict; 
use warnings; 
my $max = 0; 
while(open my $f, '<', "/proc/$ARGV[0]/smaps") { 
    local $/; $_ = <$f>; 
    $max = $1 if /Rss:\s*(\d+)/ and $1 > $max; 
    open my $g, '>', '/tmp/max'; 
    say $g $max 
} 

E poi lo chiamo io (per esempio, a guardare l'utilizzo della memoria del qgit):

bash -c './smaps $$ & exec qgit' 

Usa virgolette singole quindi la shell "figlia" interpreta $$ (che sarà lo stesso PID di qgit dopo lo exec). questo risposta, ho provato :-D

HTH

+1

Uscita in 2 pezzi ... ancora non utile :( \t time Utente (secondi): 16.50 \t Ora di sistema (secondi): 0.47 \t cento della CPU questo lavoro ha ottenuto: 100% \t trascorso (orologio da parete) tempo (h: mm: ss o m: ss): 0:16.96 \t medie dimensioni testo condiviso (kbytes): 0 – badkya

+1

dimensione media dei dati non condivisa (Kbyte): 0 \t dimensione media pila (kbytes): 0 \t dimensione media totale (kbytes): 0 \t Dimensioni massime resident set (kbytes): 0 \t dimensione media dell'insieme residente (kbytes): 0 \t Maggiore (da I/O) errori di pagina: 0 \t minori (recupero frame) errori di pagina: 255315 \t contesto volontario commutatori 1211 context \t Involuntary interruttori: 1232 \t S WAP: 0 \t ingressi File system: 0 \t uscite del sistema del file: 68472 \t messaggi di socket inviati: 0 messaggi \t Socket ricevuti: 0 \t Dimensioni pagina (byte): 4096 – badkya

+1

memoria campi di utilizzo non cambiano anche se io eseguirlo più a lungo ... – badkya

6

Basta usare top -n per iterare un determinato numero di volte e -d per ritardare tra gli aggiornamenti. Inoltre si può afferrare solo l'uscita rilevanti per il processo grep suo PID, come:

top -n 30 -d 60 | grep <process-id> 

Leggere la pagina di manuale all'inizio Per ulteriori informazioni

man top 

Naturalmente, è anche possibile afferrare la colonna bisogno di usare awk.

1

/proc/pid/smaps, come/proc/pid/maps, fornisce solo informazioni sui mapping della memoria virtuale, non sull'utilizzo effettivo della memoria fisica. top e ps danno l'RSS, che (a seconda di cosa vuoi sapere) potrebbe non essere un buon indicatore dell'uso della memoria.

Una buona scommessa, se si sta utilizzando un kernel Linux successivo alla 2.6.28.7, è di usare la funzione Pagemap. C'è una discussione su questo e sull'origine di alcuni strumenti allo www.eqware.net/Articles/CapturingProcessMemoryUsageUnderLinux.

Lo strumento di raccolta delle pagine ha lo scopo di catturare l'utilizzo della memoria di TUTTI i processi e quindi probabilmente impone un carico di CPU maggiore di quello che si desidera. Dovresti essere facilmente in grado di modificarlo, tuttavia, in modo da catturare i dati solo per un ID processo specifico. Ciò ridurrebbe il sovraccarico in modo tale da poterlo eseguire facilmente ogni pochi secondi. Non l'ho provato, ma penso che lo strumento di analisi della pagina debba funzionare senza modifiche.

EQvan

2

Valgrind con massif non dovrebbe essere troppo pesante, ma, mi consiglia di utilizzare/proc. Puoi facilmente scrivere il tuo script di monitoraggio. Ecco il mio, per comodità:

#!/bin/bash 

ppid=$$ 
maxmem=0 

[email protected] & 
pid=`pgrep -P ${ppid} -n -f $1` # $! may work here but not later 
while [[ ${pid} -ne "" ]]; do 
    #mem=`ps v | grep "^[ ]*${pid}" | awk '{print $8}'` 
     #the previous does not work with MPI 
     mem=`cat /proc/${pid}/status | grep VmRSS | awk '{print $2}'` 
    if [[ ${mem} -gt ${maxmem} ]]; then 
     maxmem=${mem} 
    fi 
    sleep 1 
    savedpid=${pid} 
    pid=`pgrep -P ${ppid} -n -f $1` 
done 
wait ${savedpid} # don't wait, job is finished 
exitstatus=$? # catch the exit status of wait, the same of [email protected] 
echo -e "Memory usage for [email protected] is: ${maxmem} KB. Exit status: ${exitstatus}\n" 
1

Dipende dal tipo di memoria che si desidera monitorare.

Il monitoraggio del seguente M.a.p.d tramite l'ordinamento del numero di tutto il processo (non di tutti i thread) consente di monitorare la memoria fisica malloc utilizzata da ciascun processo.

È possibile scrivere un programma c per renderlo ancora più veloce, ma ho pensato che awk fosse la scelta minima per questo scopo.

  • Ma anonima mappata la memoria
    • .p privato
      • .d sporca == malloc/heap e stack mmapped assegnati e scritti di memoria
      • .c pulita == malloc/mucchio mmapped e impilare la memoria una volta allocata, scritta, poi liberata, ma non ancora recuperata
    • .s condiviso
      • .d sporco == ci dovrebbe essere nessuno
      • .c pulita == ci dovrebbe essere nessuno
  • Mn chiamato memoria mappata
    • .p privato
      • .d dirty == file memoria stampata mmapped private
      • .c == pulite mappato testo del programma/biblioteca privata mappati
    • .s condivisi
      • .d di file == sporco mmapped memoria scritta condivisa
      • .c == Clean Text biblioteca mappata condivisa mappata

io preferirei per ottenere i numeri come segue per ottenere i numeri reali in almeno in testa.
Devi riassumerle per dividere ciò che ps mostra come RSS e ottenere numeri più precisi da non confondere.

MAPD:

awk '/^[0-9a-f]/{if ($6=="") {anon=1}else{anon=0}} /Private_Dirty/{if(anon) {asum+=$2}else{nasum+=$2}} END{printf "sum=%d\n",asum}' /proc/<pid>/smaps 

MAPC:

awk '/^[0-9a-f]/{if ($6=="") {anon=1}else{anon=0}} /Private_Clean/{if(anon) {asum+=$2}else{nasum+=$2}} END{printf "sum=%d\n",asum}' /proc/<pid>/smaps 

Mnpd: ... e così via

1

metriche di memoria accurate possono essere dati da interfaccia del kernel PageMap - utilizzato nella libreria libpagemap https://fedorahosted.org/libpagemap/. La libreria fornisce anche utilità per lo spazio utente in modo da poter avviare immediatamente la memoria del monitor.

1

un'alternativa migliore per misurare l'uso di picco/acqua alta RSS memoria è lo strumento cgmemtime disponibile qui:

https://github.com/gsauthof/cgmemtime

E 'facile da usare come /usr/bin/tempo e senza il rallentamento da Il massiccio di Valgrind. Inoltre, si basa su un kernel cgroups, quindi è ancora più accurato di altri metodi di polling.

Problemi correlati