仮想サーバの醍醐味(?)のひとつに、Migration(マイグレーション)機能があります。KVMは仮想サーバのセーブとロード、offlineおよびlive migrationのそれぞれに対応している、と主張しています。今回はこれを確かめてみることにしましょう。
Migration機能とは
Migrationとは、仮想サーバをあるホストサーバから別のサーバへ移動させる機能のことです。たとえば「ホストサーバの負荷が高まったので、複数のゲストサーバのうちいくつかを他へ移動して、負荷を分散させたい」としましょう。通常であればいったんゲストサーバをシャットダウンし、新しいホスト上で再起動する手順を踏む必要があります。Migration機能はゲストサーバをシャットダウンすることなく、サーバの状態(プロセス、メモリ、ディスクなど)を一時的に停止してコピーし、新しいホスト上で再開させることができます。これによりサーバの移動が非常にスムーズになるというわけです。
特にLiveMigrationと呼ばれる機能は、可能な限りゲストサーバを落とすことなく移動させる技術です。その行程はおおよそ以下の通りです。
- あらかじめ転送先のゲストサーバを設定し起動する。このときpauseオプションを付けて停止状態にしておく
- 転送元ゲストサーバに、転送先を指定してMigrationコマンドを送る
- 転送元ゲストは自らの状態を転送先にコピーする
- ディスクは共有されていることを前提としてコピーしない
- メモリをコピーし、転送先に送りこむ
- プロセス状態のスナップショットを保存し、これも転送先に送る
- すべてが終わったら自らをpauseする
- 転送先ゲストはコピー完了と同時に起動する
- ディスクは共有状態なのですぐに使えるようになる
- メモリを受け取り展開する
- プロセス状態も同様に展開し、レジスタ等をセットする
- 準備ができたら自らのpauseを解除する
肝心なのは、3から4までの間をいかにスムーズに行うかということです。特に動作中のプロセスをコピーする瞬間は、どうしても処理を停止せざるを得ません。この停止時間をなるべく短くするために、メモリのコピーはダイナミックに行われます。
- プロセスを動かしたままメモリのコピーを行う
- ある程度の分量が移動したらプロセスを停止させ、最後までコピーを行う
- プロセスが動いている間に書き換えられたメモリを再度転送する
このような工夫により、プロセスの停止時間を数秒単位に縮めることができます。実際に試してみましょう。
KVM(qemu)のLiveMigration
2台のホストサーバ(転送元と転送先)と共有ファイルシステムとしてNFSサーバを1台用意します。NFSサーバはなんでもOKですが、ホストサーバは同一スペックでなければいけません。転送元のホストを192.168.12.45、転送先ホストを192.168.12.46とします。なお、2台のホストから見たNFSサーバのマウントポイントは、同じpathになっていることが望ましいようです。
まず192.168.12.45上で、VMをひとつ起動します。ネットワーク設定も含め、お好きなスペックのゲストを起動しましょう。ネットワークも設定できます。ここでは192.168.12.100とします。ネットワーク設定編で紹介した通り、ブリッジ経由でアクセス可能なようにしておけば、LiveMigration時にIPアドレスごと移動できます。
つづいて転送先ホスト192.168.12.46で、待機状態のVMをひとつ作成します。LiveMigrate用の待機ホストを作成するには、-incomingオプションを付与します。
host2# qemu-system-x86_64 -hda /nfs/kvm/vm01.img -m 512 ... -incoming tcp:0:4449
-incomingオプションの3つ目のパラメータはポート番号で、LiveMigrateをするときに指定することになるのでメモしておきます。
それではいよいよ移動開始です。転送元ゲストの、qemuモニタに接続します。
host1# telnet localhost 4444 Trying 127.0.0.1... Connected to localhost. Escape character is '^]' QEMU 0.12.4 monitor - type 'help' for more information (qemu) info status VM status: running
info statusをチェックすると動作中であると分ります。
migrate_set_speedコマンドを使って、データ転送帯域を指定します。ここでは1Gbpsにしてみます。
(qemu) migrate_set_speed 1g
migrateコマンドを使って、転送先ホストのIPアドレスとポート番号を指定し、LiveMigrateを開始します。migrateコマンドには-dオプションを付けておきましょう。
(qemu) migrate -d tcp:192.168.12.46:4449
コマンドを実行すると、すぐにLiveMigrateが始まります。しかしプログレスメータ等は表示されないので、info migrateコマンドを使って手動でチェックしなければいけません。
(qemu) info migrate Migration status: active transferred ram: 9656 kbytes remaining ram: 531272 kbytes total ram 540928 kbytes
info migrateを何度か実行していると、少しずつtransferredが増え、remainingが減っていきます。そしてある時点で転送元VMがpauseされ、残りが一気に転送されて移動が完了します。
(qemu) info migrate Migration status: active transferred ram: 283164 kbytes remaining ram: 261924 kbyes total ram: 540928 kbytes (qemu) info migrate Migration status: completed
migrateコマンド投入からcompleteまで約12秒、最終コピー時のpauseは一瞬で、1秒間隔で打ったpingや、VMにtelnetで接続したコンソール画面には何の異常も発生しませんでした。この実験では単にVMの移動をやっただけなので負荷がかかっていません。メモリ量が増えたり、プロセスやトラフィックなどの負荷がかかった場合は、開始から完了までに長時間かかったり、Migrateが失敗(キャンセルして元のVMの動作が続行されます)することもあり得ます。いろいろ負荷をかけてテストしてみると面白いでしょう。
[…] This post was mentioned on Twitter by まっちゃだいふく and connect24h, 鷲北 賢. 鷲北 賢 said: さくらインターネット研究所ブログ KVMを使う(LiveMigration編) http://research.sakura.ad.jp/2010/06/23/kvm-migration/ […]