tengo mi propio programa de multiproceso C que escala en la velocidad sin problemas con el número de núcleos de CPU .. puedo correr con 1, 2, 3, etc y obtener hilos velocidad lineal ... hasta aproximadamente 5.5x velocidad en una CPU de 6 núcleos en una caja Ubuntu Linux.Linux por proceso límites de recursos - una profunda Red Hat Mystery
que tuvieron la oportunidad de ejecutar el programa en un extremo muy alto Sunfire X4450 con 4 procesadores Xeon de cuatro núcleos, que ejecutan Red Hat Enterprise Linux. Estaba esperando ansiosamente ver cuán rápido los 16 núcleos podían ejecutar mi programa con 16 hilos ... ¡Pero funciona a la misma velocidad que DOS hilos!
Mucho tirón de pelo y depuración más tarde, veo que mi programa realmente está creando todos los hilos, realmente se están ejecutando simultáneamente, pero los hilos en sí son más lentos de lo que deberían ser. ¡2 hilos se ejecutan aproximadamente 1.7 veces más rápido que 1, pero 3, 4, 8, 10, 16 hilos funcionan todos con solo 1.9x! Veo que todos los hilos se están ejecutando (no estancados o durmiendo), son lentos.
Para comprobar que el HARDWARE no tuvo la culpa, ejecuté DIECISÉIS copias de mi programa de forma independiente, simultáneamente. Todos corrieron a toda velocidad. Realmente hay 16 núcleos y realmente funcionan a toda velocidad y realmente hay suficiente RAM (de hecho, esta máquina tiene 64 GB y solo uso 1 GB por proceso).
lo tanto, mi pregunta es si hay alguna explicación del sistema operativo, tal vez algún límite de recursos por proceso que escala automáticamente la programación de subprocesos para mantener un proceso utilice acaparando la máquina.
Las pistas son:
- Mi programa no accede al disco o red. Es un CPU limitado. Su velocidad se escala linealmente en una sola caja de CPU en Ubuntu Linux con a hexacore i7 para 1-6 hilos. 6 hilos es efectivamente 6 veces más rápido.
- Mi programa nunca se ejecuta más rápido que 2 veces la aceleración en este 16 núcleos Sunfire caja Xeon, para cualquier número de hilos de 2-16.
- Ejecutando 16 copias de mi programa de un solo hilo ejecuta perfectamente, todas las 16 funcionan a la vez a a toda velocidad.
- arriba muestra 1600% de CPU asignadas./Proc/cpuinfo muestra los 16 núcleos funcionando a toda velocidad 2.9GHz (no baja frecuencia ralentí de 1,6 GHz)
- Hay 48 GB de memoria RAM libre, no está intercambiando.
¿Qué está pasando? ¿Hay alguna política de límite de CPU de proceso? ¿Cómo podría medirlo si es así? ¿Qué más podría explicar este comportamiento?
Gracias por sus ideas para resolver esto, la desaceleración gran misterio Xeon de 2010!
La mayoría de esos puntos son EXCELENTES y son lo que miré primero. Pero el hecho de que 16 copias individuales se ejecuten a toda velocidad significa que no es un problema de CPU, memoria, hyperthreading o virtualización. Ahora estoy convencido de que no es un problema de programación, sino algo relacionado con el sistema operativo, pero no sé dónde buscar. La instalación de un nuevo sistema operativo obviamente sería una gran prueba, excepto que se trata de un servidor SunFire de $ 22,000 al que tengo acceso pero que no me pertenece. –