¿Cómo puedo obtener el verdadero uso de una CPU habilitada para hyperthreading multinúcleo?
Por ejemplo, consideremos una CPU de 2 núcleos, que expresa 4 núcleos virtuales.
Una carga de trabajo de un solo subproceso ahora aparecería como 100% top
, ya que un núcleo de los núcleos virtuales se usa por completo. La CPU top
funciona como se esperaba, como si hubiera 4 núcleos reales.
Sin embargo, con dos subprocesos, las cosas se ponen difíciles: si todo funciona bien, se equilibran con los dos núcleos reales, por lo que tenemos un uso del 200%: dos veces el 100% y dos núcleos virtuales inactivos, y están utilizando toda la potencia de CPU disponible . Me parece bien.
Sin embargo, si los dos subprocesos se ejecutan en un solo núcleo real, aparecerían como dos veces al 100%, lo que hace un uso del 200% del núcleo virtual. Pero en el lado real, ese sería un núcleo que comparte su potencia en los dos subprocesos, que luego usan solo la mitad de la potencia total de la CPU.
Por lo tanto, los números de uso mostrados por top
no se pueden usar para medir la carga de trabajo total de la CPU.
También me pregunto cómo hyperthreading equilibra dos virtuales en un núcleo real. Si dos hilos toman una cantidad diferente de ciclos, ¿los núcleos virtuales se 'adaptarían' para que ambos muestren una carga del 100% incluso si la carga real difiere?
fuente
Respuestas:
Martin Tegtmeier de Oracle ha escrito una interesante publicación de blog sobre este último año: https://blogs.oracle.com/solaris/cpu-utilization-of-multi-threaded-architectures-explained-v2
La respuesta corta; Hyperthreading realmente se mete con la capacidad de top para informar porcentajes generales de utilización de la CPU / inactividad de la CPU.
En el peor de los casos, una CPU de 2 núcleos y 4 núcleos virtuales que ejecuta 2 subprocesos al 100% de utilización por núcleo, casi podría saturar la CPU. (Dependiendo del uso del puerto de ejecución; solo los subprocesos que utilizan recursos informáticos completamente diferentes en la CPU aún podrían ejecutarse sin afectar el rendimiento en el subproceso actual). Sin embargo, top aún informará un 50% de inactividad en este caso.
fuente
La utilización del núcleo es muy diferente a la carga en el sistema. La utilización del núcleo solo muestra cuánto calcula el núcleo algo o espera instrucciones. Puede ser 100%, lo que corresponde a cualquier momento en que la CPU esté calculando algo.
Pero la carga es una cosa diferente, la carga generalmente se mide para determinar si algún proceso tiene que esperar algún recurso o no. Si los procesos no esperan ningún recurso, verá un sistema muy eficiente. Pero a veces verá sistemas lentos pero poca utilización de la CPU. Eso generalmente significa que algunos procesos están esperando un recurso y no están liberando la CPU. Para este tipo de escenario, no verá una alta utilización de la CPU, pero el sistema puede estar muy por encima de su capacidad.
En un sistema Linux, el promedio de carga es un valor calculado para medir el rendimiento general de un sistema. El valor del promedio de carga debe compararse con los recursos de computación paralelos, los núcleos deben ser específicos. Entonces, si un sistema con 4 núcleos físicos tiene un promedio de carga de 4 o más, podemos decir con seguridad que algunos procesos esperarán un recurso.
No es importante si la utilización de la CPU es del 100 o 10 por ciento. El promedio de carga puede ser tan alto como 200 o 300, en estos casos el sistema apenas responderá.
En condiciones normales de funcionamiento, el promedio de carga del servidor no debe exceder el número de núcleos durante un período prolongado. Los picos cortos no son importantes en mi opinión. 3 números que verá en una
w
salida es cargar av. por 1/5/15 minutos.fuente
En mi opinión, ninguna de las respuestas anteriores es satisfactoria.
Creo que el artículo al que me refiero en el siguiente enlace está bien dirigido para responder esta pregunta: http://perfdynamics.blogspot.ch/2014/01/monitoring-cpu-utilization-under-hyper.html
CITAR:
De hecho, estoy bastante seguro de que el sistema operativo puede alcanzar el 100% en cada núcleo virtual, de eso no hay duda. Acabo de hacer un:
Y puedo asegurarles que mis 8 núcleos virtuales y 4 núcleos físicos se utilizaron al 100% en la CPU. Y definitivamente no tengo 8 núcleos en mi máquina.
En pocas palabras, puede suponer lo siguiente si la carga total de la CPU supera el 100%, como máximo, y muy probablemente de manera bastante precisa, utilizando exactamente el 100% del núcleo físico. Es decir, si tiene el NÚCLEO físico 1 dividido en la CPU del sistema operativo 1 y la CPU 2. Y en la CPU 1 tiene un uso total del 50% y en la CPU 2 tiene un uso total del 50%, lo más probable en la vida real es poniendo una presión de un uso total del 100% en esa CPU Lo has maximizado.
Pero, por supuesto, el sistema operativo en sus herramientas de monitoreo del sistema no tiene idea de que le está vendiendo una ilusión. Desde la perspectiva del sistema operativo y la forma en que administra los recursos, creerá que cada uno de esos dos núcleos virtuales aún está inactivo en un 50 por ciento, por lo que si hay más tareas por ejecutar, tratará de distribuirlas uniformemente entre esos dos núcleos. . Entonces, cuando supera el 100% de la utilización de la CPU, durante un período de uso de la CPU, siempre hay trabajo en cola para ejecutarse en ese período de tiempo que nunca tuvo un cambio para obtener un corte de tiempo en la CPU. Eventualmente lo obtendrá, pero siempre hay algunos hilos que en realidad ni siquiera se están ejecutando, aunque estén programados para ejecutarse.
Gracias
fuente