技術部ネットワーク課の上曽山です。
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
これで検証用ゲスト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の動的リソース変更を試す事が出来ました。
しかしながら、これを活かすシチュエーションが思いつきません。
# 増やすために確保しているリソースって無駄だよね。余裕があるなら最初から使えば良いのに。
# そもそもリソースを減らす必要性ってあるの?
まあ、出来る事をすべて活用する必要も無いんですけど。
技術を生かすも殺すもアイディア次第。何か使い道が無いか、考え続けていきたいと思います。