[pve-devel] [PATCH] - fix setting migration parameters

Alexandre DERUMIER aderumier at odiso.com
Thu Dec 27 07:36:16 CET 2012


> 
> changelog by aderumier 
> 
> - remove default value of 1s for migrate_downtime 

>>>why? - we added that because the default cause seroius problems! 
 This was because of stefan problem, and qemu 1.3 seem to doing migration fine with default 30ms.
 What block the monitor exactly ? too low migrate_downtime ?

> - add logs downtime and expected downtime migration stats 

>>Please can you send an extra patch for that? 
sure no problem

> - only send qmp migrate_downtime if migrate_downtime is defined 

I want to have that as default (set on startup). 

> - add errors logs on qm start of target vm. 

>>great, but can we have an extra commit for that? Those changes seems to be unrelated. 
sure no problem


----- Mail original ----- 

De: "Dietmar Maurer" <dietmar at proxmox.com> 
À: "Alexandre Derumier" <aderumier at odiso.com>, pve-devel at pve.proxmox.com 
Envoyé: Jeudi 27 Décembre 2012 07:21:38 
Objet: RE: [pve-devel] [PATCH] - fix setting migration parameters 

> - move migration speed/downtime from QemuServer vm_start to 
> QemuMigrate phase2 

This is not needed - or why do we need that? 

> - lower default migration downtime value to 0 
> 
> changelog by aderumier 
> 
> - remove default value of 1s for migrate_downtime 

why? - we added that because the default cause seroius problems! 

> - add logs downtime and expected downtime migration stats 

Please can you send an extra patch for that? 

> - only send qmp migrate_downtime if migrate_downtime is defined 

I want to have that as default (set on startup). 

> - add errors logs on qm start of target vm. 

great, but can we have an extra commit for that? Those changes seems to be unrelated. 

> - cast int() for json values 
> 
> tested with youtube video playing, no qmp migrate_downtime (default of 
> 30ms), the downtime is around 500-600ms. 
> --- 
> PVE/QemuMigrate.pm | 43 +++++++++++++++++++++++++++++++++++------- 
> - 
> PVE/QemuServer.pm | 16 ---------------- 
> 2 files changed, 35 insertions(+), 24 deletions(-) 
> 
> diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm index 
> 0711681..dbbeb69 100644 
> --- a/PVE/QemuMigrate.pm 
> +++ b/PVE/QemuMigrate.pm 
> @@ -312,7 +312,10 @@ sub phase2 { 
> if ($line =~ m/^migration listens on port (\d+)$/) { 
> $rport = $1; 
> } 
> - }, errfunc => sub {}); 
> + }, errfunc => sub { 
> + my $line = shift; 
> + print $line."\n"; 
> + }); 
> 
> die "unable to detect remote migration port\n" if !$rport; 
> 
> @@ -323,24 +326,46 @@ sub phase2 { 
> $self->{tunnel} = $self->fork_tunnel($self->{nodeip}, $lport, $rport); 
> 
> $self->log('info', "starting online/live migration on port $lport"); 
> - # start migration 
> 
> - my $start = time(); 
> + # load_defaults 
> + my $defaults = PVE::QemuServer::load_defaults(); 
> + 
> + # always set migrate speed (overwrite kvm default of 32m) 
> + # we set a very hight default of 8192m which is basically unlimited 
> + my $migrate_speed = $defaults->{migrate_speed} || 8192; 
> + $migrate_speed = $conf->{migrate_speed} || $migrate_speed; 
> + $migrate_speed = $migrate_speed * 1048576; 
> + $self->log('info', "migrate_set_speed: $migrate_speed"); 
> + eval { 
> + PVE::QemuServer::vm_mon_cmd_nocheck($vmid, 
> "migrate_set_speed", value => int($migrate_speed)); 
> + }; 
> + $self->log('info', "migrate_set_speed error: $@") if $@; 
> + 
> + my $migrate_downtime = $defaults->{migrate_downtime}; 
> + $migrate_downtime = $conf->{migrate_downtime} if defined($conf- 
> >{migrate_downtime}); 
> + if (defined($migrate_downtime)) { 
> + $self->log('info', "migrate_set_downtime: $migrate_downtime"); 
> + eval { 
> + PVE::QemuServer::vm_mon_cmd_nocheck($vmid, 
> "migrate_set_downtime", value => int($migrate_downtime)); 
> + }; 
> + $self->log('info', "migrate_set_downtime error: $@") if $@; 
> + } 
> 
> my $capabilities = {}; 
> $capabilities->{capability} = "xbzrle"; 
> $capabilities->{state} = JSON::false; 
> - 
> eval { 
> PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "migrate-set- 
> capabilities", capabilities => [$capabilities]); 
> }; 
> 
> - #set cachesize 10% of the total memory 
> + # 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); 
> }; 
> 
> + # start migration 
> + my $start = time(); 
> eval { 
> PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "migrate", uri => 
> "tcp:localhost:$lport"); 
> }; 
> @@ -353,7 +378,6 @@ sub phase2 { 
> while (1) { 
> $i++; 
> my $avglstat = $lstat/$i if $lstat; 
> - 
> usleep($usleep); 
> my $stat; 
> eval { 
> @@ -375,7 +399,8 @@ sub phase2 { 
> my $delay = time() - $start; 
> if ($delay > 0) { 
> my $mbps = sprintf "%.2f", $conf->{memory}/$delay; 
> - $self->log('info', "migration speed: $mbps MB/s"); 
> + $self->log('info', "migration speed: $mbps MB/s - 
> downtime 
> +$stat->{downtime} ms"); 
> + 
> } 
> } 
> 
> @@ -397,11 +422,13 @@ sub phase2 { 
> my $xbzrlepages = $stat->{"xbzrle-cache"}->{"pages"} || 0; 
> my $xbzrlecachemiss = $stat->{"xbzrle-cache"}->{"cache- 
> miss"} || 0; 
> my $xbzrleoverflow = $stat->{"xbzrle-cache"}->{"overflow"} 
> || 0; 
> + my $expected_downtime = $stat->{"expected-downtime"} || 
> 0; 
> + 
> #reduce sleep if remainig memory if lower than the everage 
> transfert 
> $usleep = 300000 if $avglstat && $rem < $avglstat; 
> 
> $self->log('info', "migration status: $stat->{status} 
> (transferred ${trans}, " . 
> - "remaining ${rem}), total ${total})"); 
> + "remaining ${rem}), total ${total}, expected 
> downtime 
> +${expected_downtime})"); 
> 
> #$self->log('info', "migration xbzrle cachesize: 
> ${xbzrlecachesize} transferred ${xbzrlebytes} pages ${xbzrlepages} cachemiss 
> ${xbzrlecachemiss} overflow ${xbzrleoverflow}"); 
> } 
> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index 
> 165eaf6..b168c74 100644 
> --- a/PVE/QemuServer.pm 
> +++ b/PVE/QemuServer.pm 
> @@ -385,7 +385,6 @@ EODESCR 
> type => 'integer', 
> description => "Set maximum tolerated downtime (in seconds) for 
> migrations.", 
> minimum => 0, 
> - default => 1, 
> }, 
> cdrom => { 
> optional => 1, 
> @@ -2976,21 +2975,6 @@ sub vm_start { 
> warn $@ if $@; 
> } 
> 
> - # always set migrate speed (overwrite kvm default of 32m) 
> - # we set a very hight default of 8192m which is basically unlimited 
> - my $migrate_speed = $defaults->{migrate_speed} || 8192; 
> - $migrate_speed = $conf->{migrate_speed} || $migrate_speed; 
> - $migrate_speed = $migrate_speed * 1048576; 
> - eval { 
> - vm_mon_cmd_nocheck($vmid, "migrate_set_speed", value => 
> $migrate_speed); 
> - }; 
> - 
> - my $migrate_downtime = $defaults->{migrate_downtime}; 
> - $migrate_downtime = $conf->{migrate_downtime} if defined($conf- 
> >{migrate_downtime}); 
> - if (defined($migrate_downtime)) { 
> - eval { vm_mon_cmd_nocheck($vmid, "migrate_set_downtime", 
> value => $migrate_downtime); }; 
> - } 
> - 
> if($migratedfrom) { 
> my $capabilities = {}; 
> $capabilities->{capability} = "xbzrle"; 
> -- 
> 1.7.10.4 
> 
> _______________________________________________ 
> pve-devel mailing list 
> pve-devel at pve.proxmox.com 
> http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel 



More information about the pve-devel mailing list