2010-07-27 21 views
80

¿Hay alguna manera de medir el uso de CPU de un proceso específico por núcleos?¿Cómo mido el uso del núcleo de CPU por separado para un proceso?

top es bueno para medir el uso de la CPU del sistema completo por núcleos y taskset puede proporcionar información sobre qué núcleo de la CPU está permitido para que el proceso se ejecute.

Pero, ¿cómo puedo medir el uso de CPU de un proceso específico por núcleos de CPU?

Respuesta

32

puede usar ps.
p. teniendo proceso de pitón con dos subprocesos ocupados en la CPU de doble núcleo:

$ ps -p 29492 -L -o pid,tid,psr,pcpu 
    PID TID PSR %CPU 
29492 29492 1 0.0 
29492 29493 1 48.7 
29492 29494 1 51.9 

(PSR es Identificación del CPU del hilo está asignada actualmente a)

se ve que los hilos se ejecutan en el mismo núcleo de la CPU (a causa de GIL)

ejecuta el mismo script en Python en jython, vemos, que el guión es la utilización de ambos núcleos (y hay muchos hilos de otro servicio o lo que sea, que son casi inactivo):

$ ps -p 28671 -L -o pid,tid,psr,pcpu 
    PID TID PSR %CPU 
28671 28671 1 0.0 
28671 28672 0 4.4 
28671 28673 0 0.6 
28671 28674 0 0.5 
28671 28675 0 2.3 
28671 28676 0 0.0 
28671 28677 1 0.0 
28671 28678 1 0.0 
28671 28679 0 4.6 
28671 28680 0 4.4 
28671 28681 1 0.0 
28671 28682 1 0.0 
28671 28721 1 0.0 
28671 28729 0 88.6 
28671 28730 1 88.5 

puede procesar la salida y calcular la CPU total para cada núcleo de CPU.

Desafortunadamente, este enfoque no parece ser 100% confiable, a veces veo que en el primer caso, los dos hilos de trabajo se separan para cada núcleo de CPU, o en este último caso, los dos hilos son informado de que en el mismo núcleo ..

91

todavía se puede hacer esto en la parte superior

Tipo 1 - que muestra cada CPU

límite de los procesos mostrados por tener ese proceso específico ejecutarse bajo una cuenta de usuario específica y use el tipo 'u' para limitar a ese usuario

+5

así .. ¿cómo puedo leer esto? – Zhianc

+1

También puede presionar 'I' para alternar * Modo Irix * (a diferencia del * modo Solaris *). Cuando 'on', el porcentaje que se muestra en la lista de procesos es relativo a ** ** thread de la CPU **. Cuando 'off ', dicho porcentaje se muestra con relación a la ** capacidad total de la CPU ** (es decir, * TODOS los hilos * - también conocidos como todos los núcleos). –

+3

'htop' también funciona – phyatt

62

Se puede utilizar:

mpstat -P ALL 1 

Se muestra la cantidad de cada núcleo está ocupado y se actualiza automáticamente cada segundo. La salida sería algo como esto (en un procesador de cuatro núcleos):

10:54:41 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 
10:54:42 PM all 8.20 0.12 0.75 0.00 0.00 0.00 0.00 0.00 90.93 
10:54:42 PM 0 24.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 74.00 
10:54:42 PM 1 22.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 76.00 
10:54:42 PM 2 2.02 1.01 0.00 0.00 0.00 0.00 0.00 0.00 96.97 
10:54:42 PM 3 2.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 98.00 
10:54:42 PM 4 14.15 0.00 1.89 0.00 0.00 0.00 0.00 0.00 83.96 
10:54:42 PM 5 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 
10:54:42 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 
10:54:42 PM 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 

Este comando no respondió a la pregunta original, es decir, a pesar de que no muestra uso de los núcleos de la CPU para un proceso específico.

+1

Creo que esto realmente no responde la pregunta. Esto es lo mismo si no hay otros procesos en ejecución. Además, esto no parece ser una CPU de cuatro núcleos, más como ocho núcleos (tal vez quad con HT habilitado). –

+0

Es un núcleo cuádruple con HT habilitado. –

+0

No responde la pregunta original. Sin embargo, por no mencionarlo (-1) de mí. – KGhatak

3

La solución ps fue casi lo que necesitaba y con un poco de fiesta tirado hace exactamente lo que la pregunta original pidió: permite ver el uso por núcleo de procesos específicos

Esto muestra el uso por núcleo de procesos multiproceso también.

Usa como: cpustat `pgrep processname`` pgrep otherprocessname` ...

#!/bin/bash 

pids=() 
while [ $# != 0 ]; do 
     pids=("${pids[@]}" "$1") 
     shift 
done 

if [ -z "${pids[0]}" ]; then 
     echo "Usage: $0 <pid1> [pid2] ..." 
     exit 1 
fi 

for pid in "${pids[@]}"; do 
     if [ ! -e /proc/$pid ]; then 
       echo "Error: pid $pid doesn't exist" 
       exit 1 
     fi 
done 

while [ true ]; do 
     echo -e "\033[H\033[J" 
     for pid in "${pids[@]}"; do 
       ps -p $pid -L -o pid,tid,psr,pcpu,comm= 
     done 
     sleep 1 
done 

Nota: Estas estadísticas se basan en proceso de vida, no los últimos X segundos, por lo que tendrá que reiniciar el proceso para restablecer el contador.

+0

¿Existe un equivalente de C syscall del comando ps – Bionix1441

+0

Puede usar las funciones de C lib read() y open() para abrir los pseudoarchivos en/proc/pid/* y analizar los datos que necesita. – GL2014

0

Tuve este problema y encontré una respuesta similar here.

El método es establecer top de la forma que desee y luego presione W (mayúscula W). Esto ahorra 's diseño actual a un archivo de configuración en $ HOME/.toprc

Aunque esto podría no funcionar si se desea ejecutar múltiples top' top s con diferentes configuraciones.

Así que a través de lo que considero un trabajo en torno a que puede escribir en diferentes archivos de configuración/utilizar diferentes archivos de configuración mediante una de las siguientes ...

1) Cambiar el nombre del binario

ln -s /usr/bin/top top2 
    ./top2 

Ahora .top2rc va a ser escrito a su $ HOME

2) Conjunto $ HOME para algún camino alternativo, ya que va a escribir su archivo de configuración en el fichero $ HOME/.binary-name.rc

HOME=./ 
top 

Ahora .toprc se va a escribir en la carpeta actual.

Mediante el uso de comentarios de otras personas para agregar la contabilidad de varios usos en la parte superior, puede crear un resultado por lotes para esa información y, a continuación, fusiona la información a través de un script. Tal vez no sea tan simple como tu script, pero encontré top para proporcionarme TODOS los procesos para poder recapitular y capturar un estado a largo plazo que de otra manera podría haber pasado por alto (uso de CPU inesperado debido a procesos extraviados)

1

Pensé que perf stat es lo que necesita.

Muestra un uso específico de un proceso cuando especifica una opción --cpu=list. Aquí hay un ejemplo de cómo monitorear el uso de la CPU para construir un proyecto usando el comando perf stat --cpu=0-7 --no-aggr -- make all -j. La salida es:

CPU0   119254.719293 task-clock (msec)   # 1.000 CPUs utilized   (100.00%) 
CPU1   119254.724776 task-clock (msec)   # 1.000 CPUs utilized   (100.00%) 
CPU2   119254.724179 task-clock (msec)   # 1.000 CPUs utilized   (100.00%) 
CPU3   119254.720833 task-clock (msec)   # 1.000 CPUs utilized   (100.00%) 
CPU4   119254.714109 task-clock (msec)   # 1.000 CPUs utilized   (100.00%) 
CPU5   119254.727721 task-clock (msec)   # 1.000 CPUs utilized   (100.00%) 
CPU6   119254.723447 task-clock (msec)   # 1.000 CPUs utilized   (100.00%) 
CPU7   119254.722418 task-clock (msec)   # 1.000 CPUs utilized   (100.00%) 
CPU0     8,108 context-switches   # 0.068 K/sec     (100.00%) 
CPU1    26,494 context-switches            (100.00%) 
CPU2    10,193 context-switches            (100.00%) 
CPU3    12,298 context-switches            (100.00%) 
CPU4    16,179 context-switches            (100.00%) 
CPU5    57,389 context-switches            (100.00%) 
CPU6     8,485 context-switches            (100.00%) 
CPU7    10,845 context-switches            (100.00%) 
CPU0     167 cpu-migrations   # 0.001 K/sec     (100.00%) 
CPU1     80 cpu-migrations            (100.00%) 
CPU2     165 cpu-migrations            (100.00%) 
CPU3     139 cpu-migrations            (100.00%) 
CPU4     136 cpu-migrations            (100.00%) 
CPU5     175 cpu-migrations            (100.00%) 
CPU6     256 cpu-migrations            (100.00%) 
CPU7     195 cpu-migrations            (100.00%) 

La columna de la izquierda es el índice de CPU específico y la columna de la derecha es el uso de la CPU. Si no especifica la opción --no-aggr, el resultado se agregará. La opción --pid=pid lo ayudará si desea monitorear un proceso en ejecución.

Pruebe -a --per-core o -a perf-socket también, que presentará más información clasificada.

Más sobre el uso de perf stat se puede ver en este tutorial: perf cpu statistic, también perf help stat ayudará con el significado de las opciones.

1
dstat -C 0,1,2,3 

También le dará el uso de la CPU de los primeros 4 núcleos. Por supuesto, si tienes 32 núcleos, entonces este comando se hace un poco más largo pero útil si solo te interesan algunos núcleos.

Por ejemplo, si sólo está interesado en el núcleo 3 y 7, entonces usted podría hacer

dstat -C 3,7 
2

htop da una buena visión general del uso de los núcleos individuales

Cuestiones relacionadas