'htop' no muestra el% de CPU correcto, pero 'top' sí

12

Mientras se ejecuta mencodercon subprocesos = 4 (en una CPU de cuatro núcleos). He notado que htopno muestra su verdadero uso de CPU, pero topsí.

Parece que htop solo informa sobre un núcleo . ¿Es esto un error / limitación de htop ? ¿Que esta pasando aqui?

No hay otras entradas para mencoder aparecer en pso htopo top. Supongo que 100% significa que 1 núcleo está al máximo, pero incluso esto me parece extraño; ¿Qué pasa con los otros núcleos?

Actualización: salida agregada del "Monitor del sistema"

                  PID   %CPU   COMMAND                    
           "top"  1869   220   mencoder                 
          "htop"  1869    95   mencoder -noodml /media/...  
"System Monitor"  1869   220   mencoder
Peter.O
fuente
¿Qué banderas estás usando para htop?
sep332
sep332 ... Acabo de ejecutar "htop" ... así que es el caso de los valores predeterminados.
Peter.O
¡Bingo! sep332 ... responda a eso y lo marcaré resuelto ... Me hizo mirar mis valores predeterminados ... "H" es una tecla de alternancia para "Ocultar hilos de usuario" ... Cuando todo lo demás falla " Lea la ayuda de información ", pero a veces una pista útil en el directon correcto ayuda más ... Gracias.
Peter.O
@ Peter.O: Accidentalmente rechazado (¡touchpad del mouse!). Lo cancelaré si editas tu publicación.
SabreWolfy

Respuestas:

24

Como usted mismo ha dicho, puede presionar Hpara mostrar hilos de usuario.

Solo para referencia futura (y por diversión), ¡calculemos la utilización de la CPU!

Un poco de historia:

En un sistema operativo moderno, hay un Programador. Su objetivo es garantizar que todos los procesos y sus hilos obtengan una parte justa del tiempo de computación. No entraré demasiado en la programación (es realmente complicado). Pero al final hay algo llamado una cola de ejecución . Aquí es donde todas las instrucciones de todos los procesos se alinean para esperar a que se ejecute su turno.

Cualquier proceso pone sus "tareas" en la cola de ejecución, y una vez que el procesador está listo, las saca y las ejecuta. Cuando un programa se va a dormir, por ejemplo, se elimina de la cola de ejecución y regresa al "final de la línea" una vez que está listo para ejecutarse nuevamente.

La clasificación en esta cola tiene que ver con la prioridad de los procesos (también llamada "buen valor", es decir, un proceso es bueno con los recursos del sistema).

La longitud de la cola determina la carga del sistema. Una carga de 2.5, por ejemplo, significa que hay 2.5 instrucciones para cada instrucción que la CPU puede manejar en tiempo real .

En Linux, por cierto, esta carga se calcula en intervalos de 10 ms (por defecto).

Ahora en los valores de porcentaje de utilización de la CPU:

Imagine que tiene dos relojes, uno se llama ty representa el tiempo real . Mide un segundo por cada segundo. El otro reloj que llamamos c. Solo se ejecuta si hay procesamiento que hacer. Eso significa que solo cuando un proceso calcula algo funciona el reloj. Esto también se llama tiempo de CPU. Todos y cada uno de los procesos en el sistema 'tienen' uno de esos.

La utilización del procesador ahora se puede calcular para un solo proceso:

U = c / t = 0.5s / 1s = 0.5

o para todos los procesos:

texto alternativo

En una máquina multinúcleo, esto puede resultar en un valor de 3.9, por supuesto, porque la CPU puede calcular cuatro segundos de cálculo por segundo, si se utiliza perfectamente.

Wikipedia proporciona este ejemplo:

Una aplicación de software que se ejecuta en una máquina UNIX de 6 CPU crea tres procesos UNIX para cumplir con los requisitos del usuario. Cada uno de estos tres procesos crea dos hilos. El trabajo de la aplicación de software se distribuye uniformemente en 6 hilos de ejecución independientes creados para la aplicación. Si no hay que esperar por los recursos, se espera que el tiempo total de la CPU sea seis veces en tiempo real transcurrido.

Aquí hay un pequeño fragmento de Python que hace esto

>>> import time
>>> t = time.time()
>>> c = time.clock()
>>> # the next line will take a while to compute
>>> tuple(tuple(i**0.2 for i in range(600)) for i in range(6000))
>>> print (time.clock() / (time.time() - t)) * 100, "%"
66.9384021612 %

En un mundo perfecto, se podría inferir de esto que la carga del sistema es 100 - 66.93 = 33,1%. (Pero en realidad eso estaría mal debido a cosas complejas como la espera de E / S, ineficiencias de programación, etc.)

A diferencia de la carga , estos cálculos siempre darán como resultado un valor entre 0 y el número de procesadores, es decir, entre 0 y 1 o 0 a 100%. Ahora no hay forma de diferenciar entre una máquina que ejecuta tres tareas, que utilizan 100% de CPU, y una máquina que ejecuta un millón de tareas, y apenas realiza trabajo en una sola de ellas, también al 100%. Si, por ejemplo, está tratando de equilibrar un montón de procesos en muchas computadoras, la utilización de la CPU es casi inútil. Cargar es lo que quieres allí.

Ahora, en realidad, hay más de uno de esos relojes de tiempo de procesamiento. Hay uno para esperar en E / S, por ejemplo. Por lo tanto, también podría calcular la utilización de recursos de E / S.

Puede que esto no haya sido útil con respecto a la pregunta original, pero espero que sea interesante. :)

Stefano Palazzo
fuente
Realmente debería haber incluido valores de incertidumbre, porque usando este método simple, el cálculo probablemente estará desactivado en ± 1%, pero no quería aburrir demasiado a todos .
Stefano Palazzo
Gracias por la leccion. Sabía la mayor parte de eso, pero algunas cosas eran más específicas de lo que aprendí.
NightwishFan