]> git.proxmox.com Git - qemu.git/commitdiff
migration: Add dirty_pages_rate to query migrate output
authorJuan Quintela <quintela@redhat.com>
Mon, 13 Aug 2012 10:31:25 +0000 (12:31 +0200)
committerJuan Quintela <quintela@redhat.com>
Wed, 17 Oct 2012 16:34:58 +0000 (18:34 +0200)
It indicates how many pages were dirtied during the last second.

Signed-off-by: Juan Quintela <quintela@redhat.com>
arch_init.c
hmp.c
migration.c
migration.h
qapi-schema.json

index d9188440289cf7d8e9b0a2a1aa47ba692a214de4..e6effe809ae8a8e4b2fe47a2ed304d166b3b1896 100644 (file)
@@ -369,6 +369,14 @@ static void migration_bitmap_sync(void)
     RAMBlock *block;
     ram_addr_t addr;
     uint64_t num_dirty_pages_init = migration_dirty_pages;
+    MigrationState *s = migrate_get_current();
+    static int64_t start_time;
+    static int64_t num_dirty_pages_period;
+    int64_t end_time;
+
+    if (!start_time) {
+        start_time = qemu_get_clock_ms(rt_clock);
+    }
 
     trace_migration_bitmap_sync_start();
     memory_global_sync_dirty_bitmap(get_system_memory());
@@ -385,6 +393,16 @@ static void migration_bitmap_sync(void)
     }
     trace_migration_bitmap_sync_end(migration_dirty_pages
                                     - num_dirty_pages_init);
+    num_dirty_pages_period += migration_dirty_pages - num_dirty_pages_init;
+    end_time = qemu_get_clock_ms(rt_clock);
+
+    /* more than 1 second = 1000 millisecons */
+    if (end_time > start_time + 1000) {
+        s->dirty_pages_rate = num_dirty_pages_period * 1000
+            / (end_time - start_time);
+        start_time = end_time;
+        num_dirty_pages_period = 0;
+    }
 }
 
 
diff --git a/hmp.c b/hmp.c
index 96e21742eceb5d335705810c6344205e65dc061b..2b979826ee4817a3c709c2b8d6b2d07d5087c9f1 100644 (file)
--- a/hmp.c
+++ b/hmp.c
@@ -175,6 +175,10 @@ void hmp_info_migrate(Monitor *mon)
                        info->ram->normal);
         monitor_printf(mon, "normal bytes: %" PRIu64 " kbytes\n",
                        info->ram->normal_bytes >> 10);
+        if (info->ram->dirty_pages_rate) {
+            monitor_printf(mon, "dirty pages rate: %" PRIu64 " pages\n",
+                           info->ram->dirty_pages_rate);
+        }
     }
 
     if (info->has_disk) {
index 8d3e018dc0faa3e0ac80eec7298e0caa9d9498b1..330c16a97f33bdf6c2c064dd67ad4b353718971f 100644 (file)
@@ -180,6 +180,8 @@ MigrationInfo *qmp_query_migrate(Error **errp)
         info->ram->duplicate = dup_mig_pages_transferred();
         info->ram->normal = norm_mig_pages_transferred();
         info->ram->normal_bytes = norm_mig_bytes_transferred();
+        info->ram->dirty_pages_rate = s->dirty_pages_rate;
+
 
         if (blk_mig_active()) {
             info->has_disk = true;
index 552200c34847007511cc0773f52e46a05abfbf57..66d7f68bb8df2afe93ac0f57dbc1c847a53c9686 100644 (file)
@@ -42,6 +42,7 @@ struct MigrationState
     int64_t total_time;
     int64_t downtime;
     int64_t expected_downtime;
+    int64_t dirty_pages_rate;
     bool enabled_capabilities[MIGRATION_CAPABILITY_MAX];
     int64_t xbzrle_cache_size;
 };
index bcb5edb89daaa8495ec208f4749a806cb46a4a4b..c615ee212d06d3ec6c24eb8e6b48fbd7c1750960 100644 (file)
 #
 # @normal : number of normal pages (since 1.2)
 #
-# @normal-bytes : number of normal bytes sent (since 1.2)
+# @normal-bytes: number of normal bytes sent (since 1.2)
+#
+# @dirty-pages-rate: number of pages dirtied by second by the
+#        guest (since 1.3)
 #
 # Since: 0.14.0
 ##
 { 'type': 'MigrationStats',
   'data': {'transferred': 'int', 'remaining': 'int', 'total': 'int' ,
-           'duplicate': 'int', 'normal': 'int', 'normal-bytes': 'int' } }
+           'duplicate': 'int', 'normal': 'int', 'normal-bytes': 'int',
+           'dirty-pages-rate' : 'int' } }
 
 ##
 # @XBZRLECacheStats