Obteniendo el mismo uso de CPU cada vez.


13

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 cpuusage en tiempo real en la salida. Por favor, ayúdame a mejorar mi comando.


1
¿Y la pregunta es?
Dennis Kaarsemaker

Intente ejecutar el comando antepuesto con time. En mi sistema solo toma 0.165s.
depquid

Por favor, dame un comando editado.
Ketan Patel

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

sin diferencia en la salida, después de probar en diferentes sistemas
Ketan Patel

Respuestas:


13

Tienes razón, topparece dar un uso incorrecto de la CPU en la primera iteración. Puede solucionar este problema de la siguiente manera:

top -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

Por supuesto, esto tomará el doble de tiempo, pero funcionará de todos modos.

Si todavía quiere que funcione más rápido, puede usar la -dopción, por ejemplo, para un período de medición total de 1 segundo, use la mitad:

top -d 0.5 -b -n2 | grep "Cpu(s)"|tail -n 1 | awk '{print $2 + $4}'

serverfault.com/a/436499/134517 también tomará mucho más del doble de tiempo, ya que tomará aproximadamente un segundo en lugar de casi ninguno.
altendky

Además del comentario de altendky, vea también la respuesta de terdon para obtener una explicación de por qué el problema está allí en primer lugar.
Ruslan

6

Técnicamente, el primero topno siempre genera el mismo valor; solo genera la carga promedio de la CPU desde el último arranque. Debido a que topusa el delta de /proc/statestadísticas para calcular la carga de la CPU, el primer valor se calcula al compararlo con cero, dando un resultado incorrecto (pero WAD).

Si no desea usar top, puede analizar directamente /proc/stat:

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) "%"}'

También es más rápido y más preciso de esta manera.

Puedes probarlo con stress:

stress -c 1 -q &

Y hacer

killall stress

después.


Agradable. Y si su comando se coloca en un archivo llamado 'cpu', entonces watchse puede ejecutar en él:watch -n1 "bash ./cpu"
Brent Faust

Su script awk para analizar /proc/states bastante bueno, pero parece tener el mismo inconveniente que la primera iteración de top: genera la carga promedio de CPU desde el último arranque, no la actual.
pieroxy

5

Solo para ampliar la respuesta de @ Ruslan, topdivide el uso de la CPU entre el usuario, los procesos del sistema y los niceprocesos, queremos la suma de los tres. Por lo tanto, podemos ejecutar topen bmodo atch que nos permite analizar su salida. Sin embargo, 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 para 0.01:

top -bn 2 -d 0.01 | grep '^%Cpu' | tail -n 1 | gawk '{print $2+$4+$6}'

4

Tal vez use este basado en la pssalida:

ps aux  | awk 'BEGIN { sum = 0 }  { sum += $3 }; END { print sum }

0

Use el comando watch o para loop in shell,

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


Lo mismo sucede con el reloj
Ketan Patel

0

¿Por qué te importa el uso de la CPU? El promedio de carga es un indicador mucho mejor:

cat /proc/loadavg

Si realmente necesita el uso de la CPU, el análisis /proc/statprobablemente sea el camino a seguir.


1
El promedio de carga es básicamente un tiempo integral del uso de la CPU (dividido por el tiempo). ¿Por qué diría que una característica integral es un indicador mucho mejor [de todo] que una característica diferencial cuando tienen casos de uso completamente diferentes? Además, /proc/statno da el uso de la CPU como es, uno tiene que leerlo dos veces con un tiempo entre lecturas y hacer algunos cálculos para obtener el uso de la CPU. Esto es justo lo que tophace.
Ruslan

No puedo hacer cálculos matemáticos, así que debo admitir que realmente no entiendo la diferencia entre integral y diferencial: / "El promedio de carga es básicamente una integral de tiempo del uso de la CPU", ¿de verdad? AFAIK un proceso que se cuelga en el estado D provoca un aumento de carga, pero no el uso de la CPU. "¿Por qué dirías que ...?" - OP no dice lo que realmente quiere lograr, así que para ser honesto, supongo que quiere medir la carga de su sistema y pensó que el uso de la CPU sería el mejor indicador para esto. , así que le indiqué que cargara el promedio.
Martin von Wittich

Desde su enlace: "Los sistemas calculan el promedio de carga como el promedio móvil exponencialmente amortiguado / ponderado del número de carga". y "la carga del sistema es una medida de la cantidad de trabajo computacional". El estado D no está tomando ningún trabajo computacional. Lo que está tomando son los procesos que usan tiempo de CPU. Entonces, la carga promedio es básicamente el porcentaje de tiempo que la CPU no estuvo inactiva durante un período de tiempo (por ejemplo, minutos a decenas de minutos). Y el uso de la CPU es el porcentaje de tiempo que la CPU no está inactiva en una escala de tiempo de milisegundos, es decir, se actualiza cada vez que la lee y refleja el estado actual .
Ruslan

-2

Usando el sarcomando

sar 1 10

Eso significa: obtener 10 veces el resultado en cada segundo

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.