
가상 머신 내에서 멀티스레드 렌더링 소프트웨어를 실행할 때 불쾌한 성능 문제가 있습니다.
우리는 데비안(6.0.6, 2.6.32-5-amd64) 컴퓨팅 서버에서 헤드리스로 실행되는 VirtualBox 4.0.10_Debianr72436에서 Kubuntu 12.04를 실행하고 있습니다. 약 64GB 작동 메모리와 하이퍼스레딩 기능을 갖춘 2*6 코어 Intel Xeon X5660 프로세서를 갖추고 있습니다. X 버전 1.1.0용 TigerVNC 뷰어를 통해 VM에 연결합니다. 가상 머신은 현재 24개의 코어를 모두 사용하도록 설정되어 있지만 더 낮은 개수(예: 12)로 구성하면 아래에 설명된 문제가 관찰될 수 있습니다.
문제:
단 하나의 렌더링 스레드로 렌더러를 실행하면 다른 컴퓨터(Intel Core 2 Duo MacBook)의 금속에서 직접 실행할 때 얻는 속도와 비슷한 속도로 실행됩니다. 그러나 작업 스레드 수를 늘리면 속도가 약간만 빨라지고(1/n에서 꽤 멀리) 스레드가 5개쯤 되면 실제로 속도가 느려지기 시작합니다. 8개 스레드 이상에서는 단일 스레드 애플리케이션보다 훨씬 느립니다. 렌더러가 MacBook의 금속에서 직접 실행되면 실행하도록 지정한 스레드 수에 관계없이 문제가 없습니다. 예를 들어 듀얼 코어 CPU의 16개 스레드는 2개 스레드 인스턴스만큼 빠르게 실행됩니다.
그런 다음 렌더러의 여러 단일 스레드 인스턴스를 병렬로 실행하려고 시도했는데 놀라운 결과가 나왔습니다. 4개의 인스턴스를 실행하면 모든 것이 정상입니다. 인스턴스 1개와 비슷한 속도로 실행되지만 6개의 인스턴스를 실행하면 모두 약 50% 정도 속도가 느려집니다!
또한 다른 렌더러(pbrt v.2)를 실행하여 다른 렌더러가 어떻게 작동하는지, 결과가 더 나은지 테스트해 보았습니다. 최대 13개 스레드까지 확장되었지만 속도도 느려졌습니다(그러나 우리 소프트웨어만큼은 아니었습니다).
우리의 렌더러는 C 및 어셈블러 비트와 결합된 Objective C로 작성되었습니다. 공유 데이터에 액세스하기 위해 코드에서 XADD 및 CAS 작업을 사용합니다. 이 두 가지가 우리 문제의 원인이 될 수 있다는 강력한 의혹이 있습니다. 이것에 대한 아이디어가 있습니까?
참고: 서버 정책으로 인해 Obj-C 런타임 및 기타 필요한 라이브러리를 설치할 수 없으며 금속에서 직접 소프트웨어를 실행할 수 없습니다.
VM 구성 발췌:
- 메모리 크기: 4000MB
- 페이지 융합: 꺼짐
- VRAM 크기: 12MB
- HPET: 꺼짐
- 칩셋: piix3
- 펌웨어: BIOS
- CPU 수: 24
- 합성 CPU: 꺼짐
- CPUID 재정의: 없음
- ACPI: 켜짐
- IOAPIC: 켜짐
- PAE: 꺼짐
- 시간 오프셋: 0ms
- RTC: UTC
- 하드웨어 virt.ext: 켜짐
- 하드웨어 virt.ext 독점: 꺼짐
- 중첩 페이징: 켜짐
- 대형 페이지: 켜짐
- VT-x VPID: 켜짐
- 3D 가속: 꺼짐
- 2D 비디오 가속: 꺼짐
- 추가 실행 수준: 2
- 구성된 메모리 벌룬 크기: 0MB
답변1
여기서 헛소리를 하고 있지만... GUI에서 쿠분투 인스턴스를 마우스 오른쪽 버튼으로 클릭하고 실행되지 않는 동안 설정을 선택합니다. CPU가 제한되어 있는지 확인하십시오. 가상 및 호스트 상자 간의 리소스 경쟁을 완화하기 위해 24개가 아닌 20개 또는 22개의 CPU를 선택할 때 시스템이 어떻게 반응하는지 확인하고 싶을 것입니다. 그런 다음 20개의 스레드로 단일 인스턴스를 실행해 보세요. 나는 20개 코어에 대해 머신의 CPU가 급증하는 것을 볼 수 있을 것으로 예상하며, 이를 따라가려고 노력하는 동안 나머지 4개도 100%로 증가할 것입니다. 이 머신에서 VM 외에 다른 애플리케이션이 실행되고 있나요?