¿Por qué el planificador de Linux coloca dos hilos en el mismo núcleo físico en procesadores con HyperThreading?

He leído en varios lugares que el planificador predeterminado de Linux eshyperthreading consciente en máquinas multinúcleo, lo que significa que si tiene una máquina con 2 núcleos reales (4 HT), no programará dos subprocesos ocupados en núcleos lógicos de manera que ambos se ejecuten en los mismos núcleos físicos (lo que conduciría a 2x costo de rendimiento en muchos casos).

Pero cuando corrostress -c 2 (genera dos subprocesos para ejecutarse en 100% CPU) en mi Intel i5-2520M,a menudo programa (y mantiene)los dos hilos en los núcleos HT 1 y 2, que se asignan al mismo núcleo físico. Incluso si el sistema está inactivo de lo contrario.

Esto también sucede con programas reales (estoy usandostress aquí porque facilita la reproducción), y cuando eso sucede, comprensiblemente, mi programa tarda el doble de tiempo en ejecutarse. Establecer afinidad manualmente contaskset arregla eso para mi programa, pero esperaría que un planificador con reconocimiento de HT lo haga correctamente por sí mismo.

Puedes encontrar elHT-> núcleo físico asignación conegrep "processor|physical id|core id" /proc/cpuinfo | sed 's/^processor/\nprocessor/g'.

Entonces mi pregunta es: ¿Por qué el planificador pone mis hilos en el mismo núcleo físico aquí?

Notas:

Esta pregunta es muy similar a estaotra pregunta, las respuestas a las cuales dicen queLinux tiene un planificador de subprocesos bastante sofisticado que es consciente de HT. Como se describió anteriormente, no puedo observar este hecho (compruébelo usted mismo constress -c), y me gustaría saber por qué.Sé que puedo configurar manualmente la afinidad de los procesadores para mis programas, p. con eltaskset herramienta o con elsched_setaffinity función. Esto no es lo que estoy buscando, esperaría que el planificador sepa por sí mismo que asignar dos hilos ocupados a un núcleo físico y dejar un núcleo físico completamente vacío no es una buena idea.Soy consciente de que hayalgunas situaciones en el que preferiría que los subprocesos se programen en el mismo núcleo físico y deje libre el otro núcleo, pero parece absurdo que el planificador lo haga aproximadamente 1/4 de los casos. Me parece que los núcleos HT que elige son completamente aleatorios, o tal vez los núcleos HT que tenían menos actividad en el momento de la programación, pero eso no sería muy consciente de la hiperprocesamiento, dada la claridad de los programas con las características destress beneficiarse de correr en núcleos físicos separados.

Respuestas a la pregunta(3)

Su respuesta a la pregunta