¿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

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().


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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.