From e18b0b99649a632f1f29f2fd8b1dab02256fb430 Mon Sep 17 00:00:00 2001 From: Alexandre Derumier Date: Tue, 28 Aug 2012 12:46:08 +0200 Subject: [PATCH] livemigrate : activate xbzrle cache This help migrate for vm with of lot of memory access (like database) live migration tests working: kvm 1.2 -> kvm 1.2 (xbzrle set on both side) kvm 1.1 -> kvm 1.2 (xbzrle on target) kvm 1.1 -> kvm 1.1 (xbzrle not set, qmp command try to set xbzrle but fail) failing migration kvm 1.2 -> kvm 1.1 fail, but this is expected. I tested with a memory benchmark running on the vm with 4GB ram without xbzrle : migration take 10min, with many network hang with xbzrle : migration take 1min, no hang I display xbzrle counters for debug purpose, we can remove them later Signed-off-by: Alexandre Derumier --- PVE/QemuMigrate.pm | 22 ++++++++++++++++++++++ PVE/QemuServer.pm | 7 +++++++ 2 files changed, 29 insertions(+) diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm index 82eb61e7..335bb326 100644 --- a/PVE/QemuMigrate.pm +++ b/PVE/QemuMigrate.pm @@ -325,6 +325,21 @@ sub phase2 { # start migration my $start = time(); + + my $capabilities = {}; + $capabilities->{capability} = "xbzrle"; + $capabilities->{state} = JSON::true; + + eval { + PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "migrate-set-capabilities", capabilities => [$capabilities]); + }; + + #set cachesize 10% of the total memory + my $cachesize = int($conf->{memory}*1048576/10); + eval { + PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "migrate-set-cache-size", value => $cachesize); + }; + eval { PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "migrate", uri => "tcp:localhost:$lport"); }; @@ -363,11 +378,18 @@ sub phase2 { my $trans = $stat->{ram}->{transferred} || 0; my $rem = $stat->{ram}->{remaining} || 0; my $total = $stat->{ram}->{total} || 0; + my $xbzrlecachesize = $stat->{"xbzrle-cache"}->{"cache-size"} || 0; + my $xbzrlebytes = $stat->{"xbzrle-cache"}->{"bytes"} || 0; + my $xbzrlepages = $stat->{"xbzrle-cache"}->{"pages"} || 0; + my $xbzrlecachemiss = $stat->{"xbzrle-cache"}->{"cache-miss"} || 0; + my $xbzrleoverflow = $stat->{"xbzrle-cache"}->{"overflow"} || 0; #reduce sleep if remainig memory if lower than the everage transfert $usleep = 300000 if $rem < $avglstat; $self->log('info', "migration status: $stat->{status} (transferred ${trans}, " . "remaining ${rem}), total ${total})"); + + $self->log('info', "migration xbzrle cachesize: ${xbzrlecachesize} transferred ${xbzrlebytes} pages ${xbzrlepages} cachemiss ${xbzrlecachemiss} overflow ${xbzrleoverflow}"); } $lstat = $stat->{ram}->{transferred}; diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index f2201135..f6bd358b 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -2790,6 +2790,13 @@ sub vm_start { eval { vm_mon_cmd($vmid, "migrate_set_downtime", value => $migrate_downtime); }; } + if($migratedfrom) { + my $capabilities = {}; + $capabilities->{capability} = "xbzrle"; + $capabilities->{state} = JSON::true; + eval { PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "migrate-set-capabilities", capabilities => [$capabilities]); }; + } + vm_balloonset($vmid, $conf->{balloon}) if $conf->{balloon}; });