¿Cómo registrar el uso de memoria y CPU de una aplicación?

¿Cómo registrar el uso de memoria y CPU de una aplicación?

Similar a la pregunta¿Cómo registrar la carga de la CPU?, Me gustaría registrar la memoria de un proceso.

El proceso que quiero registrar se cancela en un servidor remoto y quiero averiguar la carga de la CPU y el uso de la memoria justo antes de que se cancele.

[actualizar]

Tanto la pequeña y ordenada escritura en Python de Stefano Palazzo como

Los valores de salida de una línea de Michał que son más pequeños que los topde CPU y Mem. ¿Tienes una idea de por qué?

salida superior:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
2312 schXX     20   0 1241m 328m  58m S  100  0.3  11:56.68 MATLAB 

generar el script en Python de Stefano Palazzo:

python memlogger.py 2312
%CPU    %MEM
76.00   0.20
76.00   0.20

Respuesta1

Puedes crear una sola línea en Shell:

logpid() { while sleep 1; do  ps -p $1 -o pcpu= -o pmem= ; done; }

para registrar el proceso con pid=123 simplemente:

logpid 123

o para ver y escribir el registro en el archivo:

logpid $$ | tee /tmp/pid.log

Si desea que se registren otros datos, modifique -o {this}las opciones. Consulte man psla sección "ESPECIFICADORES DE FORMATO ESTÁNDAR" para conocer los parámetros disponibles para usar. Si desea una resolución de tiempo diferente, cambie sleep {this}la función logpid().

Respuesta2

Si busca precisamente las topestadísticas, puede ejecutar topen modo por lotes especificando el pid del proceso que busca. Tomando el ejemplo de esta página (http://www.dedoimedo.com/computers/linux-cool-hacks.html) si escribiste

top -b -d 10 -n 3 >> top-file

Tendría "top ejecutándose en modo por lotes (-b). Se actualizará cada 10 segundos, según lo especificado por el indicador de retraso (-d), para un recuento total de 3 iteraciones (-n). Se enviará la salida a un archivo." Incluso -ppuede especificar el pidproceso que está buscando. Por supuesto, esto devolverá más que puramente CPU y RAM, pero contendrá esos campos. En mi caso, por ejemplo, obtendría lo siguiente al monitorear el pid 9189 usando top -b -d 10 -n 3 -p 9189 >> ~/top-file:

PID  USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
9189 pmj27     20   0 1617016 808112  27916 S   0.0  0.3   1:36.63 gedit

Respuesta3

Este sencillo script de Python debería hacer lo que quieras:

import time
import string
import sys
import commands

def get_cpumem(pid):
    d = [i for i in commands.getoutput("ps aux").split("\n")
        if i.split()[1] == str(pid)]
    return (float(d[0].split()[2]), float(d[0].split()[3])) if d else None

if __name__ == '__main__':
    if not len(sys.argv) == 2 or not all(i in string.digits for i in sys.argv[1]):
        print("usage: %s PID" % sys.argv[0])
        exit(2)
    print("%CPU\t%MEM")
    try:
        while True:
            x,y = get_cpumem(sys.argv[1])
            if not x:
                print("no such process")
                exit(1)
            print("%.2f\t%.2f" % (x,y))
            time.sleep(0.5)
    except KeyboardInterrupt:
        print
        exit(0)

Primero necesita averiguar la identificación del proceso del programa que desea monitorear, luego puede ejecutar el script con el PID como argumento:

python log.py 3912

Imprimirá el uso de la CPU y el uso de RAM en porcentaje dos veces por segundo:

%CPU    %MEM
0.90    0.40
1.43    0.40
8.21    0.40
...

Luego puede redirigir su salida a un archivo para importarlo a una hoja de cálculo más tarde ( python log.py 9391 > firefox_log.txt) e importar los datos a una hoja de cálculo seleccionando Tabcomo separador.

El programa se cierra cuando presiona Ctrl+C o cuando se finaliza el proceso.

Respuesta4

procpathse puede utilizar para registrar métricas de Procfs de una aplicación (árboles de procesos), incluido el uso de CPU y el tamaño del conjunto residente (RSS). Revelación completa: lo escribí.

Tomemos Firefox como ejemplo. En mi máquina su árbol de procesos se ve así:

 /usr/lib/firefox/firefox
 ├─ /usr/lib/firefox/firefox -contentproc -childID 4 ...
 ├─ /usr/lib/firefox/firefox -contentproc -childID 3 ...
 ├─ /usr/lib/firefox/firefox -contentproc -childID 2 ...
 ├─ /usr/lib/firefox/firefox -contentproc -childID 1 ...
 ├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
 ├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
 └─ /usr/lib/firefox/firefox -contentproc -childID 8 ... 

Con Procpath puede recopilar métricas de proceso de este árbol como el siguiente (y verla documentaciónSi desea preguntarle al supervisor de procesos de su aplicación, digamos systemd o Docker, el PID raíz):

procpath record -d firefox.sqlite '$..children[?(@.stat.comm == "firefox")]'

Con este comando, Procpath recopilará y registrará las métricas de Procfs de este árbol una vez cada 10 segundos. Puede dejarlo ejecutándose en un multiplexor de terminal (como Byobu) para ejecutarlo en segundo plano en su servidor.

Cuando su aplicación vuelva a fallar, puede usar este comando para visualizar el uso de la CPU y el tamaño del conjunto residente de la aplicación.

procpath plot -d firefox.sqlite -f firefox.svg -q cpu -q rss --formatter=integer

Gráfico CPU vs RSS

información relacionada