]> git.proxmox.com Git - qemu-server.git/blobdiff - PVE/QemuMigrate.pm
include additional info in snapshot list
[qemu-server.git] / PVE / QemuMigrate.pm
index 82eb61e7786600d895b772109abe43c06061c441..c6302b05b10b2cd9ecfd05cb652c0f169948abc9 100644 (file)
@@ -325,6 +325,21 @@ sub phase2 {
     # start migration
 
     my $start = time();
+
+    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
+    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");
     };
@@ -333,15 +348,28 @@ sub phase2 {
     my $lstat = 0;
     my $usleep = 2000000;
     my $i = 0;
+    my $err_count = 0;
     while (1) {
        $i++;
        my $avglstat = $lstat/$i if $lstat;
 
-       usleep ($usleep);
-       my $stat = PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "query-migrate");
+       usleep($usleep);
+       my $stat;
+       eval {
+           $stat = PVE::QemuServer::vm_mon_cmd_nocheck($vmid, "query-migrate");
+       };
+       if (my $err = $@) {
+           $err_count++;
+           warn "query migrate failed: $err\n";
+           if ($err_count <= 5) {
+               usleep(1000000);
+               next;
+           }
+           die "too many query migrate failures - aborting\n";
+       }
        if ($stat->{status} =~ m/^(active|completed|failed|cancelled)$/im) {
            $merr = undef;
-
+           $err_count = 0;
            if ($stat->{status} eq 'completed') {
                my $delay = time() - $start;
                if ($delay > 0) {
@@ -363,11 +391,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;
+               $usleep = 300000 if $avglstat && $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};