У нас есть неприятная проблема с производительностью при запуске нашего многопоточного программного обеспечения рендеринга на виртуальной машине.
Мы запускаем Kubuntu 12.04 на VirtualBox 4.0.10_Debianr72436, который работает без вычислений на вычислительном сервере Debian (6.0.6, 2.6.32-5-amd64). Он имеет 2 * 6-ядерный процессор Intel Xeon X5660 с гиперпоточностью и около 64 ГБ оперативной памяти. Мы подключаемся к виртуальной машине через TigerVNC Viewer для X версии 1.1.0. Виртуальная машина в настоящее время настроена на использование всех 24 ядер, но проблемы, описанные ниже, могут наблюдаться, когда она настроена на более низкие значения (например, 12).
Эта проблема:
Когда мы запускаем наш рендерер только с одним потоком рендеринга, он работает со скоростью, сравнимой с той, которую мы получаем, когда работаем непосредственно на металле на других машинах (Intel Core 2 Duo MacBooks). Однако, по мере того, как мы увеличиваем количество рабочих потоков, он ускоряется лишь незначительно (довольно далеко от 1/n) и примерно на 5 потоках начинает фактически замедляться. Из 8 и более потоков это даже медленнее, чем однопоточное приложение. Когда рендерер запускается прямо на металле на наших MacBook, проблем не возникает, независимо от того, сколько потоков вы указали для запуска. Например, 16 потоков на двухъядерном процессоре работают так же быстро, как и двухпоточный экземпляр.
Затем мы попытались запустить несколько однопоточных экземпляров нашего рендерера параллельно с удивительным результатом. Когда мы запускаем 4 экземпляра, все в порядке - они работают с той же скоростью, что и один экземпляр, но когда мы запускаем 6 экземпляров, все они замедляются примерно на 50%!
Мы также попытались запустить другой рендерер (pbrt v.2), чтобы проверить, как работают другие и были ли их результаты лучше. Он хорошо масштабировался до 13 потоков, но затем также замедлился (но не так сильно, как наше программное обеспечение).
Наш рендерер написан на Objective C в сочетании с C и битами ассемблера. Мы используем операции XADD и CAS в нашем коде для доступа к общим данным. Существует сильное подозрение, что эти двое могут быть источником наших проблем. Есть идеи по этому поводу?
Кстати: мы не можем установить среду выполнения Obj-C и другие необходимые библиотеки и запустить наше программное обеспечение прямо на железе из-за политики сервера.
Выдержка из конфигурации VM:
- Объем памяти: 4000 МБ
- Page Fusion: выключено
- Размер VRAM: 12 МБ
- HPET: выключен
- Чипсет: piix3
- Прошивка: BIOS
- Количество процессоров: 24
- Синтетический процессор: выключен
- CPUID переопределяет: нет
- ACPI: вкл
- IOAPIC: на
- PAE: выключено
- Смещение по времени: 0 мс
- RTC: UTC
- Hardw. virt.ext: on
- Hardw. virt.ext эксклюзив: выкл
- Вложенный пейджинг: включен
- Большие страницы: на
- VT-x VPID: вкл
- 3D ускорение: выключено
- 2D ускорение видео: выключено
- Дополнения запуска уровня: 2
- Сконфигурированный размер всплывающей памяти: 0 МБ