Cómo medir en Linux el pico de memoria de una aplicación una vez que ha finalizado

11

¿Cómo mido la memoria máxima de una aplicación que se ejecuta en Linux?

Ejecuto esta aplicación en lote, por lo que no puedo usar RSS, ya que informa la memoria actual. Necesito que la memoria máxima que la aplicación ha utilizado se informe al final.

El VmPeak tampoco es una solución, ya que informa la memoria asignada y tampoco calcula a partir del Ram real sino también del disco duro.

des_user
fuente
¿En qué sistema operativo está ejecutando la aplicación?
un CVn
Estoy trabajando en Linux
des_user
Este hilo debería serle de ayuda: serverfault.com/questions/387268/…
Jacob Coleman

Respuestas:

13

Aquí hay 2 métodos para rastrear el uso máximo de memoria de un proceso.

Almibarado

No he usado esta herramienta, pero suena como lo que estás buscando. Se llama jarabe .

Descripción

Syrupy es un script de Python que regularmente toma instantáneas de la memoria y la carga de la CPU de uno o más procesos en ejecución, a fin de construir dinámicamente un perfil de su uso de los recursos del sistema.

Ejemplo

$ 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í, irónicamente, el comando de tiempo GNU puede darle el uso máximo de memoria de un proceso. Informa el pico de memoria de esta manera:Maximum resident set size (kbytes) .

Ejemplo

$ /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

Referencias

slm
fuente
3

Aunque el tema es bastante antiguo, quiero compartir otro proyecto que surgió de la función del núcleo cgroups Linux.

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

cgmemtime mide el uso de memoria RSS + CACHE en aguas altas de un proceso y sus procesos descendientes.

Para poder hacerlo, coloca el proceso en su propio cgroup.

Por ejemplo, el proceso A asigna 10 MiB y bifurca a un niño B que asigna 20 MiB y que bifurca a un niño C que asigna 30 MiB. Los tres procesos comparten una ventana de tiempo donde sus asignaciones dan como resultado el uso de memoria RSS (tamaño de conjunto residente) correspondiente.

La pregunta ahora es: ¿Cuánta memoria se usa realmente como resultado de ejecutar A?

Respuesta: 60 MiB

cgmemtime es la herramienta para responder a esas preguntas.

Los ejemplos de uso serían:

$ 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
Vlad Frolov
fuente
Entonces, ¿cómo podría usarse esta herramienta para informar el uso máximo de RAM de un programa después de que ese programa haya salido ?
terdon
@terdon Se utiliza wait4para capturar la salida del proceso en combinación con cgroups ( memory.max_usage_in_bytes), lo que parece tener sentido. Más detalles están disponibles en el archivo README en github.
Vlad Frolov
Gracias, pero mi punto fue más sobre tu respuesta. Tal como está, no responde la pregunta, solo apunta a algún recurso externo que podría ser capaz de hacerlo. Además, ha publicado exactamente la misma respuesta en otro lugar que levanta una bandera automática. Edite su respuesta e incluya un ejemplo que muestre cómo este programa puede hacer lo que pide el OP.
terdon
2
@terdon ¡Sí, lo hice! Porque he buscado la misma pregunta y las preguntas son más o menos las mismas, y las respuestas son todas iguales: 'analizar ps output', ¡lo cual es una locura! Pasé una semana antes de chocar accidentalmente con el proyecto cgmemtime, que es la combinación perfecta para todas esas preguntas, ¡sobre las que he comentado!
Vlad Frolov
1
Lo suficientemente justo. Sería genial si pudieras dar un ejemplo de cómo podría usarse. Mejoraría tu respuesta. En cualquier caso, gracias por tomarse el tiempo para publicar esto, estoy seguro de que otros lo encontrarán útil.
terdon