Hotplug とはマシンを停止せずにCPU、メモリなどのデバイスを追加する技術です。CPU Hotplug を仮想環境で用いると、仮想マシンを停止することなく仮想CPUを追加し、処理能力を強化することができます。これにより、仮想マシンの無停止スケールアップを実現できます。
Qemuはversion1.5よりCPU Hotplug機能をサポートしています。今回はQemuでのCPU Hotplugの使い方についてご紹介します。
検証環境はFedora19です。
Qemu のコンパイル
Hotplugのサポートは1.5以降です。Qemuのversionが1.5未満の場合は最新のQemuをコンパイルしましょう。
# git clone git://git.qemu.org/qemu.git # cd qemu # ./configure --target-list=x86_64-softmmu # make # make install
CPU Hotplugの使い方は、複数あります。以下では、QMPを用いる方法とlibvirt(virsh, virt-manager)経由でCPU Hotplugする方法を記載します。
共通の前提
CPU Hotplug機能を使うためには、あらかじめ、Qemu を起動する時のパラメータ: maxcpus を2以上にしておく必要があります。CPU Hotplug可能な数の上限は maxcpus となります。例えば、
qemu ... -smp 1,maxcpus=4といった具合です。virsh では vcpu タグの要素が maxcpus に対応し、current属性の値が -smp X の Xに相当します。
QMPでのCPU Hotplug
QMP(Qemu Monitor Protocol)でQemuと通信してCPU Hotplugを実施します。
QMPの使い方については下記のブログがとても詳しいです。
Multiple ways to access Qemu Monitor Protocol(QMP)
QMPで下記のコマンドを送信します。
あとはゲスト内でCPUをonlineにします。
QMPの使い方については下記のブログがとても詳しいです。
Multiple ways to access Qemu Monitor Protocol(QMP)
QMPで下記のコマンドを送信します。
> {"execute":"cpu-add", "arguments" : { "id" : 1 } }arguments の id が Hotplug 対象の 仮想CPU です。この値は、0以上、maxcpus未満の整数をしていします。
あとはゲスト内でCPUをonlineにします。
# echo 1 > /sys/devices/system/cpu/cpu1/online/proc/cpuinfoなどで、Hotplugされたことを確認しましょう。
virsh での CPU Hotplug
libvirt が Qemu CPU Hotplug をサポートしているのは version 1.0.6.5 からですが、Fedora19 の libvirt 1.0.5.5 ではサポートされているので、それを使います。
関連コミット:
qemu: Implement new QMP command for cpu hotplug
注意: CPU Hotplugを使うには チップセットエミュレータのversionが1.5以上でないといけません。virsh edit で
<os> <type arch="x86_64" machine="pc-1.2">hvm</type> </os>を
<os> <type arch="x86_64" machine="pc-1.5">hvm</type> </os>に変更してください。
virsh setvcpus コマンドで仮想CPUをHotplugします。仮想マシンの名前は hotplug としています。
# virsh vcpucount hotplug maximum config 4 maximum live 4 current config 1 current live 1 # virsh setvcpus hotplug # virsh vcpucount hotplug maximum config 4 maximum live 4 current config 1 current live 2あとはQMPでの場合と同様に、ゲスト内でHotplugされたCPUをonlineにするだけです。
virt-manager での CPU Hotplug
注意: virsh での CPU Hotplug と同様に、チップセットエミュレータのversionが1.5以上であることを確認しましょう。同様に、 libvirt の version についても確認しましょう。
virt-manager での CPU Hotplugは実は簡単で、下記仮想マシンの詳細管理画面で、CPUの"現在の割り当て"部分をポチポチして"適用"ボタンを押すだけです。便利だなぁ。
後は、Hotplug されたCPUをゲスト内でonlineにしましょう。
注意: virsh での CPU Hotplug と同様に、チップセットエミュレータのversionが1.5以上であることを確認しましょう。同様に、 libvirt の version についても確認しましょう。
virt-manager での CPU Hotplugは実は簡単で、下記仮想マシンの詳細管理画面で、CPUの"現在の割り当て"部分をポチポチして"適用"ボタンを押すだけです。便利だなぁ。
後は、Hotplug されたCPUをゲスト内でonlineにしましょう。
Qemu guest agent との連携
Hotplug されたCPUをいちいちゲスト内で online にするの、めんどくさいですね。そんなときは Qemu guest agent と連携してホストから CPU を online にしましょう。ゲストにQemu 1.5 以降の guest agent をインストールして起動したあと、ホストから "guest-set-vcpus" コマンドで guest agent 経由で CPU を online にできます。
guest agent の設定の仕方については下記の記事が詳しいです。
lost and found(for me?) : Fedora 19 KVM : qemu-guest-agent
virsh で CPU を Hotplug したあと、guest agent 経由で online にします。
# virsh qemu-agent-command hotplug '{"execute":"guest-get-vcpus"}' {"return":[{"online":true,"can-offline":false,"logical-id":0},{"online":true,"can-offline":true,"logical-id":1},{"online":true,"can-offline":true,"logical-id":2}]} # virsh setvcpus hotplug 2 # virsh qemu-agent-command hotplug '{"execute":"guest-get-vcpus"}' {"return":[{"online":true,"can-offline":false,"logical-id":0},{"online":false,"can-offline":true,"logical-id":1}]} # virsh qemu-agent-command hotplug '{"execute":"guest-set-vcpus", "arguments" : { "vcpus" : [{"online":true,"can-offline":false,"logical-id":0},{"online":true,"can-offline":true,"logical-id":1}] }}' {"return":2} [root@edge2 qemu]# virsh qemu-agent-command hotplug '{"execute":"guest-get-vcpus"}' {"return":[{"online":true,"can-offline":false,"logical-id":0},{"online":true,"can-offline":true,"logical-id":1}]}
/proc/cpuinfoでちゃんとonlineになってることを確認したらOKです。
参考文献
lost and found(for me?) : Fedora 19 KVM : qemu-guest-agent