Cómo obtener el uso general de la CPU (por ejemplo, 57%) en Linux [cerrado]


194

Me pregunto cómo puede obtener el uso de la CPU del sistema y presentarlo en porcentaje usando bash, por ejemplo.

Salida de muestra:

57%

En caso de que haya más de un núcleo, sería bueno si se pudiera calcular un porcentaje promedio.


1
@julesanchez, el valor debe canalizarse a otro lugar, por lo tanto, debe ser un int
user1199739

haciendo top> myfile.txt Y aplicando su filtro en el post-tratamiento, ¿no está bien?
JuSchz

11
Un comando que no requiere sysstat:ps -A -o pcpu | tail -n+2 | paste -sd+ | bc
RFon

77
Reapertura No entiendo por qué esto fue descartado como tema, ¿podrían los que lo cerraron por favor explicar?
Jonathan H

3
Mi comprensión de /proc/states muy limitado, pero esto de una sola línea funciona lo suficientemente bueno para mí: cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{printf "%.2f%\n", ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'. Con% .2f puede controlar la cantidad de decimales que desea generar, y con sleep 1usted puede establecer el tiempo que desea promediar, es decir, si hace lo que creo que hace. Puedes ponerlo en un bash while loop para probarlo en tiempo real.
Yeti

Respuestas:


174

Echa un vistazo a cat /proc/stat

grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'

EDITAR , lea los comentarios antes de copiar y pegar esto o usar esto para cualquier trabajo serio. Esto no se probó ni se usó, es una idea para las personas que no desean instalar una utilidad o para algo que funciona en cualquier distribución. Algunas personas piensan que puedes "apt-get install" cualquier cosa.

NOTA: este no es el uso actual de la CPU, sino el uso general de la CPU en todos los núcleos desde el inicio del sistema. Esto podría ser muy diferente del uso actual de la CPU. Para obtener el valor actual se debe usar top (o herramienta similar).

El uso actual de la CPU se puede calcular potencialmente con:

awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' \
<(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat)

12
Pero debe instalar mpstat como recomienda anteriormente. Muchas personas no tienen esa flexibilidad. cat / proc / stat, entonces pipe es mucho más fácil que mpstat que recomiendas.
vimdude

12
+1 No entiendo por qué analizar otra utilidad es mejor que analizar/proc/stat
reinstalar Monica Please

9
sistema + usuario + inactivo = 100%. Entonces, tal vez algo como: grep 'cpu' / proc / stat | awk '{cpu_usage = ($ 2 + $ 4) * 100 / ($ 2 + $ 4 + $ 5)} END {print cpu_usage "%"}'
vimdude

106
Creo que esta solución no muestra la carga actual de la CPU, sino la carga promedio de la CPU desde que se inició la CPU.
Etienne

11
@jlliagre, sí, eso es correcto. Para calcular el uso actual de la CPU no promedio, deberá tomar un valor de $ 1, luego retrasar y luego tomar el valor de $ 1 y ver la diferencia. Ese es el uso actual de la CPU.
vimdude

102

Puedes probar:

top -bn1 | grep "Cpu(s)" | \
           sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \
           awk '{print 100 - $1"%"}'

11
Cada vez que ejecuto este comando, obtengo exactamente el mismo resultado ( 32.7%).
alanaktion

13
Se da un resultado más preciso cuando lo uso top -bn2, pero lleva mucho tiempo. Por lo que he leído, esta parece ser la única forma de obtener un resultado preciso.
alanaktion

77
top -bn1Parece muy inexacto en mi sistema FC20. top -bn2Parece funcionar bien.
Martin Tournoij

24
El comando en esta respuesta parece estar escrito para sistemas donde top -vretorna procps-ng(por ejemplo, Fedora). También se procpsencuentra en, por ejemplo, Ubuntu y CentOS, donde el comando no funciona (siempre indica 100%, porque el análisis falla debido a que la línea con las cifras de la CPU se formatean de manera diferente). Aquí hay una versión que funciona con ambas implementaciones:top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }'
mklement0

2
Nota al margen: en OSX, utilice la siguiente: top -l 2 -n 0 -F | egrep -o ' \d*\.\d+% idle' | tail -1 | awk -F% -v prefix="$prefix" '{ printf "%s%.1f%%\n", prefix, 100 - $1 }'.
mklement0

38

Probar mpstatdesde el sysstatpaquete

> sudo apt-get install sysstat
Linux 3.0.0-13-generic (ws025)  02/10/2012  _x86_64_    (2 CPU)  

03:33:26 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
03:33:26 PM  all    2.39    0.04    0.19    0.34    0.00    0.01    0.00    0.00   97.03

Luego, algunos cuto greppara analizar la información que necesita:

mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 -  $ 12}'a

1
No creo que esto muestre la CPU total
user1199739

Lo diría 100% inactivo, ese es el uso total de la CPU (en%)
Peter Svensson

Ese es el porcentaje "no" utilizado. Esta respuesta fue buena, hasta el grep | cola | awk part ...
jordanm

Cambiaría la awkparte a:, awk -F " " '{print (100 - $12)"%"}'que da el resultado con el formato que él quería, pero de lo contrario, esto me parece bien.
Dan Fego

1
@jordanm Todas las verdades; Estaba votando más porque funciona. Yo haría esto personalmente:mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'
Dan Fego

22

También podría arrojar una respuesta real con mi solución, inspirada en la de Peter Liljenberg:

$ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }'
0.75%

Esto se utilizará awkpara imprimir 100 menos el campo 12 (inactivo), con un signo de porcentaje después. awksolo hará esto para una línea donde el duodécimo campo solo tiene números y puntos ( $12 ~ /[0-9]+/).

También puede promediar cinco muestras, separadas por un segundo:

$ mpstat 1 5 | awk 'END{print 100-$NF"%"}'

Pruébalo así:

$ mpstat 1 5 | tee /dev/tty | awk 'END{print 100-$NF"%"}'

14
Es mejor ejecutar "mpstat 2 1 | ..." para que muestre estadísticas durante el último 1 segundo. De lo contrario, por defecto, mpstat muestra estadísticas desde el comienzo y eso no cambia mucho a medida que pasa el tiempo
Sarang

1
"mpstat | awk '$ 12 ~ /[0-9.font>+/ {print 100 - $ 11"% "}'" esto funciona para mí.
AloneInTheDark

@Sarang ¡Muchas gracias! Finalmente puedo obtener los resultados que conkyse muestran también. Desafortunadamente, esta línea es MUY lenta, casi tarda un segundo entero en ejecutarse.
syntaxerror

66
@syntaxerror Tarda exactamente 2 segundos porque si observa el comando, ayuda a ver que el primer argumento es que es el intervalo, pero solo se ejecuta una vez debido al segundo argumento, por lo que espera 2 segundos completos hasta que devuelva el resultado.
Johan Bjäreholt

La pregunta está cerrada, así que agregué mi respuesta (similar) a la tuya :-) Espero que no te importe. Como tú, me inspiró la respuesta de Peter Liljenberg.
PJ Brunet

16

EDITADO: Noté que en la respuesta de otro usuario,% inactivo era el campo 12 en lugar del campo 11. El awk se ha actualizado para tener en cuenta que el campo% inactivo es variable.

Esto debería obtener el resultado deseado:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { print 100 - $field }'

Si desea un redondeo entero simple, puede usar printf:

mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d%%",100 - $field) }'

2
mpstat 1 1 | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d",100 - $field) }'funciona muy bien para mí, gracias. tenga en cuenta el mpstat 1 1 para asegurarse de que el uso de la CPU se muestrea durante un segundo
chrishiestand

1
Si tienes jq:mpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'
nyet
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.