Obtener el uso de la CPU en tiempo real

11

Cuando ejecuto el siguiente comando para obtener el uso de la CPU, obtengo un buen uso de la CPU del usuario.

top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}' 

Salida:

14.5

Aquí tengo un problema es que la salida depende del comando superior, por lo que no cambia instantáneamente como comando superior. Por lo tanto, no obtengo la CPU correcta al instante. Da la misma salida y no cambia.

Quiero obtener el uso de CPU en tiempo real en la salida. Por favor, ayúdame a mejorar mi comando.

Ketan Patel
fuente
monitoreo en tiempo real askubuntu.com/questions/293426/…
Qasim
Este simple script bash hace exactamente eso: askubuntu.com/a/450136/243213
Craig van Tonder

Respuestas:

20

Si puede permitirse un retraso de un segundo, esto imprimirá el uso de la CPU como un porcentaje simple:

echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')]

(Sin el retraso de un segundo, vmstatsolo puede imprimir valores promedio desde el arranque).

Pablo
fuente
No me da un% exacto (en comparación con htop)
lepe
1
Debe usarlo vmstat 1 2así: de lo echo $[100-$(vmstat 1 2|tail -1|awk '{print $15}')] contrario, vmstatva a dar valores desde el arranque, que probablemente no sea lo que busca.
Joe
Joe, gracias, funciona. Paul, edita la respuesta para que todos puedan ver la línea de comando correcta
Pavlos Theodorou
¡Gracias por entender eso, Joe y Pavlos! No me di cuenta de esa parte de la página del manual.
Paul
9

Este es un problema conocido con top. Como se explica aquí , la primera iteración de top -bdevuelve los porcentajes desde el arranque, por lo tanto, necesitamos al menos dos iteraciones ( -n 2) para obtener el porcentaje actual. Para acelerar las cosas, puede configurar el delay entre iteraciones en 0.01. topdivide el uso de la CPU entre el usuario, los procesos del sistema y los niceprocesos, queremos la suma de los tres. Finalmente, usted grepusa la línea que contiene los porcentajes de CPU y luego la usa gawkpara sumar usuarios, sistemas y procesos agradables:

    top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'
        -----  ------   -----------    ---------   ----------------------
          |      |           |             |             |------> add the values
          |      |           |             |--> keep only the 2nd iteration
          |      |           |----------------> keep only the CPU use lines
          |      |----------------------------> set the delay between runs
          |-----------------------------------> run twice in batch mode
terdon
fuente
Todos los demás métodos, incluidos sar, mpstat ... etc., muestran un 2/3%, mientras que este comando siempre muestra un 50%.
CMCDragonkai
@CMCDragonkai los números deberían cambiar (lo acabo de comprobar) ¿estás seguro de que lo copiaste / pegaste correctamente? Además, tenga en cuenta que en sistemas con múltiples CPU, topinformará el porcentaje de uso como un porcentaje de una sola CPU. Esto significa que a menudo obtendrá porcentajes mucho más altos. Ver punto 9 aquí .
terdon
Creo que este comando podría no ser compatible con mi sistema. Pero es evidente que todos los otros métodos que probé me dan un porcentaje de 1/2/3%, que es lo que veo si ejecuto htop, mientras que este comando me da una anomalía.
CMCDragonkai
@CMCDragonkai se debe a las múltiples CPU. Puede obtener el número devuelto por esto y dividirlo por el número de núcleos o puede usarlo topen modo interactivo (simplemente ejecutar top) y, una vez allí, presionar I(shift + i) para ver un desglose por núcleos.
terdon
Solo tengo 1 CPU.
CMCDragonkai
7

He intentado de varias maneras, pero me parece la más precisa:

cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{print ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'

Lo tengo desde aqui

lepe
fuente
my linux (Linux machine_name 4.4.0-127-generic # 153-Ubuntu SMP sáb 19 de mayo 10:58:46 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux) no tiene columna $ 15 (línea de la CPU del archivo / proc / stat) : cpu 17411187 27478 594887 646652526 585551 0 31838 0 0 0
Kemin Zhou
1
¡La mejor respuesta! ¡Gracias! Mi variación: cat <(grep 'cpu' / proc / stat) <(sleep 0.1 && grep 'cpu' / proc / stat) | awk -v RS = "" '{printf "% .1f", ($ 13- $ 2 + $ 15- $ 4) * 100 / ($ 13- $ 2 + $ 15- $ 4 + $ 16- $ 5)}'
maXp
La diferencia máxima es que se imprime redondeado con un solo decimal: %.1fque, en mi opinión, es más legible y útil para los humanos si usa esa salida en otros scripts.
lepe
0

Uso -n2. Esto generará dos líneas. La primera vez que topimprime la línea no califica para el estado en ese momento. Luego ajuste su script para ignorar la primera línea.

Il P
fuente