medida de carga de la CPU con hyperthreading en Linux

12

¿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 topfunciona 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 topno 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?

Dronus
fuente
1
Usted comprende que el sistema del operador no es consciente de la diferencia entre un núcleo virtual hyperthreading y el núcleo físico, ¿verdad?
Ramhound
Parece que sí, pero no tiene que ser así. El mapeo de núcleo real vs. virtual es un mapa simple de uno a dos. El problema es cómo medir la carga en un núcleo virtual que realmente cambia su rendimiento disponible al programarlo con otro en el núcleo real. Pero creo que todos los datos están disponibles, la pregunta es ¿dónde están las herramientas que obtienen un resultado adecuado de ellos?
dronus
1
Simplemente me gusta tener una medida de carga donde 100% significaría que se usa cada ciclo de cada núcleo real.
dronus
1
En pocas palabras: ¿Cómo saber en un momento dado si mi CPU sería capaz de hacer más trabajo, sin ralentizar el trabajo actualmente en curso?
Dronus
1
@Ramhound, así que si tengo un procesador físico de 4 núcleos con 8 núcleos lógicos, y mis promedios de carga dicen 4.00, ¿estoy al 100% de utilización o al 50%?
Buttle Butkus

Respuestas:

5

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.

TinkerTank
fuente
1
Enlace de trabajo actual: blogs.oracle.com/partnertech/…
Ján Lalinský
4

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 wsalida es cargar av. por 1/5/15 minutos.

Hkntn
fuente
0

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:

La idea detrás de HT es permitir que se ejecute un subproceso de aplicación diferente cuando la aplicación actualmente en ejecución se detiene; debido a la predicción errónea de la rama, burbujas en la tubería, etc. Para que eso sea posible, tiene que haber otro puerto o registro AS. Ese registro se vuelve visible para el sistema operativo cuando HT está habilitado. Sin embargo, el sistema operativo (y hasta el final de la cadena alimentaria hasta las herramientas de perf que está utilizando) ahora piensa dos veces la capacidad del procesador disponible, es decir, 100% de CPU en cada puerto AS.

Pero bajo el capó, todavía hay una sola unidad de ejecución: el núcleo único, físico, con el que comenzaste antes de habilitar HT. La diferencia es que se comparte de alguna manera entre los 2 puertos AS. La forma en que el núcleo único se conmuta entre los dos puertos es muy complicado, pero se entiende más fácilmente en términos de colas encuestadas. Entro en ese nivel de detalle en mis clases de GCaP.

Las mediciones de prueba del mejor de los casos que tengo indican que cada puerto HT no puede ocupar más del 75%, en promedio, o el 150% de la capacidad total esperada del 200% según el sistema operativo. La capacidad del 50% "faltante", a la que me referí anteriormente, es una ilusión. Intel ha afirmado que se puede esperar algo en el rango de 120% a 130% para aplicaciones generales.

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:

mvn clean install -DskipTests -T 5

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

99Sono
fuente