it-swarm-es.tech

¿Cómo monitorear el uso de CPU / memoria de un solo proceso?

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

194
Josh K

En Linux, top en realidad admite centrarse en un solo proceso, aunque naturalmente no tiene un gráfico de historial:

top -p PID

Esto también está disponible en Mac OS X con una sintaxis diferente:

top -pid PID
157
Michael Mrozek

psrecord

Las siguientes direcciones gráfico de historia de algún tipo . Python psrecord 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í: psrecord example

memory_profiler

paquete proporciona un muestreo solo de RSS (además de algunas opciones específicas de Python). También puede grabar procesos con sus procesos hijos (ver mprof --help).

pip install memory_profiler
mprof run /path/to/executable
mprof plot

De forma predeterminada, aparece una ventana basada en Tkinter (python-tk puede ser necesario) chart Explorer que se puede exportar:

mprof

grafito-stack & statsd

Puede parecer una exageración para una prueba simple, pero para algo como una depuración de varios días es, sin duda, razonable. Un práctico todo en uno raintank/graphite-stack (de los autores de Grafana) imagen y psutil y statsd 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: 808 , autenticación como admin:admin, configurando el origen de datos https: // localhost , puede trazar un gráfico como:

grafana chart

grafito-pila y telegraf

En lugar de Python script enviando las métricas a Statsd, telegraf (y procstat plugin de entrada) puede usarse para enviar las métricas Grafito directamente.

La configuración mínima de telegraf se ve así:

[agent]
  interval = "1s"

[[outputs.graphite]]
  servers = ["localhost:2003"]
  prefix = "testprfx"

[[inputs.procstat]]
  pid_file = "/path/to/file/with.pid"

Luego corre la línea telegraf --config minconf.conf. La parte de Grafana es la misma, excepto los nombres de métricas.

pidstat

pidstat (parte del paquete sysstat) puede producir resultados que se pueden analizar fácilmente. Es útil en caso de que necesite métricas adicionales de los procesos, p. Ej. 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í en na respuesta relacionada .

87
saaj

htop es un gran reemplazo para top. Tiene ... colores! Atajos de teclado simples! ¡Desplácese por la lista con las teclas de flecha! ¡Mata un proceso sin salir y sin tomar nota del PID! ¡Marca múltiples procesos y mátalos a todos!

Entre todas las funciones, la página de manual dice que puede presionar F para seguir un proceso.

Realmente, deberías probar htop. Nunca comencé top nuevamente, después de la primera vez que usé htop.

Mostrar un solo proceso:

htop -p PID

67
Denilson Sá Maia

Para usar esa información en un script, puede hacer esto:

calcPercCpu.sh

#!/bin/bash
nPid=$1;
nTimes=10; # customize it
delay=0.1; # customize it
strCalc=`top -d $delay -b -n $nTimes -p $nPid \
  |grep $nPid \
  |sed -r -e "s;\s\s*; ;g" -e "s;^ *;;" \
  |cut -d' ' -f9 \
  |tr '\n' '+' \
  |sed -r -e "s;(.*)[+]$;\1;" -e "s/.*/scale=2;(&)\/$nTimes/"`;
nPercCpu=`echo "$strCalc" |bc -l`
echo $nPercCpu

usar como: calcPercCpu.sh 1234 donde 1234 es el pid

Para el $ nPid especificado, medirá el promedio de 10 instantáneas del uso de la CPU en un total de 1 segundo (retraso de 0.1s cada una * nTimes = 10); eso proporciona un resultado bueno y rápido y preciso de lo que está sucediendo en el mismo momento.

Ajusta las variables a tus necesidades.

8
Aquarius Power

Normalmente uso los siguientes dos:

  1. HP caliper : es una muy buena herramienta para monitorear procesos, también puede verificar el gráfico de llamadas y otra información de bajo nivel. Pero tenga en cuenta que es gratis solo para uso personal.

  2. daemontools : una colección de herramientas para administrar servicios UNIX

5
Hemant

Usando top y awk se podría crear fácilmente, p. un registro separado por comas de% CPU ($9) +% MEM ($10) uso que luego se puede alimentar a cualquier herramienta de estadísticas y gráficos.

top -b -d $delay -p $pid | awk -v OFS="," '$1+0>0 {
print strftime("%Y-%m-%d %H:%M:%S"),$1,$NF,$9,$10; fflush() }'

La salida será como

2019-03-26 17:43:47,2991,firefox,13.0,5.2
2019-03-26 17:43:48,2991,firefox,4.0,5.2
2019-03-26 17:43:49,2991,firefox,64.0,5.3
2019-03-26 17:43:50,2991,firefox,71.3,5.4
2019-03-26 17:43:51,2991,firefox,67.0,5.4

Esto no dará buenos resultados para grandes $delay, sin embargo, porque la marca de tiempo impresa es en realidad $delay atrás debido a cómo funciona la salida de top. Sin entrar en demasiados detalles, una forma simple de evitar esto es registrar el tiempo proporcionado por top:

top -b -d $delay -p $pid | awk -v OFS="," '$1=="top"{ time=$3 }
$1+0>0 { print time,$1,$NF,$9,$10; fflush() }'

Entonces la marca de tiempo es precisa, pero la salida aún se retrasará por $delay.

5
xebeche

Si conoce el nombre del proceso, puede usar

top -p $(pidof <process_name>)
2
user4757345

Llego un poco tarde aquí, pero compartiré mi truco en la línea de comandos usando solo el predeterminado ps

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

Yo uso esto como una frase. Aquí la primera línea dispara el comando y almacena el PID en la variable. Luego, ps imprimirá el tiempo transcurrido, el PID, el porcentaje de CPU que utiliza, el porcentaje de memoria y la memoria RSS. También puede agregar otros campos.

Tan pronto como finalice el proceso, el comando ps no devolverá "éxito" y el bucle while 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á una salida como esta:

  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
  ....
2
theist

No hay suficiente reputación para comentar, pero para psrecord también puede llamarlo directamente, de manera programática, directamente en Python:

from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)
2
ZettaCircl

Si tiene una distribución Linux reducida donde top no tiene la opción por proceso (-p) u opciones relacionadas, puede analizar la salida del comando top para el nombre de su proceso para obtener la información de uso de la CPU por proceso.

while true;  do top -bn1 | awk '/your_process_name/ {print  $8}' ; sleep 1; done

8 representa el uso de CPU por proceso en la salida del comando superior en mi distribución de Linux incrustada

1
Razan Paul
pidstat -p 7994 2 

03:54:43 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
03:54:45 PM     0      7994    1.50    1.50    0.00    3.00     1  AliYunDun
03:54:47 PM     0      7994    1.00    1.00    0.00    2.00     0  AliYunDun

cada 2 segundos proceso de impresión 7994 uso de CPU

0
赵宝磊

Si necesita los promedios durante un período de tiempo de un proceso específico, pruebe la opción acumulativa -c de top:

top -c a -pid PID

"-c a" se encuentra en la parte superior para Mac 10.8.5.

Para Scientific Linux, la opción es -S, que se puede configurar de forma interactiva.

0
Kieleth