
Me gustaría monitorear el uso de memoria/CPU de un proceso en tiempo real. Similar top
pero dirigido a un solo proceso, preferiblemente con algún tipo de gráfico histórico.
Respuesta1
En Linux, top
en realidad admite centrarse en un solo proceso, aunque, naturalmente, no tiene un gráfico histórico:
top -p PID
Esto también está disponible en Mac OS X con una sintaxis diferente:
top -pid PID
Respuesta2
procpath
Actualización 2020 (solo Linux/procfs). Volviendo al problema del análisis de procesos con suficiente frecuencia y no estando satisfecho con las soluciones que describí originalmente a continuación, decidí escribirmío. Es un paquete CLI de Python puro que incluye un par de dependencias (sin Matplotlib pesado), puede potencialmente trazar muchas métricas de procfs, consultas JSONPath al árbol de procesos, tiene diezmado/agregación básica (Ramer-Douglas-Peucker y promedio móvil), filtrado por rangos de tiempo y PID, y un par de cosas más.
pip3 install --user procpath
Aquí hay un ejemplo con Firefox. Esto registra todos los procesos con "firefox" en su cmdline
(la consulta mediante un PID se vería así '$..children[?(@.stat.pid == 42)]'
) 120 veces una vez por segundo.
procpath record -i 1 -r 120 -d ff.sqlite '$..children[?("firefox" in @.cmdline)]'
Trazar el uso de RSS y CPU de un solo proceso (o varios) de todos los registrados se vería así:
procpath plot -d ff.sqlite -q cpu -p 123 -f cpu.svg
procpath plot -d ff.sqlite -q rss -p 123 -f rss.svg
Los gráficos se ven así (en realidad son SVG de Pygal interactivos):
psregistro
las siguientes direccionesgráfico histórico de algún tipo. Pitónpsrecord
El paquete hace exactamente esto.
pip install psrecord # local user install
sudo apt-get install python-matplotlib python-tk # for plotting; or via pip
Para un solo proceso, es el siguiente (detenido por Ctrl+C):
psrecord $(pgrep proc-name1) --interval 1 --plot plot1.png
Para varios procesos, el siguiente script es útil para sincronizar los gráficos:
#!/bin/bash
psrecord $(pgrep proc-name1) --interval 1 --duration 60 --plot plot1.png &
P1=$!
psrecord $(pgrep proc-name2) --interval 1 --duration 60 --plot plot2.png &
P2=$!
wait $P1 $P2
echo 'Done'
perfil_memoria
Elpaqueteproporciona muestreo solo RSS (además de algunas opciones específicas de Python). También puede registrar procesos con sus procesos secundarios (ver mprof --help
).
pip install memory_profiler
mprof run /path/to/executable
mprof plot
De forma predeterminada, aparece un python-tk
explorador de gráficos basado en Tkinter (puede ser necesario) que se puede exportar:
pila de grafito y estadísticas
Puede parecer excesivo para una prueba simple y única, pero para algo así como una depuración de varios días es, sin duda, razonable. Un práctico todo en unoraintank/graphite-stack
(de los autores de Grafana) imagen ypsutil
ystatsd
cliente.procmon.py
proporciona una implementación.
$ docker run --rm -p 8080:3000 -p 8125:8125/udp raintank/graphite-stack
Luego en otra terminal, después de iniciar el proceso de destino:
$ sudo apt-get install python-statsd python-psutil # or via pip
$ python procmon.py -s localhost -f chromium -r 'chromium.*'
Luego, abriendo Grafana en http://localhost:8080, autenticación como admin:admin
, configurando la fuente de datos https://localhost, puede trazar un gráfico como:
pila de grafito y telégrafo
En lugar de que el script Python envíe las métricas a Statsd,telegraf
(y procstat
el complemento de entrada) se pueden utilizar para enviar las métricas a Graphite directamente.
La configuración mínima telegraf
se parece a:
[agent]
interval = "1s"
[[outputs.graphite]]
servers = ["localhost:2003"]
prefix = "testprfx"
[[inputs.procstat]]
pid_file = "/path/to/file/with.pid"
Luego ejecute la línea telegraf --config minconf.conf
. La parte de Grafana es la misma, excepto los nombres de las métricas.
pidstat
pidstat
(parte del sysstat
paquete) puede producir resultados que se pueden analizar fácilmente. Es útil en caso de que necesite métricas adicionales de los procesos, por ejemplo, los 3 grupos más útiles (CPU, memoria y disco) contienen: %usr
, %system
, %guest
, %CPU
, minflt/s
, majflt/s
, VSZ
, RSS
, %MEM
, kB_rd/s
, kB_wr/s
, kB_ccwr/s
. Lo describí enuna respuesta relacionada.
Respuesta3
htop
es un gran reemplazo para top
. Tiene… ¡Colores! ¡Atajos de teclado simples! ¡Desplácese por la lista usando las teclas de flecha! ¡Mata un proceso sin salir y sin tomar nota del PID! ¡Marque múltiples procesos y mátelos a todos!
Entre todas las funciones, la página de manual dice que puede presionar Fparaseguirun proceso.
De verdad, deberías intentarlo htop
. Nunca comencé top
de nuevo, después de la primera vez que usé htop
.
Mostrar un solo proceso:
htop -p PID
Respuesta4
Llegué un poco tarde pero compartiré mi truco de línea de comando usando solo el valor predeterminadops
WATCHED_PID=$({ command_to_profile >log.stdout 2>log.stderr & } && echo $!);
while ps -p $WATCHED_PID --no-headers --format "etime pid %cpu %mem rss"; do
sleep 1
done
Utilizo esto como una sola línea. Aquí la primera línea activa el comando y almacena el PID en la variable. Luego ps imprimirá el tiempo transcurrido, el PID, el porcentaje de uso de CPU, el porcentaje de memoria y la memoria RSS. También puedes agregar otros campos.
Tan pronto como finalice el proceso, el ps
comando no devolverá "éxito" y el while
ciclo finalizará.
Puede ignorar la primera línea si el PID que desea perfilar ya se está ejecutando. Simplemente coloque la identificación deseada en la variable.
Obtendrás un resultado como este:
00:00 7805 0.0 0.0 2784
00:01 7805 99.0 0.8 63876
00:02 7805 99.5 1.3 104532
00:03 7805 100 1.6 129876
00:04 7805 100 2.1 170796
00:05 7805 100 2.9 234984
00:06 7805 100 3.7 297552
00:07 7805 100 4.0 319464
00:08 7805 100 4.2 337680
00:09 7805 100 4.5 358800
00:10 7805 100 4.7 371736
....