]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Add support for postcopy-requests migration statistics
authorJiri Denemark <jdenemar@redhat.com>
Thu, 15 Nov 2018 14:25:46 +0000 (15:25 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Mon, 17 Dec 2018 15:16:30 +0000 (16:16 +0100)
QEMU can report how many times during post-copy migration the domain
running on the destination host tried to access a page which has not
been migrated yet.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
include/libvirt/libvirt-domain.h
src/qemu/qemu_domain.c
src/qemu/qemu_migration_cookie.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
tools/virsh-domain.c

index 6a7494198f0a076270bcd2bb85794a9b7c0607f2..6125d450086814642c39b083f1f27e4746bb8731 100644 (file)
@@ -3422,6 +3422,16 @@ typedef enum {
  */
 # define VIR_DOMAIN_JOB_MEMORY_ITERATION         "memory_iteration"
 
+/**
+ * VIR_DOMAIN_JOB_MEMORY_POSTCOPY_REQS:
+ *
+ * virDomainGetJobStats field: number page requests received from the
+ * destination host during post-copy migration, as VIR_TYPED_PARAM_ULLONG.
+ * This counter is incremented whenever the migrated domain tries to access
+ * a memory page which has not been transferred from the source host yet.
+ */
+# define VIR_DOMAIN_JOB_MEMORY_POSTCOPY_REQS     "memory_postcopy_requests"
+
 /**
  * VIR_DOMAIN_JOB_DISK_TOTAL:
  *
index 05ea128525fd85688e8144e0605e743168753b42..6f10235b43f0886f0283a738ec305c2d8213865e 100644 (file)
@@ -607,7 +607,10 @@ qemuDomainMigrationJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
                                 stats->ram_dirty_rate) < 0 ||
         virTypedParamsAddULLong(&par, &npar, &maxpar,
                                 VIR_DOMAIN_JOB_MEMORY_ITERATION,
-                                stats->ram_iteration) < 0)
+                                stats->ram_iteration) < 0 ||
+        virTypedParamsAddULLong(&par, &npar, &maxpar,
+                                VIR_DOMAIN_JOB_MEMORY_POSTCOPY_REQS,
+                                stats->ram_postcopy_reqs) < 0)
         goto error;
 
     if (stats->ram_page_size > 0 &&
index 295e28ae309bb7742cb0e13092171c48a2f71d5a..d62352cb6e1b7075f8e5f7aab0f8020c68c4c4a2 100644 (file)
@@ -703,6 +703,9 @@ qemuMigrationCookieStatisticsXMLFormat(virBufferPtr buf,
     virBufferAsprintf(buf, "<%1$s>%2$llu</%1$s>\n",
                       VIR_DOMAIN_JOB_MEMORY_ITERATION,
                       stats->ram_iteration);
+    virBufferAsprintf(buf, "<%1$s>%2$llu</%1$s>\n",
+                      VIR_DOMAIN_JOB_MEMORY_POSTCOPY_REQS,
+                      stats->ram_postcopy_reqs);
 
     virBufferAsprintf(buf, "<%1$s>%2$llu</%1$s>\n",
                       VIR_DOMAIN_JOB_MEMORY_PAGE_SIZE,
@@ -1102,6 +1105,8 @@ qemuMigrationCookieStatisticsXMLParse(xmlXPathContextPtr ctxt)
                       ctxt, &stats->ram_dirty_rate);
     virXPathULongLong("string(./" VIR_DOMAIN_JOB_MEMORY_ITERATION "[1])",
                       ctxt, &stats->ram_iteration);
+    virXPathULongLong("string(./" VIR_DOMAIN_JOB_MEMORY_POSTCOPY_REQS "[1])",
+                      ctxt, &stats->ram_postcopy_reqs);
 
     virXPathULongLong("string(./" VIR_DOMAIN_JOB_MEMORY_PAGE_SIZE "[1])",
                       ctxt, &stats->ram_page_size);
index fef537c90ea7ca964d315410550620f1fd02b221..824c3e6845ca8faa0b1c1d439d2dd4853b6f37d4 100644 (file)
@@ -703,6 +703,7 @@ struct _qemuMonitorMigrationStats {
     unsigned long long ram_dirty_rate;
     unsigned long long ram_page_size;
     unsigned long long ram_iteration;
+    unsigned long long ram_postcopy_reqs;
 
     unsigned long long disk_transferred;
     unsigned long long disk_remaining;
index 1c0245534cf3aa661868d78fe60e1dbd28f7d5be..e148cae8f0e7540ea55ae2ee117529b0930072c9 100644 (file)
@@ -3294,6 +3294,8 @@ qemuMonitorJSONGetMigrationStatsReply(virJSONValuePtr reply,
                                                       &stats->ram_page_size));
         ignore_value(virJSONValueObjectGetNumberUlong(ram, "dirty-sync-count",
                                                       &stats->ram_iteration));
+        ignore_value(virJSONValueObjectGetNumberUlong(ram, "postcopy-requests",
+                                                      &stats->ram_postcopy_reqs));
 
         disk = virJSONValueObjectGetObject(ret, "disk");
         if (disk) {
index 4ee6ddf9561ad2a33419918a66af6dab1d400b0f..4d9f06586a20689794e3b86cf7953e9b21b6c3a0 100644 (file)
@@ -6233,6 +6233,14 @@ cmdDomjobinfo(vshControl *ctl, const vshCmd *cmd)
         } else if (rc) {
             vshPrint(ctl, "%-17s %-12llu\n", _("Iteration:"), value);
         }
+
+        if ((rc = virTypedParamsGetULLong(params, nparams,
+                                          VIR_DOMAIN_JOB_MEMORY_POSTCOPY_REQS,
+                                          &value)) < 0) {
+            goto save_error;
+        } else if (rc) {
+            vshPrint(ctl, "%-17s %-12llu\n", _("Postcopy requests:"), value);
+        }
     }
 
     if (info.fileTotal || info.fileRemaining || info.fileProcessed) {