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

16

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

El proceso que deseo iniciar sesión se elimina en un servidor remoto y quiero averiguar la carga de la CPU y el uso de memoria justo antes de que se elimine.

[actualizar]

Tanto el pequeño script de Python de Stefano Palazzo como el

Los valores de salida de una línea de Michał son más pequeños que en topCPU y Mem. ¿Tienes 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 

salida del script de Python de Stefano Palazzo:

python memlogger.py 2312
%CPU    %MEM
76.00   0.20
76.00   0.20
Framester
fuente
Lamentablemente no puedo comentar aquí todavía, pero es posible que esta publicación de interés explique por qué pspuede diferir de top: stackoverflow.com/questions/131303/…
PM

Respuestas:

16

Puede crear una línea en el shell:

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

para registrar el proceso con pid = 123 solo:

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 las -o {this}opciones. Consulte la man pssecció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}de función logpid().

Michał Šrajer
fuente
Simple y hace el trabajo!
rafaelbattesti
3

Si está exactamente después de las topestadísticas, puede ejecutar topen modo por lotes especificando el pid del proceso que está buscando. Tomando el ejemplo de esta página ( http://www.dedoimedo.com/computers/linux-cool-hacks.html ) si escribió

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

Tendría "ejecución superior 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). La salida se enviará a un archivo ". Incluyendo -ppuede especificar el pidproceso que está buscando. Por supuesto, esto devolverá más que puramente CPU y RAM, pero contendrá estos campos. En mi caso, por ejemplo, obtendría lo siguiente al monitorear 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
PM
fuente
Esta página, aunque no redirige a un archivo, lleva a cabo algunas modificaciones más sofisticadas que le permiten obtener solo la CPU impresa. Si alguien conoce una buena manera de redirigir la salida a un archivo y hacer que se actualice periódicamente, me interesaría saberlo. watchNo me parece ideal para esto: superuser.com/questions/281347/filtering-top-command-output
PM
2

Este simple 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 debe encontrar 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 memoria 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 luego importarlo a una hoja de cálculo ( python log.py 9391 > firefox_log.txt) e importar los datos a una hoja de cálculo seleccionando Tabcomo su separador.

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

Stefano Palazzo
fuente
Estimado Stefano, muchas gracias por tu guión. Desafortunadamente, parece dar resultados incorrectos. ¿Tienes alguna idea de por qué? Por favor vea mi pregunta actualizada.
Framester
Desde la página man de ps man7.org/linux/man-pages/man1/ps.1.html , ps genera el "tiempo de CPU utilizado dividido por el tiempo que el proceso ha estado funcionando (relación cputime / tiempo real), expresado como un porcentaje "- para obtener un promedio del uso de la CPU desde que comenzó
Nicolas Charles