けさらんぱの自由帳

とあるFF14プレイヤーがFF14のこととか関係ないことを書いていく予定のブログです。記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

FF14をLinuxの仮想環境で動かす話・GVT-g編

以前、PCIパススルーを使ってGPUをゲストOS側に完全にパススルーしてFF14Linux上で動かす話をしました。今回は、完全なパススルーではなく、Mediated Passthroughというもので仮想GPUを作成し、それでFF14ベンチマークを動かしてみるお話です。GVT-gというのは、Intelによる仮想GPUの実装をそのように呼ぶみたいです。

ベンチマーク結果

まずは結果から。ベアメタル環境。 f:id:KesaranPa:20180502005244p:plain

GVT-gを使った仮想環境。CPUやメモリを半分しか割り当てていないこともあり、60%ぐらいに落ち込んでいます。 f:id:KesaranPa:20180502005255p:plain

前回の完全パススルーを使ったときは常用を目的にしていたし、実際に常用していますが、今回は元々非力な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から起動します。

記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。