# 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");
};
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) {
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};