シナプス技術者ブログ

シナプスの技術者公式ブログ。インターネットで、鹿児島の毎日を笑顔にします。

kvmで動的リソース変更が可能なゲストOSを作る

技術部ネットワーク課の上曽山です。
kvmのゲストOSでメモリやCPU数を変更したい時、「設定ファイルを書き換えて再起動」という方法をとっていましたが、サーバを停止させず動的に変更する事も出来ると聞いたので実際に試してみました。

検証環境

検証を行ったホストOSの環境は以下の通りです。

バージョン
OS CentOS Linux release 7.5.1804
qemu qemu-kvm-ev-2.10.0-21.el7_5.4.1.x86_64
libvirt libvirt-3.9.0-14.el7_5.6.x86_64

ゲストOS作成

virt-installコマンドを使って検証用のゲストOSを作成します。
今回はリソース変更の動作確認だけ出来ればいいのでネットワークは接続しません。

virt-install \
  --name resource_test \
  --disk pool=default,size=30 \
  --network none \
  --os-variant rhel7 \
  --location '/path/to/CentOS-7-x86_64-Minimal-2003.iso' \
  --extra-args='console=tty0 console=ttyS0,115200n8r' \
  --noautoconsole \
  --vcpus 2,maxvcpus=4 \     # CPUを「デフォルト=2コア、MAX=4コア」に設定。
  --memory 4096,maxmemory=8192  # メモリを「デフォルト=4G、MAX=8G」に設定。

参考までに、設定はこうなっています。currentが起動時に適用される値になります。

  <memory unit='KiB'>8388608</memory>
  <currentMemory unit='KiB'>4194304</currentMemory>
  <vcpu placement='static' current='2'>4</vcpu>

作業に戻って、コンソールログイン後、CLIでOSインストールを開始します。

virsh console resource_test

f:id:kanimisoya:20200510163359j:plain

これで検証用ゲストOSの準備は完了です。

メモリの量を変えてみる

ホストOSで下記のコマンドを実行するとメモリを変更する事が出来ます。

virsh setmem ゲストOS名 容量

ただし、max以上に増やす事は出来ません。

[root@kvmhost ~]# virsh setmem resource_test 10G
error: invalid argument: cannot set memory higher than max memory

また、メモリを0にする事も出来ません。

[root@kvmhost ~]# virsh setmem resource_test 0G
error: memory in virDomainSetMemory must not be zero

0より大きい数ならいくらでも設定出来るとは言え、メモリを減らし過ぎるとゲストOS側でカーネルpanicが起きるので、仕様を守って適切に設定しましょう。

実際にメモリを変更してみる
ゲストOSのメモリを確認します。現在のメモリは4Gです。

[root@resource_test ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3885         127        3667           8          90        3574
Swap:          3071           0        3071

メモリを増やします。(4G→6G)

[root@kvmhost ~]# virsh setmem resource_test 6G

再度ゲストOSのメモリを確認。6Gに増えています。

[root@resource_test ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           5933         128        5714           8          90        5622
Swap:          3071           0        3071

CPUのコア数を変えてみる

ホストOSで下記のコマンドを実行するとコア数を変更する事が出来ます。

virsh setvcpus ゲストOS名 CPUコア数

こちらもmax以上に増やす事は出来ません。

[root@kvmhost ~]# virsh setvcpus resource_test 5
error: invalid argument: requested vcpus is greater than max allowable vcpus for the live domain: 5 > 4

メモリと違って、起動時の数より少なくする事は出来ません。

[root@kvmhost ~]# virsh setvcpus resource_test 1
error: unsupported configuration: failed to find appropriate hotpluggable vcpus to reach the desired target vcpu count

メモリ同様、0にする事も出来ません。

[root@kvmhost ~]# virsh setvcpus resource_test 0
error: Can't set 0 processors for a VM

実際にコア数を変更してみる
まずは現在値の確認。起動時は2コアです。

[root@resource_test ~]# grep processor /proc/cpuinfo
processor       : 0
processor       : 1

CPUを1コア増やしてみます。(2コア→3コア)

[root@kvmhost ~]# virsh setvcpus resource_test 3

ゲストOS側を確認します。コア数が3に増えています。

[root@resource_test ~]# grep processor /proc/cpuinfo
processor       : 0
processor       : 1
processor       : 2

CPUの増減についてはログでも確認出来ます。
コア追加時のログ

resource_test kernel: CPU2 has been hot-added
resource_test kernel: smpboot: Booting Node 0 Processor 2 APIC 0x2
resource_test kernel: kvm-clock: cpu 2, msr 2:3ff85081, secondary cpu clock
resource_test kernel: smpboot: CPU 2 Converting physical 0 to logical die 2
resource_test kernel: KVM setup async PF for cpu 2
resource_test kernel: kvm-stealtime: cpu 2, msr 23fd1c040
resource_test kernel: Will online and init hotplugged CPU: 2

コア削減時のログ

resource_test kernel: Unregister pv shared memory for cpu 2
resource_test kernel: smpboot: CPU 2 is now offline

最後に

実際にゲストOSの動的リソース変更を試す事が出来ました。
しかしながら、これを活かすシチュエーションが思いつきません。
 # 増やすために確保しているリソースって無駄だよね。余裕があるなら最初から使えば良いのに。
 # そもそもリソースを減らす必要性ってあるの?
まあ、出来る事をすべて活用する必要も無いんですけど。

技術を生かすも殺すもアイディア次第。何か使い道が無いか、考え続けていきたいと思います。