Tenemos un problema de rendimiento desagradable cuando ejecutamos nuestro software de renderizado multiproceso dentro de una máquina virtual.
Estamos ejecutando Kubuntu 12.04 en un VirtualBox 4.0.10_Debianr72436 que se ejecuta sin cabeza en el servidor informático Debian (6.0.6, 2.6.32-5-amd64). Tiene un procesador Intel Xeon X5660 de 2*6 núcleos con hyperthreading y alrededor de 64 GB de memoria operativa. Nos conectamos a la VM mediante TigerVNC Viewer para X versión 1.1.0. Actualmente, la máquina virtual está configurada para usar los 24 núcleos, pero los problemas que se describen a continuación se pueden observar cuando está configurada para recuentos más bajos (por ejemplo, 12).
El problema:
Cuando ejecutamos nuestro renderizador con un solo subproceso de renderizado, se ejecuta a una velocidad comparable a la que obtenemos cuando lo ejecutamos directamente sobre metal en otras máquinas (Intel Core 2 Duo MacBooks). Sin embargo, a medida que aumentamos el número de subprocesos en funcionamiento, la velocidad se acelera solo ligeramente (bastante lejos de 1/n) y alrededor de 5 subprocesos comienza a disminuir la velocidad. A partir de 8 subprocesos es incluso más lento que una aplicación de un solo subproceso. Cuando el renderizador se ejecuta directamente sobre metal en nuestras MacBooks, no hay problemas, sin importar cuántos subprocesos especifique ejecutar. Por ejemplo, 16 subprocesos en una CPU de doble núcleo se ejecutan tan rápido como una instancia de dos subprocesos.
Luego intentamos ejecutar varias instancias de un solo subproceso de nuestro renderizador en paralelo con un resultado sorprendente. Cuando ejecutamos 4 instancias, todo está bien: se ejecutan a una velocidad similar a una instancia, pero cuando ejecutamos 6 instancias, ¡todas se ralentizan alrededor de un 50%!
También intentamos ejecutar otro renderizador (pbrt v.2) para probar cómo les está yendo a otros y si sus resultados fueron mejores. Se escaló bien hasta 13 subprocesos, pero luego también se ralentizó (pero no tanto como nuestro software).
Nuestro renderizador está escrito en Objective C combinado con C y bits de ensamblador. Usamos operaciones XADD y CAS en nuestro código para acceder a datos compartidos. Existe una fuerte sospecha de que estos dos pueden ser el origen de nuestros problemas. ¿Alguna idea sobre esto?
Por cierto: no podemos instalar el tiempo de ejecución de Obj-C y otras bibliotecas necesarias y ejecutar nuestro software directamente en el metal debido a la política del servidor.
Extracto de configuración de VM:
- Tamaño de memoria: 4000 MB
- Fusión de página: desactivada
- Tamaño de VRAM: 12 MB
- HPET: apagado
- Conjunto de chips: piix3
- Firmware: BIOS
- Número de CPU: 24
- CPU sintética: apagada
- Anulaciones de CPUID: ninguna
- ACPI: activado
- IOAPIC: activado
- PAE: apagado
- Compensación de tiempo: 0 ms
- RTC: UTC
- Duro. virt.ext: activado
- Duro. Exclusivo de virt.ext: desactivado
- Paginación anidada: activada
- Páginas grandes: activado
- VPID VT-x: activado
- Aceleración 3D: desactivada
- Aceleración de vídeo 2D: desactivada
- Nivel de ejecución de adiciones: 2
- Tamaño del globo de memoria configurado: 0 MB
Respuesta1
Estoy escupiendo aquí pero... En la GUI, haga clic derecho en la instancia de Kubuntu y elija la configuración mientras no se esté ejecutando. Verifique si su CPU está limitada allí. Probablemente querrá ver cómo responde su sistema al elegir 20 o 22 CPU en lugar de 24 para mitigar la competencia de recursos entre la caja virtual y la host. Luego intente ejecutar una sola instancia con 20 subprocesos. Esperaría ver que la CPU en la máquina aumente para los 20 núcleos y los 4 restantes también aumentarían al 100% mientras trato de mantener el ritmo. ¿Tiene otras aplicaciones ejecutándose en esta máquina además de su VM?