Misurare l'utilizzo della RAM di un programma


46

time è un comando brillante se vuoi capire quanto tempo CPU impiega un dato comando.

Sto cercando qualcosa di simile in grado di misurare l'utilizzo massimo di RAM del programma e di tutti i bambini. Preferibilmente dovrebbe distinguere tra memoria allocata che è stata utilizzata e non utilizzata. Forse potrebbe anche dare l'uso della memoria mediana (quindi l'uso della memoria che dovresti aspettarti quando esegui per molto tempo).

Quindi vorrei fare:

rammeassure my_program my_args

e ottieni un output simile a:

Max memory allocated: 10233303 Bytes
Max memory used: 7233303 Bytes
Median memory allocation: 5233303 Bytes

Ho visto memusg https://gist.github.com/526585/590293d6527c91e48fcb08edb8de9fd6c88a6d82 ma lo considero un po 'un trucco.

Risposte:


24

È possibile utilizzare tstime per misurare l'utilizzo della memoria in acqua alta (RSS e virtuale) di un processo.

Per esempio:

$ tstime date       
Tue Aug 16 21:35:02 CEST 2011

Exit status: 0

pid: 31169 (date) started: Tue Aug 16 21:35:02 2011
        real   0.017 s, user   0.000 s, sys   0.000s
        rss      888 kb, vm     9764 kb

Supporta anche una modalità di output ( -t) più facile da analizzare .


Mi piace. Ha anche fatto la cosa giusta con./tstime -t bash -c 'perl -e "\$a=\"x\"x100000000;\$b=\$a.\$a;\$b=\"\";\$a=\"\";sleep 10;"'
Ole Tange,

3
"Utilizzo della RAM da parte del processo" non è un valore ben definito: se sono in esecuzione più istanze dello stesso programma, condividono l'eseguibile. La maggior parte dei programmi condivide glibc(e altre librerie assortite, sono chiamate "condivise" per qualcosa). Molti demoni caricano la configurazione in memoria e fork (2) figli, che quindi condividono i dati di configurazione. Quindi ci sono dati nei buffer readahead / writebehind gestiti dal kernel. E poi ci sono servizi che sono un branco di processi vagamente accoppiati (pensa al tuo ambiente desktop e a tutte le sue applet e roba di sfondo).
vonbrand,

@vonbrand, il modo in cui il kernel Linux calcola i valori RSS / VSS è ben definito.
maxschlepzig,

@maxschlepzig, potrebbe anche calcolare alcuni valori casuali, ciò non significa che significino ciò che pensi che significano: il set residente è solo le pagine nello spazio degli indirizzi del processo che sono attualmente in memoria. Questa non è la "memoria utilizzata da questo processo", include tutto ciò che sta condividendo.
vonbrand,

@vonbrand La maggior parte dei casi di misurazione dell'utilizzo della memoria di un processo vorranno misurare pagine anonime non condivise, che dovrebbero essere molto prevedibili con lo stesso input.
Vladimir Panteleev,

28

timeè integrato nella tua shell. Se ti piace timema hai bisogno di maggiori informazioni, prova GNU timein -vmodalità verbose ( ):

/usr/bin/time -v sleep 5               
    Command being timed: "sleep 5"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:05.00
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 2144
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 179
    Voluntary context switches: 2
    Involuntary context switches: 1
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

Cerca il pacchetto "time" o "gnutime" nel gestore dei pacchetti.


3
Si noti che alcune informazioni riportate dal tempo GNU potrebbero essere inaccurate. Ad esempio, in Ubuntu 10.04: la pagina man indica "I numeri sono buoni solo quelli restituiti da wait3 (2)". Vale a dire wait3riempie una struttura che è descritta in getrusage(2): 'Non tutti i campi sono significativi sotto Linux. [..]'.
maxschlepzig,

4
Ad esempio, su un programma di test che alloca esattamente 10 MB (e tocca ogni pagina) - il tempo GNU riporta un maxRSS di 42608 KiB - e tstimeriporta 10652 KiB. Ancora sotto Ubuntu 10.04.
maxschlepzig,

Mi sarebbe piaciuto se fosse così semplice. Sulla mia macchina Ubuntu ho provato: /usr/bin/time -v perl -e '$a="x"x100000000;$b=$a.$a;sleep 10;'. top dice che ci vogliono circa 570 MB, ma il tempo dice 2,3 GB. In pratica quel numero non è utilizzabile per me.
Ole Tange,

Il fattore 4 è fissato nel tempo GNU 1.7 e quindi funziona come previsto.
Ole Tange,

Nota importante: la "Dimensione massima del set di residenti" funziona solo da Linux 2.6.32.
Jan Hudec,

17

Forse eccessivo, ma ho appena scoperto che valgrindha un bel strumento chiamato massif. L'ho provato su xterm:

valgrind --trace-children=yes --tool=massif xterm
ms_print massif.out.* | less

E ottieni un bel grafico sull'utilizzo della memoria:

    MB
4.230^                     #                    :::::::  :::      @@:     ::: 
     |   @                 #:::@::@@:::::@::::::: :: : ::: :::::::@ ::::::: ::
     |   @               ::#:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::::@@:::::::::: #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
   0 +----------------------------------------------------------------------->Mi
     0                                                                   292.4

insieme a informazioni sull'utilizzo della memoria eccessivamente dettagliate. Dettagli nel manuale di valgrind .

I programmi funzioneranno circa 20 volte più lentamente. Inoltre, ho eseguito alcuni comandi all'interno di xterm. La loro impronta di memoria è stata presa in considerazione perché --trace-children=yesl'opzione è lì!


1
La penalità di velocità 20x lo rende inadatto alla mia situazione. Altrimenti grafico molto carino!
Ole Tange,

1
Sembra che, almeno nella versione 3.8.1 di valgrind che sto usando, i booleani siano accettati solo nella forma "sì / no" e non "vero / falso". Mi sono lamentato! :-)
MakisH

6

Anche se l'argomento è piuttosto vecchio, voglio condividere un altro progetto che è emerso dalla funzionalità del kernel Linux cgroups.

https://github.com/gsauthof/cgmemtime :

cgmemtime misura l'utilizzo della memoria RSS + CACHE per acque alte di un processo e dei suoi processi discendenti.

Per poterlo fare, inserisce il processo nel proprio cgroup.

Ad esempio, il processo A alloca 10 MiB e genera un figlio B che alloca 20 MiB e genera un figlio C che alloca 30 MiB. Tutti e tre i processi condividono una finestra temporale in cui le loro allocazioni determinano l'utilizzo della memoria RSS (resident set size) corrispondente.

La domanda ora è: quanta memoria viene effettivamente utilizzata come risultato dell'esecuzione di A?

Risposta: 60 MiB

cgmemtime è lo strumento per rispondere a tali domande.


3

Sembra che tstime non funzioni più con non root in Linux> = 3.0. Ecco un'utilità di polling che ho scritto per risolvere il problema: https://github.com/jhclark/memusg/blob/master/memusg


/usr/bin/time -vfornisce l'output corretto nelle versioni più recenti. Nelle versioni precedenti devi solo dividere per 4 per ottenere la quantità corretta.
Ole Tange,

Tuttavia, non credo che il tempo -v supporti la dimensione di picco della memoria virtuale (solo RSS). Qualcuno può confermarlo sull'ultima versione?
jhclark,
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.