今月の日経SYSTEM(3月号)でOSを動かしながら東京から大阪に遠隔KVMライブマイグレーションする検証記事を書きました。
http://ec.nikkeibp.co.jp/item/backno/OS0227.html
記事書いている時に1G NICを使ってるわりに遅くて、この調査に手こずってしまった。
その時、QEMUのmigrate_set_speed
ついて調べたので補足。
QEMUにはマイグレーションの帯域を制御できそうなコマンド、migrate_set_speed
が用意されている。
これは、migration.cの
static int64_t max_throttle = (32 << 20);
で定義されていて、デフォルトで32MByte/secになっているのでこれを増やせば早くなるかな、と思いきやそういう訳でもなかった。という話も記事に書いたので気になる人は読んでみてね。
この現代になんで32MByte/secがデフォルトなのか不思議に思ってたら、ML上のみんなも不思議がってた。
https://www.redhat.com/archives/libvir-list/2011-August/msg00168.html
詳しく調べてみるとこのmigrate_set_speed
は仮想マシンの動作と密接に絡んでいて、ゲストOSが動作しているクロックの合間を縫ってマイグレーションの処理を行うという実装になっている。
だから、デフォルトで正確に32MByte/secに制限されているというわけでもないし、増やした所で指定した通りの速度が出るわけではない。
詳しくはbuffered_file.cのbuffered_rate_tick()
あたりが参考になる。
それよりも、移行先でのディスクのsync(2)がネックになってたのでこっちを工夫したほうが良い、という結論でした。