以前、PCIパススルーを使ってGPUをゲストOS側に完全にパススルーしてFF14をLinux上で動かす話をしました。今回は、完全なパススルーではなく、Mediated Passthroughというもので仮想GPUを作成し、それでFF14のベンチマークを動かしてみるお話です。GVT-gというのは、Intelによる仮想GPUの実装をそのように呼ぶみたいです。
ベンチマーク結果
まずは結果から。ベアメタル環境。
GVT-gを使った仮想環境。CPUやメモリを半分しか割り当てていないこともあり、60%ぐらいに落ち込んでいます。
前回の完全パススルーを使ったときは常用を目的にしていたし、実際に常用していますが、今回は元々非力なIntel NUC6i5SYH上で、しかも仮想環境で動かしているので、常用はかなり厳しいです。
テスト環境
ハードウェアは2世代ほど前のものですが、ソフトウェアはかなり最新で、LinuxカーネルもQEmuもここ数週間にリリースされたものが必要です(この記事を書いている時点で、qemu-2.12.0-1はtestingにしかありません)。
手順
カーネルコマンドラインに以下のオプションを追加します。 i915.enable_gvt=1
はGVT-gを有効にします。 kvm.ignore_msrs=1
は特殊なレジスタへのアクセスを無視します(たまにアクセスするプログラムがあるらしい)。
i915.enable_gvt=1 kvm.ignore_msrs=1 intel_iommu=on
Linuxが起動したら、下記のようにして、Mediated Deviceを作成します。 echo
の引数はUUIDです。 uuidgen
とかで作成します。 i915-GVTg_V5_1
以外にもいくつかのディレクトリがありますが、vGPUに割り当たるメモリ量なんかが違うみたいです。ディレクトリ名の最後の数字は、作成できるvGPUの数を表しているようです。
% echo XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX | sudo tee /sys/class/mdev_bus/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_1/create
次に、Libvirtの設定を書き換えます。自分が今回書き換えた箇所のうち、重要な部分は下記の部分です。QEmuのカスタム引数を使用しています。また海外サイトによると、OVMFでは問題があるようなので、SeaBIOSを使用しています。 x-igd-opregion=on
は内蔵GPUのときに必要になるようです。
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> ... <os> <type arch='x86_64' machine='q35'>hvm</type> </os> ... <devices> ... <graphics type='spice' keymap='en-us'> <listen type='none'/> <gl enable='yes' rendernode='/dev/dri/by-path/pci-0000:00:02.0-render'/> </graphics> ... <video> <model type='cirrus' vram='16384' heads='1' primary='yes'/> <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x2'/> </video> <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci'> <source> <address uuid='XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </hostdev> ... </devices> <qemu:commandline> <qemu:arg value='-set'/> <qemu:arg value='device.video0.driver=ne2k_pci'/> <qemu:arg value='-set'/> <qemu:arg value='device.hostdev0.x-igd-opregion=on'/> </qemu:commandline> </domain>
他にゲームパッド等の必要なデバイスの設定も行い、virt-managerから起動します。