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 top
de 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 ps
la 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 top
estadísticas, puede ejecutar top
en 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 -p
puede especificar el pid
proceso 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 Tab
como 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