仮想マシン内でマルチスレッド レンダリング ソフトウェアを実行すると、パフォーマンスに問題が生じます。
私たちは、Debian (6.0.6、2.6.32-5-amd64) コンピューティング サーバーでヘッドレスで実行される VirtualBox 4.0.10_Debianr72436 で Kubuntu 12.04 を実行しています。このサーバーには、ハイパースレッディング機能を備えた 2*6 コアの Intel Xeon X5660 プロセッサと約 64 GB の動作メモリが搭載されています。私たちは、TigerVNC Viewer for X バージョン 1.1.0 を介して VM に接続します。仮想マシンは現在、24 コアすべてを使用するように設定されていますが、コア数を減らすように設定した場合 (たとえば、12)、以下に説明する問題が発生することがあります。
問題:
レンダラーをレンダリング スレッド 1 つだけで実行すると、他のマシン (Intel Core 2 Duo MacBook) の Metal 上で直接実行した場合と同等の速度で実行されます。ただし、作業スレッドの数を増やしても、速度はわずかにしか上がらず (1/n からはほど遠い)、スレッドが 5 個程度になると実際に速度が低下し始めます。スレッドが 8 個以上になると、シングル スレッド アプリケーションよりもさらに遅くなります。レンダラーを MacBook の Metal 上で直接実行すると、実行するスレッドの数を指定しても問題はありません。たとえば、デュアル コア CPU の 16 スレッドは、2 スレッド インスタンスと同じ速度で実行されます。
次に、レンダラーの複数のシングルスレッド インスタンスを並列で実行してみましたが、驚くべき結果になりました。4 つのインスタンスを実行すると、すべてが正常で、1 つのインスタンスと同じような速度で実行されますが、6 つのインスタンスを実行すると、すべてが約 50% 遅くなります。
また、他のレンダラー (pbrt v.2) を実行して、他のレンダラーの性能とその結果の方が優れているかどうかをテストしてみました。13 スレッドまではうまくスケールしましたが、その後は速度が低下しました (ただし、当社のソフトウェアほどではありません)。
私たちのレンダラーは、Objective C と C およびアセンブラを組み合わせて書かれています。共有データにアクセスするために、コード内で XADD および CAS 操作を使用しています。この 2 つが問題の原因である可能性が強く疑われています。これについて何かアイデアはありますか?
ところで、サーバー ポリシーにより、Obj-C ランタイムやその他の必要なライブラリをインストールして、ソフトウェアをメタル上で直接実行することはできません。
VM 構成の抜粋:
- メモリサイズ: 4000MB
- ページ融合: オフ
- VRAMサイズ: 12MB
- HPET: オフ
- チップセット: piix3
- ファームウェア: BIOS
- CPU数: 24
- 合成CPU: オフ
- CPUID オーバーライド: なし
- ACPI: オン
- IOAPIC: オン
- PAE: オフ
- 時間オフセット: 0 ミリ秒
- 時刻: UTC
- ハードウェア virt.ext: オン
- ハードウェア virt.ext 排他: オフ
- ネストされたページング: オン
- 大きなページ: オン
- VT-x VPID: オン
- 3Dアクセラレーション: オフ
- 2Dビデオアクセラレーション: オフ
- 追加実行レベル: 2
- 構成されたメモリ バルーン サイズ: 0 MB
答え1
思いつきで言っていますが... GUI で、Kubuntu インスタンスを右クリックし、実行していないときに設定を選択します。そこで CPU が制限されていないかどうかを確認します。仮想ボックスとホスト ボックス間のリソース競合を軽減するために、24 ではなく 20 または 22 の CPU を選択した場合にシステムがどのように応答するかを確認する必要があります。次に、20 スレッドで単一のインスタンスを実行してみてください。マシンの CPU が 20 コアで急上昇し、残りの 4 つも追いつこうとして 100% に増加すると予想されます。このマシンでは、VM 以外のアプリケーションを実行していますか?