読者です 読者をやめる 読者になる 読者になる

TECHLOGICS

HYLOGICS分室。作業メモやガジェットのレビューなど、主に技術系のエントリを取り扱います。

【CentOS7】QEMU/KVMにおけるインスタンスのメモリーチューニング

前置き

QEMU/KVM上でdGPU(GTX970)をパススルーしたWindows10インスタンスの挙動が不安定なのでチューニングを試みる

環境は以下の通り

CentOS7 + QEMU 2.5.0

$ cat /etc/centos-release
CentOS Linux release 7.2.1511 (Core)

$ qemu-system-x86_64 --version
QEMU emulator version 2.5.0, Copyright (c) 2003-2008 Fabrice Bellard

また、今回作業対象のインスタンス名はgtx970_imgとする。

検討

以下のサイトを参考にしながらパフォーマンスチューニングを検討する。

OVMF による PCI パススルー

7.3. 仮想マシン上でのメモリーチューニング

この中で既にCPUピニングの設定は完了しているので、今回はメモリ関連に焦点を当て以下の事項を設定していくこととする。

  1. locked - ゲストに属するメモリーページのスワップアウトを無効化
  2. nosharepages - ゲスト間の共有ページの無効化
  3. hugepages - 静的hugepageの導入

1. locked

— 追記 —

hard_limitlockedの設定をしたところインスタンスが2回連続で起動時/起動直後にフリーズしたため、最終的にこれらは除外することとした。以下はフリーズ時に出力されたエラーメッセージである。

Jan 28 13:05:01 office kernel: traps: CPU 3/KVM[7142] trap int3 ip:7fa266a758d3 sp:7fa25eba0c90 error:0

よって今回は本項を実施する必要がなかったが、参考のため削除せず残しておくこととする。

— 追記ここまで —

事前にmemtunehard_limitの値を設定しておかないとインスタンス起動時に初期化に失敗するので注意。

hard_limit設定前

hard_limit     : unlimited
soft_limit     : unlimited
swap_hard_limit: unlimited

hard_limit設定変更

sudo virsh memtune gtx970_img --hard-limit 10240000 --config

hard_limit設定後

$ sudo virsh memtune gtx970_img
hard_limit     : 10240000
soft_limit     : unlimited
swap_hard_limit: unlimited

hard_limitの値はmemoryの設定より多めに指定する必要がある。

今回作業したインスタンスmemoryは以下の通り8388608なのだが、hard_limitは9000000では動作せず、10240000で動作した。

  <memory unit='KiB'>8388608</memory>
  <currentMemory unit='KiB'>8388608</currentMemory>

hard_limitを設定が完了したところでXMLに以下の設定を追加。

  <memoryBacking>
    <locked/>
  </memoryBacking>

2. nosharepages

XMLに以下の設定を追加する。

  <memoryBacking>
    <nosharepages/>
  </memoryBacking>

3. hugepages

事前にカーネルパラメータのvm.nr_hugepagesを設定をしておく必要がある。

hugepagesにどれだけ割り当てるかはインスタンスのメモリ使用量をページサイズで割るとよい。ページサイズはmeminfoで確認することができる。

$ cat /proc/meminfo | grep Hugepagesize
Hugepagesize:       2048 kB

今回はインスタンスの割り当てメモリが8GBなので4000以上、余裕を見て4500を割り当てることとした。

vm.nr_hugepages変更前

$ sysctl -n vm.nr_hugepages
0

hugepages変更

$ sysctl -w vm.nr_hugepages=4500

vm.nr_hugepages変更後

$ sysctl -n vm.nr_hugepages
4500

XMLに以下の設定を追加した後、

  <memoryBacking>
    <hugepages/>
  </memoryBacking>

実際にインスタンスを起動して確認してみる。

$ cat /proc/meminfo | grep Huge
AnonHugePages:   1961984 kB
HugePages_Total:    4500
HugePages_Free:      404
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

動作に問題がなければカーネルパラメータの設定をファイルに書き出しておく。

$ cat /etc/sysctl.d/01-hugepages.conf
vm.nr_hugepages=4500

以上