Come misurare su Linux la memoria di picco di un'applicazione dopo che è terminata


11

Come misuro la memoria di picco di un'applicazione in esecuzione su Linux?

Eseguo questa app in batch quindi non posso usare RSS da allora, riporta la memoria corrente. Ho bisogno della memoria di picco che l'applicazione ha usato per essere segnalata alla fine.

VmPeak non è nemmeno una soluzione, poiché riporta la memoria allocata e non calcola nemmeno dalla RAM reale ma anche dal disco rigido.


Su quale sistema operativo stai eseguendo l'applicazione?
un CVn del

Sto lavorando su Linux
des_user

Questo thread dovrebbe esserti di aiuto: serverfault.com/questions/387268/…
Jacob Coleman,

Risposte:


13

Ecco 2 metodi per tenere traccia dell'utilizzo della memoria di picco di un processo.

Sciropposo

Non ho usato questo strumento ma sembra quello che stai cercando. Si chiama Syrupy .

Descrizione

Syrupy è uno script Python che esegue regolarmente istantanee della memoria e del carico della CPU di uno o più processi in esecuzione, in modo da creare dinamicamente un profilo del loro utilizzo delle risorse di sistema.

Esempio

$ syrupy.py myprog

  PID DATE        TIME     ELAPSED  CPU   MEM    RSS   VSIZE
14634 2008-10-10  20:45:25   00:00  0.0   0.0   2996    6680
14634 2008-10-10  20:45:26   00:01  105   0.2   7804   12592
14634 2008-10-10  20:45:27   00:02  103   0.2   8996   13776
14634 2008-10-10  20:45:28   00:03  103   0.2  10468   15348
14634 2008-10-10  20:45:29   00:04  103   0.3  11412   16396
14634 2008-10-10  20:45:30   00:05  104   0.3  12492   17444

/usr/bin/time -v

Sì, ironicamente, il comando GNU time può darti il ​​massimo utilizzo della memoria di un processo. Si riporta la memoria di picco in questo modo: Maximum resident set size (kbytes).

Esempio

$ /usr/bin/time -v ~/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000
...

    Command being timed: "/home/saml/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000"
    User time (seconds): 1.12
    System time (seconds): 0.05
    Percent of CPU this job got: 54%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.19
    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): 79304
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 20014
    Voluntary context switches: 83
    Involuntary context switches: 274
    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

Riferimenti


3

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.

Esempi di utilizzo sarebbero:

$ sudo ./cgmemtime --setup -g <myusergroup> --perm 775

$ ./cgmemtime ./testa x 10 20 30
Parent PID is 27189
Allocating 10 MiBs
New Child: 27193
Allocating 20 MiBs
New Child: 27194
Allocating 30 MiBs
Child user:    0.000 s
Child sys :    0.005 s
Child wall:    6.006 s
Child high-water RSS                    :      11648 KiB
Recursive and acc. high-water RSS+CACHE :      61840 KiB

$ ./cgmemtime python -c 'print range(100000)[48517]'
48517
Child user:    0.014 s
Child sys :    0.014 s
Child wall:    0.029 s
Child high-water RSS                    :       9948 KiB
Recursive and acc. high-water RSS+CACHE :       5724 KiB

Quindi, come potrebbe essere utilizzato questo strumento per segnalare il picco di utilizzo della RAM di un programma dopo che quel programma è uscito ?
terdon

@terdon Usa wait4per catturare l'uscita del processo in una combinazione con cgroups ( memory.max_usage_in_bytes), che sembra avere senso. Maggiori dettagli sono disponibili nel README su github.
Vlad Frolov,

Grazie, ma il mio punto era più sulla tua risposta. Allo stato attuale, non risponde alla domanda, ma indica solo alcune risorse esterne che potrebbero essere in grado di fare. Inoltre, hai pubblicato la stessa risposta altrove che genera un flag automatico. Modifica la tua risposta e includi un esempio che mostri come questo programma può fare ciò che l'OP chiede.
terdon

2
@terdon Sì, l'ho fatto! Perché ho cercato la stessa domanda e le domande sono praticamente le stesse, e le risposte sono tutte uguali: 'parse ps output', che è pazzo! Ho trascorso una settimana prima di imbattermi accidentalmente nel progetto cgmemtime, che è la corrispondenza perfetta per tutte quelle domande che ho commentato!
Vlad Frolov,

1
Giusto. Sarebbe fantastico se tu potessi dare un esempio di come potrebbe essere usato. Migliorerebbe la tua risposta. In ogni caso, grazie per aver dedicato del tempo a pubblicare questo, sono sicuro che altri lo troveranno utile.
terdon
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.