在虛擬機器內執行多執行緒渲染軟體時,我們遇到了令人不快的效能問題。
我們在 VirtualBox 4.0.10_Debianr72436 中執行 Kubuntu 12.04,該虛擬機在 Debian(6.0.6、2.6.32-5-amd64)計算伺服器中無頭運行。它擁有 2*6 核心 Intel Xeon X5660 處理器,具有超線程功能,運行記憶體約為 64GB。我們透過 TigerVNC Viewer for X 版本 1.1.0 連接到虛擬機器。虛擬機器目前設定為使用全部 24 個核心,但當其配置為較低計數(例如 12)時,可能會出現下面描述的問題。
問題:
當我們只使用一個渲染執行緒運行渲染器時,它的運行速度與直接在其他機器(Intel Core 2 Duo MacBook)上的金屬上運行時的速度相當。然而,當我們增加工作執行緒的數量時,它的速度僅略有加快(遠非 1/n),並且在大約 5 個執行緒時,它實際上開始變慢。如果有 8 個執行緒或更多,它甚至比單執行緒應用程式還要慢。當渲染器直接在 MacBook 上的金屬上運行時,無論您指定要運行多少個線程,都不會出現任何問題。例如,雙核心 CPU 上的 16 個執行緒的運行速度與雙執行緒實例的運行速度一樣快。
然後,我們嘗試並行運行渲染器的多個單執行緒實例,結果令人驚訝。當我們運行 4 個實例時,一切正常 - 它們的運行速度與一個實例相似,但當我們運行 6 個實例時,所有實例的速度都減慢了 50% 左右!
我們也嘗試執行另一個渲染器(pbrt v.2)來測試其他人的表現以及他們的結果是否更好。它可以很好地擴展到 13 個線程,但隨後速度也變慢(但沒有我們的軟體慢)。
我們的渲染器是用 Objective C 結合 C 和彙編程式編寫的。我們在程式碼中使用 XADD 和 CAS 操作來存取共享資料。人們強烈懷疑這兩者可能是我們問題的根源。對此有什麼想法嗎?
順便說一句:由於伺服器政策,我們無法安裝 Obj-C 運行時和其他所需的庫並直接在金屬上運行我們的軟體。
虛擬機器配置摘錄:
- 記憶體大小:4000MB
- 頁面融合:關閉
- 顯示記憶體大小:12MB
- HPET:關閉
- 晶片組:piix3
- 韌體:BIOS
- CPU數量:24
- 合成CPU:關閉
- CPUID 覆蓋:無
- ACPI:開啟
- IOAPIC:開啟
- PAE:關閉
- 時間偏移:0毫秒
- 即時時鐘: 世界標準時間
- 硬體. virt.ext:打開
- 硬體. virt.ext 獨佔:關閉
- 嵌套分頁:開
- 大頁面:開
- VT-x VPID:開啟
- 3D 加速:關閉
- 2D 視訊加速:關閉
- 新增運行等級:2
- 配置的記憶體氣球大小:0 MB
答案1
我在這裡吐痰,但是......在 GUI 上,右鍵單擊 Kubuntu 實例,然後在它未運行時選擇設定。檢查一下您的 CPU 是否受到限制。您可能想看看您的系統如何回應選擇 20 或 22 個 CPU(而不是 24 個)來緩解虛擬機器和主機箱之間的資源競爭。然後嘗試使用 20 個執行緒運行單一實例。我預計機器上的 20 個核心的 CPU 會達到峰值,而其餘 4 個核心也會增加到 100%,同時盡力跟上。除了您的虛擬機器之外,您的電腦上是否還運行著其他應用程式?