ホーム » 技術 » Linux KVM » KVMを使う(LiveMigration編)

SAKURA Internet Inc.

アーカイブ

KVMを使う(LiveMigration編)

仮想サーバの醍醐味(?)のひとつに、Migration(マイグレーション)機能があります。KVMは仮想サーバのセーブとロード、offlineおよびlive migrationのそれぞれに対応している、と主張しています。今回はこれを確かめてみることにしましょう。

Migration機能とは

Migrationとは、仮想サーバをあるホストサーバから別のサーバへ移動させる機能のことです。たとえば「ホストサーバの負荷が高まったので、複数のゲストサーバのうちいくつかを他へ移動して、負荷を分散させたい」としましょう。通常であればいったんゲストサーバをシャットダウンし、新しいホスト上で再起動する手順を踏む必要があります。Migration機能はゲストサーバをシャットダウンすることなく、サーバの状態(プロセス、メモリ、ディスクなど)を一時的に停止してコピーし、新しいホスト上で再開させることができます。これによりサーバの移動が非常にスムーズになるというわけです。

Migration機能とは

特にLiveMigrationと呼ばれる機能は、可能な限りゲストサーバを落とすことなく移動させる技術です。その行程はおおよそ以下の通りです。

  1. あらかじめ転送先のゲストサーバを設定し起動する。このときpauseオプションを付けて停止状態にしておく
  2. 転送元ゲストサーバに、転送先を指定してMigrationコマンドを送る
  3. 転送元ゲストは自らの状態を転送先にコピーする
    1. ディスクは共有されていることを前提としてコピーしない
    2. メモリをコピーし、転送先に送りこむ
    3. プロセス状態のスナップショットを保存し、これも転送先に送る
    4. すべてが終わったら自らをpauseする
  4. 転送先ゲストはコピー完了と同時に起動する
    1. ディスクは共有状態なのですぐに使えるようになる
    2. メモリを受け取り展開する
    3. プロセス状態も同様に展開し、レジスタ等をセットする
    4. 準備ができたら自らのpauseを解除する

肝心なのは、3から4までの間をいかにスムーズに行うかということです。特に動作中のプロセスをコピーする瞬間は、どうしても処理を停止せざるを得ません。この停止時間をなるべく短くするために、メモリのコピーはダイナミックに行われます。

  1. プロセスを動かしたままメモリのコピーを行う
  2. ある程度の分量が移動したらプロセスを停止させ、最後までコピーを行う
  3. プロセスが動いている間に書き換えられたメモリを再度転送する
ダイナミックなメモリのコピー

このような工夫により、プロセスの停止時間を数秒単位に縮めることができます。実際に試してみましょう。

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の動作が続行されます)することもあり得ます。いろいろ負荷をかけてテストしてみると面白いでしょう。

参考文献


1件のコメント

コメントは停止中です。