This reduce guest cpu speed if dirtied bytes is 50% more than the approx.amount 
of bytes that just got transferred since the last time we were in this routine.

qemu commit :
http://git.qemu.org/?p=qemu.git;a=commit;h=bde1e2ec2176c363c1783bf8887b6b1beb08dfee

tested with "stress -m 2 -c 2" under debian

without autoconvergence : downtime 12s - duration 12min
with autoconvergence : downtime 2s - duration 4min

Signed-off-by: Alexandre Derumier <[email protected]>
---
 PVE/QemuMigrate.pm |    7 ++-----
 PVE/QemuServer.pm  |   36 +++++++++++++++++++++++++++++++-----
 2 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/PVE/QemuMigrate.pm b/PVE/QemuMigrate.pm
index d980f0b..f5c86c8 100644
--- a/PVE/QemuMigrate.pm
+++ b/PVE/QemuMigrate.pm
@@ -385,13 +385,10 @@ sub phase2 {
        $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]);
+       PVE::QemuServer::set_migration_caps($vmid);
     };
+    warn $@ if $@;
 
     #set cachesize 10% of the total memory
     my $cachesize = int($conf->{memory}*1048576/10);
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index a5576a6..591a863 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -3094,6 +3094,32 @@ sub qga_unfreezefs {
     #need to impplement call to qemu-ga
 }
 
+sub PVE::QemuServer::set_migration_caps { 
+    my ($vmid) = @_; 
+
+    my @capabilities = ();
+    my $cap_ref = \@capabilities;
+
+    my $enabled_cap = {
+       "auto-converge" => 1,
+       "xbzrle" => 0,
+       "x-rdma-pin-all" => 0,
+       "zero-blocks" => 0,
+    };
+
+    my $supported_capabilities = PVE::QemuServer::vm_mon_cmd_nocheck($vmid, 
"query-migrate-capabilities");
+
+    for my $supported_capability (@$supported_capabilities){
+       if($enabled_cap->{$supported_capability->{capability}} eq 1){
+           my $capability->{capability} = $supported_capability->{capability};
+           $capability->{state} = JSON::true;
+           push(@$cap_ref,$capability);
+        }
+    }
+
+    PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "migrate-set-capabilities", 
capabilities => $cap_ref);
+} 
+
 sub vm_start {
     my ($storecfg, $vmid, $statefile, $skiplock, $migratedfrom, $paused, 
$forcemachine, $spice_ticket) = @_;
 
@@ -3160,12 +3186,12 @@ sub vm_start {
        }
 
        if ($migratedfrom) {
-           my $capabilities = {};
-           $capabilities->{capability} =  "xbzrle";
-           $capabilities->{state} = JSON::true;
-           eval { vm_mon_cmd_nocheck($vmid, "migrate-set-capabilities", 
capabilities => [$capabilities]); };
+
+           eval {
+               PVE::QemuServer::set_migration_caps($vmid);
+           };
            warn $@ if $@;
-           
+
            if ($spice_port) {
                print "spice listens on port $spice_port\n";
                if ($spice_ticket) {
-- 
1.7.10.4

_______________________________________________
pve-devel mailing list
[email protected]
http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to