procpath

procpath

Me gustaría monitorear el uso de memoria/CPU de un proceso en tiempo real. Similar toppero dirigido a un solo proceso, preferiblemente con algún tipo de gráfico histórico.

Respuesta1

En Linux, topen 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):

RSS UPC

psregistro

las siguientes direccionesgráfico histórico de algún tipo. PitónpsrecordEl 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'

Los gráficos se ven así: ejemplo de psrecord

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-tkexplorador de gráficos basado en Tkinter (puede ser necesario) que se puede exportar:

mprof

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 ypsutilystatsdcliente.procmon.pyproporciona 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:

gráfico de grafana

pila de grafito y telégrafo

En lugar de que el script Python envíe las métricas a Statsd,telegraf(y procstatel complemento de entrada) se pueden utilizar para enviar las métricas a Graphite directamente.

La configuración mínima telegrafse 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 sysstatpaquete) 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

htopes 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é topde 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 pscomando no devolverá "éxito" y el whileciclo 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
  ....

información relacionada