* [PATCH v2 0/2] migration: Some fix and enhancements to HMP "info migrate"
@ 2025-05-14 20:01 Peter Xu
2025-05-14 20:01 ` [PATCH v2 1/2] migration: Allow caps to be set when preempt or multifd cap enabled Peter Xu
` (2 more replies)
0 siblings, 3 replies; 17+ messages in thread
From: Peter Xu @ 2025-05-14 20:01 UTC (permalink / raw)
To: qemu-devel
Cc: Fabiano Rosas, Prasad Pandit, Dr . David Alan Gilbert,
Juraj Marcin, peterx
v2:
- Dropped patch 2, dump globals only if "-a" in the last patch [Dave]
- Keep using "Throughput" for dumping ->mbps [Juraj]
- Rearranged some more, e.g. put xbzrle/globals under -a too, added indents
for the global dump, etc.
Patch 1 was a bug I found set capabilities, so it's pretty separate issue.
Patch 2 was an attempt that I made the HMP "info migrate" looks slightly
easier to read. A new option "-a" is added to request a full dump,
otherwise only the important info will be dumped.
Comments welcomed, thanks.
Peter Xu (2):
migration: Allow caps to be set when preempt or multifd cap enabled
migration/hmp: Add "info migrate -a", reorg the dump
migration/migration-hmp-cmds.c | 186 +++++++++++++++++----------------
migration/options.c | 4 +-
hmp-commands-info.hx | 6 +-
3 files changed, 101 insertions(+), 95 deletions(-)
--
2.49.0
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 1/2] migration: Allow caps to be set when preempt or multifd cap enabled
2025-05-14 20:01 [PATCH v2 0/2] migration: Some fix and enhancements to HMP "info migrate" Peter Xu
@ 2025-05-14 20:01 ` Peter Xu
2025-05-22 20:15 ` Michael Tokarev
2025-05-14 20:01 ` [PATCH v2 2/2] migration/hmp: Add "info migrate -a", reorg the dump Peter Xu
2025-05-19 11:27 ` [PATCH v2 0/2] migration: Some fix and enhancements to HMP "info migrate" Mario Casquero
2 siblings, 1 reply; 17+ messages in thread
From: Peter Xu @ 2025-05-14 20:01 UTC (permalink / raw)
To: qemu-devel
Cc: Fabiano Rosas, Prasad Pandit, Dr . David Alan Gilbert,
Juraj Marcin, peterx
With commit 82137e6c8c ("migration: enforce multifd and postcopy preempt to
be set before incoming"), and if postcopy preempt / multifd is enabled, one
cannot setup any capability because these checks would always fail.
(qemu) migrate_set_capability xbzrle off
Error: Postcopy preempt must be set before incoming starts
To fix it, check existing cap and only raise an error if the specific cap
changed.
Fixes: 82137e6c8c ("migration: enforce multifd and postcopy preempt to be set before incoming")
Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org>
Reviewed-by: Juraj Marcin <jmarcin@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
---
migration/options.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/migration/options.c b/migration/options.c
index 3fcd577cd7..162c72cda4 100644
--- a/migration/options.c
+++ b/migration/options.c
@@ -568,7 +568,7 @@ bool migrate_caps_check(bool *old_caps, bool *new_caps, Error **errp)
return false;
}
- if (migrate_incoming_started()) {
+ if (!migrate_postcopy_preempt() && migrate_incoming_started()) {
error_setg(errp,
"Postcopy preempt must be set before incoming starts");
return false;
@@ -576,7 +576,7 @@ bool migrate_caps_check(bool *old_caps, bool *new_caps, Error **errp)
}
if (new_caps[MIGRATION_CAPABILITY_MULTIFD]) {
- if (migrate_incoming_started()) {
+ if (!migrate_multifd() && migrate_incoming_started()) {
error_setg(errp, "Multifd must be set before incoming starts");
return false;
}
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH v2 2/2] migration/hmp: Add "info migrate -a", reorg the dump
2025-05-14 20:01 [PATCH v2 0/2] migration: Some fix and enhancements to HMP "info migrate" Peter Xu
2025-05-14 20:01 ` [PATCH v2 1/2] migration: Allow caps to be set when preempt or multifd cap enabled Peter Xu
@ 2025-05-14 20:01 ` Peter Xu
2025-05-14 20:29 ` Dr. David Alan Gilbert
2025-05-21 8:43 ` Zhijian Li (Fujitsu) via
2025-05-19 11:27 ` [PATCH v2 0/2] migration: Some fix and enhancements to HMP "info migrate" Mario Casquero
2 siblings, 2 replies; 17+ messages in thread
From: Peter Xu @ 2025-05-14 20:01 UTC (permalink / raw)
To: qemu-devel
Cc: Fabiano Rosas, Prasad Pandit, Dr . David Alan Gilbert,
Juraj Marcin, peterx
A new parameter "-a" is added to "info migrate" to dump all info, while
when not specified it only dumps the important ones. When at it, reorg
everything to make it easier to read for human.
The general rule is:
- Put important things at the top
- Reuse a single line when things are very relevant, hence reducing lines
needed to show the results
- Remove almost useless ones (e.g. "normal_bytes", while we also have
both "page size" and "normal" pages)
- Regroup things, so that related fields will show together
- etc.
Before this change, it looks like (one example of a completed case):
globals:
store-global-state: on
only-migratable: off
send-configuration: on
send-section-footer: on
send-switchover-start: on
clear-bitmap-shift: 18
Migration status: completed
total time: 122952 ms
downtime: 76 ms
setup: 15 ms
transferred ram: 130825923 kbytes
throughput: 8717.68 mbps
remaining ram: 0 kbytes
total ram: 16777992 kbytes
duplicate: 997263 pages
normal: 32622225 pages
normal bytes: 130488900 kbytes
dirty sync count: 10
page size: 4 kbytes
multifd bytes: 117134260 kbytes
pages-per-second: 169431
postcopy request count: 5835
precopy ram: 15 kbytes
postcopy ram: 13691151 kbytes
After this change, sample output (default, no "-a" specified):
Status: postcopy-active
Time (ms): total=40504, setup=14, down=145
RAM info:
Bandwidth (mbps): 6102.65
Sizes (KB): psize=4, total=16777992
transferred=37673019, remain=2136404,
precopy=3, multifd=26108780, postcopy=11563855
Pages: normal=9394288, zero=600672, rate_per_sec=185875
Others: dirty_syncs=3, dirty_pages_rate=278378, postcopy_req=4078
Sample output when "-a" specified:
Status: active
Time (ms): total=3040, setup=4, exp_down=300
RAM info:
Throughput (mbps): 10.51
Sizes (KB): psize=4, total=4211528
transferred=3979, remain=4206452,
precopy=3978, multifd=0, postcopy=0
Pages: normal=992, zero=277, rate_per_sec=320
Others: dirty_syncs=1
Globals:
store-global-state: on
only-migratable: off
send-configuration: on
send-section-footer: on
send-switchover-start: on
clear-bitmap-shift: 18
XBZRLE: size=67108864, transferred=0, pages=0, miss=188451
miss_rate=0.00, encode_rate=0.00, overflow=0
CPU Throttle (%): 0
Dirty-limit Throttle (us): 0
Dirty-limit Ring Full (us): 0
Postcopy Blocktime (ms): 0
Postcopy vCPU Blocktime: ...
Signed-off-by: Peter Xu <peterx@redhat.com>
---
migration/migration-hmp-cmds.c | 186 +++++++++++++++++----------------
hmp-commands-info.hx | 6 +-
2 files changed, 99 insertions(+), 93 deletions(-)
diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
index 49c26daed3..13e93d3c54 100644
--- a/migration/migration-hmp-cmds.c
+++ b/migration/migration-hmp-cmds.c
@@ -37,29 +37,28 @@ static void migration_global_dump(Monitor *mon)
{
MigrationState *ms = migrate_get_current();
- monitor_printf(mon, "globals:\n");
- monitor_printf(mon, "store-global-state: %s\n",
+ monitor_printf(mon, "Globals:\n");
+ monitor_printf(mon, " store-global-state: %s\n",
ms->store_global_state ? "on" : "off");
- monitor_printf(mon, "only-migratable: %s\n",
+ monitor_printf(mon, " only-migratable: %s\n",
only_migratable ? "on" : "off");
- monitor_printf(mon, "send-configuration: %s\n",
+ monitor_printf(mon, " send-configuration: %s\n",
ms->send_configuration ? "on" : "off");
- monitor_printf(mon, "send-section-footer: %s\n",
+ monitor_printf(mon, " send-section-footer: %s\n",
ms->send_section_footer ? "on" : "off");
- monitor_printf(mon, "send-switchover-start: %s\n",
+ monitor_printf(mon, " send-switchover-start: %s\n",
ms->send_switchover_start ? "on" : "off");
- monitor_printf(mon, "clear-bitmap-shift: %u\n",
+ monitor_printf(mon, " clear-bitmap-shift: %u\n",
ms->clear_bitmap_shift);
}
void hmp_info_migrate(Monitor *mon, const QDict *qdict)
{
+ bool show_all = qdict_get_try_bool(qdict, "all", false);
MigrationInfo *info;
info = qmp_query_migrate(NULL);
- migration_global_dump(mon);
-
if (info->blocked_reasons) {
strList *reasons = info->blocked_reasons;
monitor_printf(mon, "Outgoing migration blocked:\n");
@@ -70,7 +69,7 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
}
if (info->has_status) {
- monitor_printf(mon, "Migration status: %s",
+ monitor_printf(mon, "Status: %s",
MigrationStatus_str(info->status));
if (info->status == MIGRATION_STATUS_FAILED && info->error_desc) {
monitor_printf(mon, " (%s)\n", info->error_desc);
@@ -78,107 +77,130 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
monitor_printf(mon, "\n");
}
- monitor_printf(mon, "total time: %" PRIu64 " ms\n",
- info->total_time);
- if (info->has_expected_downtime) {
- monitor_printf(mon, "expected downtime: %" PRIu64 " ms\n",
- info->expected_downtime);
- }
- if (info->has_downtime) {
- monitor_printf(mon, "downtime: %" PRIu64 " ms\n",
- info->downtime);
+ if (info->total_time) {
+ monitor_printf(mon, "Time (ms): total=%" PRIu64,
+ info->total_time);
+ if (info->has_setup_time) {
+ monitor_printf(mon, ", setup=%" PRIu64,
+ info->setup_time);
+ }
+ if (info->has_expected_downtime) {
+ monitor_printf(mon, ", exp_down=%" PRIu64,
+ info->expected_downtime);
+ }
+ if (info->has_downtime) {
+ monitor_printf(mon, ", down=%" PRIu64,
+ info->downtime);
+ }
+ monitor_printf(mon, "\n");
}
- if (info->has_setup_time) {
- monitor_printf(mon, "setup: %" PRIu64 " ms\n",
- info->setup_time);
+ }
+
+ if (info->has_socket_address) {
+ SocketAddressList *addr;
+
+ monitor_printf(mon, "Sockets: [\n");
+
+ for (addr = info->socket_address; addr; addr = addr->next) {
+ char *s = socket_uri(addr->value);
+ monitor_printf(mon, "\t%s\n", s);
+ g_free(s);
}
+ monitor_printf(mon, "]\n");
}
if (info->ram) {
- monitor_printf(mon, "transferred ram: %" PRIu64 " kbytes\n",
- info->ram->transferred >> 10);
- monitor_printf(mon, "throughput: %0.2f mbps\n",
+ monitor_printf(mon, "RAM info:\n");
+ monitor_printf(mon, " Throughput (mbps): %0.2f\n",
info->ram->mbps);
- monitor_printf(mon, "remaining ram: %" PRIu64 " kbytes\n",
- info->ram->remaining >> 10);
- monitor_printf(mon, "total ram: %" PRIu64 " kbytes\n",
+ monitor_printf(mon, " Sizes (KB): psize=%" PRIu64
+ ", total=%" PRIu64 "\n",
+ info->ram->page_size >> 10,
info->ram->total >> 10);
- monitor_printf(mon, "duplicate: %" PRIu64 " pages\n",
- info->ram->duplicate);
- monitor_printf(mon, "normal: %" PRIu64 " pages\n",
- info->ram->normal);
- monitor_printf(mon, "normal bytes: %" PRIu64 " kbytes\n",
- info->ram->normal_bytes >> 10);
- monitor_printf(mon, "dirty sync count: %" PRIu64 "\n",
- info->ram->dirty_sync_count);
- monitor_printf(mon, "page size: %" PRIu64 " kbytes\n",
- info->ram->page_size >> 10);
- monitor_printf(mon, "multifd bytes: %" PRIu64 " kbytes\n",
- info->ram->multifd_bytes >> 10);
- monitor_printf(mon, "pages-per-second: %" PRIu64 "\n",
+ monitor_printf(mon, " transferred=%" PRIu64
+ ", remain=%" PRIu64 ",\n",
+ info->ram->transferred >> 10,
+ info->ram->remaining >> 10);
+ monitor_printf(mon, " precopy=%" PRIu64
+ ", multifd=%" PRIu64
+ ", postcopy=%" PRIu64,
+ info->ram->precopy_bytes >> 10,
+ info->ram->multifd_bytes >> 10,
+ info->ram->postcopy_bytes >> 10);
+
+ if (info->vfio) {
+ monitor_printf(mon, ", vfio=%" PRIu64,
+ info->vfio->transferred >> 10);
+ }
+ monitor_printf(mon, "\n");
+
+ monitor_printf(mon, " Pages: normal=%" PRIu64 ", zero=%" PRIu64
+ ", rate_per_sec=%" PRIu64 "\n",
+ info->ram->normal,
+ info->ram->duplicate,
info->ram->pages_per_second);
+ monitor_printf(mon, " Others: dirty_syncs=%" PRIu64,
+ info->ram->dirty_sync_count);
if (info->ram->dirty_pages_rate) {
- monitor_printf(mon, "dirty pages rate: %" PRIu64 " pages\n",
+ monitor_printf(mon, ", dirty_pages_rate=%" PRIu64,
info->ram->dirty_pages_rate);
}
if (info->ram->postcopy_requests) {
- monitor_printf(mon, "postcopy request count: %" PRIu64 "\n",
+ monitor_printf(mon, ", postcopy_req=%" PRIu64,
info->ram->postcopy_requests);
}
- if (info->ram->precopy_bytes) {
- monitor_printf(mon, "precopy ram: %" PRIu64 " kbytes\n",
- info->ram->precopy_bytes >> 10);
- }
if (info->ram->downtime_bytes) {
- monitor_printf(mon, "downtime ram: %" PRIu64 " kbytes\n",
- info->ram->downtime_bytes >> 10);
- }
- if (info->ram->postcopy_bytes) {
- monitor_printf(mon, "postcopy ram: %" PRIu64 " kbytes\n",
- info->ram->postcopy_bytes >> 10);
+ monitor_printf(mon, ", downtime_ram=%" PRIu64,
+ info->ram->downtime_bytes);
}
if (info->ram->dirty_sync_missed_zero_copy) {
- monitor_printf(mon,
- "Zero-copy-send fallbacks happened: %" PRIu64 " times\n",
+ monitor_printf(mon, ", zerocopy_fallbacks=%" PRIu64,
info->ram->dirty_sync_missed_zero_copy);
}
+ monitor_printf(mon, "\n");
+ }
+
+ if (!show_all) {
+ goto out;
}
+ migration_global_dump(mon);
+
if (info->xbzrle_cache) {
- monitor_printf(mon, "cache size: %" PRIu64 " bytes\n",
- info->xbzrle_cache->cache_size);
- monitor_printf(mon, "xbzrle transferred: %" PRIu64 " kbytes\n",
- info->xbzrle_cache->bytes >> 10);
- monitor_printf(mon, "xbzrle pages: %" PRIu64 " pages\n",
- info->xbzrle_cache->pages);
- monitor_printf(mon, "xbzrle cache miss: %" PRIu64 " pages\n",
- info->xbzrle_cache->cache_miss);
- monitor_printf(mon, "xbzrle cache miss rate: %0.2f\n",
- info->xbzrle_cache->cache_miss_rate);
- monitor_printf(mon, "xbzrle encoding rate: %0.2f\n",
- info->xbzrle_cache->encoding_rate);
- monitor_printf(mon, "xbzrle overflow: %" PRIu64 "\n",
+ monitor_printf(mon, "XBZRLE: size=%" PRIu64
+ ", transferred=%" PRIu64
+ ", pages=%" PRIu64
+ ", miss=%" PRIu64 "\n"
+ " miss_rate=%0.2f"
+ ", encode_rate=%0.2f"
+ ", overflow=%" PRIu64 "\n",
+ info->xbzrle_cache->cache_size,
+ info->xbzrle_cache->bytes,
+ info->xbzrle_cache->pages,
+ info->xbzrle_cache->cache_miss,
+ info->xbzrle_cache->cache_miss_rate,
+ info->xbzrle_cache->encoding_rate,
info->xbzrle_cache->overflow);
}
if (info->has_cpu_throttle_percentage) {
- monitor_printf(mon, "cpu throttle percentage: %" PRIu64 "\n",
+ monitor_printf(mon, "CPU Throttle (%%): %" PRIu64 "\n",
info->cpu_throttle_percentage);
}
if (info->has_dirty_limit_throttle_time_per_round) {
- monitor_printf(mon, "dirty-limit throttle time: %" PRIu64 " us\n",
+ monitor_printf(mon, "Dirty-limit Throttle (us): %" PRIu64 "\n",
info->dirty_limit_throttle_time_per_round);
}
if (info->has_dirty_limit_ring_full_time) {
- monitor_printf(mon, "dirty-limit ring full time: %" PRIu64 " us\n",
+ monitor_printf(mon, "Dirty-limit Ring Full (us): %" PRIu64 "\n",
info->dirty_limit_ring_full_time);
}
if (info->has_postcopy_blocktime) {
- monitor_printf(mon, "postcopy blocktime: %u\n",
+ monitor_printf(mon, "Postcopy Blocktime (ms): %" PRIu32 "\n",
info->postcopy_blocktime);
}
@@ -189,28 +211,12 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
visit_type_uint32List(v, NULL, &info->postcopy_vcpu_blocktime,
&error_abort);
visit_complete(v, &str);
- monitor_printf(mon, "postcopy vcpu blocktime: %s\n", str);
+ monitor_printf(mon, "Postcopy vCPU Blocktime: %s\n", str);
g_free(str);
visit_free(v);
}
- if (info->has_socket_address) {
- SocketAddressList *addr;
-
- monitor_printf(mon, "socket address: [\n");
-
- for (addr = info->socket_address; addr; addr = addr->next) {
- char *s = socket_uri(addr->value);
- monitor_printf(mon, "\t%s\n", s);
- g_free(s);
- }
- monitor_printf(mon, "]\n");
- }
-
- if (info->vfio) {
- monitor_printf(mon, "vfio device transferred: %" PRIu64 " kbytes\n",
- info->vfio->transferred >> 10);
- }
+out:
qapi_free_MigrationInfo(info);
}
diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
index c59cd6637b..639a450ee5 100644
--- a/hmp-commands-info.hx
+++ b/hmp-commands-info.hx
@@ -475,9 +475,9 @@ ERST
{
.name = "migrate",
- .args_type = "",
- .params = "",
- .help = "show migration status",
+ .args_type = "all:-a",
+ .params = "[-a]",
+ .help = "show migration status (-a: all, dump all status)",
.cmd = hmp_info_migrate,
},
--
2.49.0
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/2] migration/hmp: Add "info migrate -a", reorg the dump
2025-05-14 20:01 ` [PATCH v2 2/2] migration/hmp: Add "info migrate -a", reorg the dump Peter Xu
@ 2025-05-14 20:29 ` Dr. David Alan Gilbert
2025-05-14 21:17 ` Peter Xu
2025-05-21 8:43 ` Zhijian Li (Fujitsu) via
1 sibling, 1 reply; 17+ messages in thread
From: Dr. David Alan Gilbert @ 2025-05-14 20:29 UTC (permalink / raw)
To: Peter Xu; +Cc: qemu-devel, Fabiano Rosas, Prasad Pandit, Juraj Marcin
* Peter Xu (peterx@redhat.com) wrote:
> A new parameter "-a" is added to "info migrate" to dump all info, while
> when not specified it only dumps the important ones. When at it, reorg
> everything to make it easier to read for human.
>
> The general rule is:
>
> - Put important things at the top
> - Reuse a single line when things are very relevant, hence reducing lines
> needed to show the results
> - Remove almost useless ones (e.g. "normal_bytes", while we also have
> both "page size" and "normal" pages)
> - Regroup things, so that related fields will show together
> - etc.
Thanks for the update,
Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org>
Note that you did miss the change (which would be fine as a follow up)
where I point out that I think your unit abbreviations are slightly wrong
(although I think I was wrong as well...)
I think your throughput is in Mbps (capital M or Mb/s or Mbit/s) - ie.
10^6 bits/second.
While I think all your KB are KiB not KB (i.e. 2^10 bytes).
Dave
> Before this change, it looks like (one example of a completed case):
>
> globals:
> store-global-state: on
> only-migratable: off
> send-configuration: on
> send-section-footer: on
> send-switchover-start: on
> clear-bitmap-shift: 18
> Migration status: completed
> total time: 122952 ms
> downtime: 76 ms
> setup: 15 ms
> transferred ram: 130825923 kbytes
> throughput: 8717.68 mbps
> remaining ram: 0 kbytes
> total ram: 16777992 kbytes
> duplicate: 997263 pages
> normal: 32622225 pages
> normal bytes: 130488900 kbytes
> dirty sync count: 10
> page size: 4 kbytes
> multifd bytes: 117134260 kbytes
> pages-per-second: 169431
> postcopy request count: 5835
> precopy ram: 15 kbytes
> postcopy ram: 13691151 kbytes
>
> After this change, sample output (default, no "-a" specified):
>
> Status: postcopy-active
> Time (ms): total=40504, setup=14, down=145
> RAM info:
> Bandwidth (mbps): 6102.65
> Sizes (KB): psize=4, total=16777992
> transferred=37673019, remain=2136404,
> precopy=3, multifd=26108780, postcopy=11563855
> Pages: normal=9394288, zero=600672, rate_per_sec=185875
> Others: dirty_syncs=3, dirty_pages_rate=278378, postcopy_req=4078
>
> Sample output when "-a" specified:
>
> Status: active
> Time (ms): total=3040, setup=4, exp_down=300
> RAM info:
> Throughput (mbps): 10.51
> Sizes (KB): psize=4, total=4211528
> transferred=3979, remain=4206452,
> precopy=3978, multifd=0, postcopy=0
> Pages: normal=992, zero=277, rate_per_sec=320
> Others: dirty_syncs=1
> Globals:
> store-global-state: on
> only-migratable: off
> send-configuration: on
> send-section-footer: on
> send-switchover-start: on
> clear-bitmap-shift: 18
> XBZRLE: size=67108864, transferred=0, pages=0, miss=188451
> miss_rate=0.00, encode_rate=0.00, overflow=0
> CPU Throttle (%): 0
> Dirty-limit Throttle (us): 0
> Dirty-limit Ring Full (us): 0
> Postcopy Blocktime (ms): 0
> Postcopy vCPU Blocktime: ...
>
> Signed-off-by: Peter Xu <peterx@redhat.com>
> ---
> migration/migration-hmp-cmds.c | 186 +++++++++++++++++----------------
> hmp-commands-info.hx | 6 +-
> 2 files changed, 99 insertions(+), 93 deletions(-)
>
> diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
> index 49c26daed3..13e93d3c54 100644
> --- a/migration/migration-hmp-cmds.c
> +++ b/migration/migration-hmp-cmds.c
> @@ -37,29 +37,28 @@ static void migration_global_dump(Monitor *mon)
> {
> MigrationState *ms = migrate_get_current();
>
> - monitor_printf(mon, "globals:\n");
> - monitor_printf(mon, "store-global-state: %s\n",
> + monitor_printf(mon, "Globals:\n");
> + monitor_printf(mon, " store-global-state: %s\n",
> ms->store_global_state ? "on" : "off");
> - monitor_printf(mon, "only-migratable: %s\n",
> + monitor_printf(mon, " only-migratable: %s\n",
> only_migratable ? "on" : "off");
> - monitor_printf(mon, "send-configuration: %s\n",
> + monitor_printf(mon, " send-configuration: %s\n",
> ms->send_configuration ? "on" : "off");
> - monitor_printf(mon, "send-section-footer: %s\n",
> + monitor_printf(mon, " send-section-footer: %s\n",
> ms->send_section_footer ? "on" : "off");
> - monitor_printf(mon, "send-switchover-start: %s\n",
> + monitor_printf(mon, " send-switchover-start: %s\n",
> ms->send_switchover_start ? "on" : "off");
> - monitor_printf(mon, "clear-bitmap-shift: %u\n",
> + monitor_printf(mon, " clear-bitmap-shift: %u\n",
> ms->clear_bitmap_shift);
> }
>
> void hmp_info_migrate(Monitor *mon, const QDict *qdict)
> {
> + bool show_all = qdict_get_try_bool(qdict, "all", false);
> MigrationInfo *info;
>
> info = qmp_query_migrate(NULL);
>
> - migration_global_dump(mon);
> -
> if (info->blocked_reasons) {
> strList *reasons = info->blocked_reasons;
> monitor_printf(mon, "Outgoing migration blocked:\n");
> @@ -70,7 +69,7 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
> }
>
> if (info->has_status) {
> - monitor_printf(mon, "Migration status: %s",
> + monitor_printf(mon, "Status: %s",
> MigrationStatus_str(info->status));
> if (info->status == MIGRATION_STATUS_FAILED && info->error_desc) {
> monitor_printf(mon, " (%s)\n", info->error_desc);
> @@ -78,107 +77,130 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
> monitor_printf(mon, "\n");
> }
>
> - monitor_printf(mon, "total time: %" PRIu64 " ms\n",
> - info->total_time);
> - if (info->has_expected_downtime) {
> - monitor_printf(mon, "expected downtime: %" PRIu64 " ms\n",
> - info->expected_downtime);
> - }
> - if (info->has_downtime) {
> - monitor_printf(mon, "downtime: %" PRIu64 " ms\n",
> - info->downtime);
> + if (info->total_time) {
> + monitor_printf(mon, "Time (ms): total=%" PRIu64,
> + info->total_time);
> + if (info->has_setup_time) {
> + monitor_printf(mon, ", setup=%" PRIu64,
> + info->setup_time);
> + }
> + if (info->has_expected_downtime) {
> + monitor_printf(mon, ", exp_down=%" PRIu64,
> + info->expected_downtime);
> + }
> + if (info->has_downtime) {
> + monitor_printf(mon, ", down=%" PRIu64,
> + info->downtime);
> + }
> + monitor_printf(mon, "\n");
> }
> - if (info->has_setup_time) {
> - monitor_printf(mon, "setup: %" PRIu64 " ms\n",
> - info->setup_time);
> + }
> +
> + if (info->has_socket_address) {
> + SocketAddressList *addr;
> +
> + monitor_printf(mon, "Sockets: [\n");
> +
> + for (addr = info->socket_address; addr; addr = addr->next) {
> + char *s = socket_uri(addr->value);
> + monitor_printf(mon, "\t%s\n", s);
> + g_free(s);
> }
> + monitor_printf(mon, "]\n");
> }
>
> if (info->ram) {
> - monitor_printf(mon, "transferred ram: %" PRIu64 " kbytes\n",
> - info->ram->transferred >> 10);
> - monitor_printf(mon, "throughput: %0.2f mbps\n",
> + monitor_printf(mon, "RAM info:\n");
> + monitor_printf(mon, " Throughput (mbps): %0.2f\n",
> info->ram->mbps);
> - monitor_printf(mon, "remaining ram: %" PRIu64 " kbytes\n",
> - info->ram->remaining >> 10);
> - monitor_printf(mon, "total ram: %" PRIu64 " kbytes\n",
> + monitor_printf(mon, " Sizes (KB): psize=%" PRIu64
> + ", total=%" PRIu64 "\n",
> + info->ram->page_size >> 10,
> info->ram->total >> 10);
> - monitor_printf(mon, "duplicate: %" PRIu64 " pages\n",
> - info->ram->duplicate);
> - monitor_printf(mon, "normal: %" PRIu64 " pages\n",
> - info->ram->normal);
> - monitor_printf(mon, "normal bytes: %" PRIu64 " kbytes\n",
> - info->ram->normal_bytes >> 10);
> - monitor_printf(mon, "dirty sync count: %" PRIu64 "\n",
> - info->ram->dirty_sync_count);
> - monitor_printf(mon, "page size: %" PRIu64 " kbytes\n",
> - info->ram->page_size >> 10);
> - monitor_printf(mon, "multifd bytes: %" PRIu64 " kbytes\n",
> - info->ram->multifd_bytes >> 10);
> - monitor_printf(mon, "pages-per-second: %" PRIu64 "\n",
> + monitor_printf(mon, " transferred=%" PRIu64
> + ", remain=%" PRIu64 ",\n",
> + info->ram->transferred >> 10,
> + info->ram->remaining >> 10);
> + monitor_printf(mon, " precopy=%" PRIu64
> + ", multifd=%" PRIu64
> + ", postcopy=%" PRIu64,
> + info->ram->precopy_bytes >> 10,
> + info->ram->multifd_bytes >> 10,
> + info->ram->postcopy_bytes >> 10);
> +
> + if (info->vfio) {
> + monitor_printf(mon, ", vfio=%" PRIu64,
> + info->vfio->transferred >> 10);
> + }
> + monitor_printf(mon, "\n");
> +
> + monitor_printf(mon, " Pages: normal=%" PRIu64 ", zero=%" PRIu64
> + ", rate_per_sec=%" PRIu64 "\n",
> + info->ram->normal,
> + info->ram->duplicate,
> info->ram->pages_per_second);
> + monitor_printf(mon, " Others: dirty_syncs=%" PRIu64,
> + info->ram->dirty_sync_count);
>
> if (info->ram->dirty_pages_rate) {
> - monitor_printf(mon, "dirty pages rate: %" PRIu64 " pages\n",
> + monitor_printf(mon, ", dirty_pages_rate=%" PRIu64,
> info->ram->dirty_pages_rate);
> }
> if (info->ram->postcopy_requests) {
> - monitor_printf(mon, "postcopy request count: %" PRIu64 "\n",
> + monitor_printf(mon, ", postcopy_req=%" PRIu64,
> info->ram->postcopy_requests);
> }
> - if (info->ram->precopy_bytes) {
> - monitor_printf(mon, "precopy ram: %" PRIu64 " kbytes\n",
> - info->ram->precopy_bytes >> 10);
> - }
> if (info->ram->downtime_bytes) {
> - monitor_printf(mon, "downtime ram: %" PRIu64 " kbytes\n",
> - info->ram->downtime_bytes >> 10);
> - }
> - if (info->ram->postcopy_bytes) {
> - monitor_printf(mon, "postcopy ram: %" PRIu64 " kbytes\n",
> - info->ram->postcopy_bytes >> 10);
> + monitor_printf(mon, ", downtime_ram=%" PRIu64,
> + info->ram->downtime_bytes);
> }
> if (info->ram->dirty_sync_missed_zero_copy) {
> - monitor_printf(mon,
> - "Zero-copy-send fallbacks happened: %" PRIu64 " times\n",
> + monitor_printf(mon, ", zerocopy_fallbacks=%" PRIu64,
> info->ram->dirty_sync_missed_zero_copy);
> }
> + monitor_printf(mon, "\n");
> + }
> +
> + if (!show_all) {
> + goto out;
> }
>
> + migration_global_dump(mon);
> +
> if (info->xbzrle_cache) {
> - monitor_printf(mon, "cache size: %" PRIu64 " bytes\n",
> - info->xbzrle_cache->cache_size);
> - monitor_printf(mon, "xbzrle transferred: %" PRIu64 " kbytes\n",
> - info->xbzrle_cache->bytes >> 10);
> - monitor_printf(mon, "xbzrle pages: %" PRIu64 " pages\n",
> - info->xbzrle_cache->pages);
> - monitor_printf(mon, "xbzrle cache miss: %" PRIu64 " pages\n",
> - info->xbzrle_cache->cache_miss);
> - monitor_printf(mon, "xbzrle cache miss rate: %0.2f\n",
> - info->xbzrle_cache->cache_miss_rate);
> - monitor_printf(mon, "xbzrle encoding rate: %0.2f\n",
> - info->xbzrle_cache->encoding_rate);
> - monitor_printf(mon, "xbzrle overflow: %" PRIu64 "\n",
> + monitor_printf(mon, "XBZRLE: size=%" PRIu64
> + ", transferred=%" PRIu64
> + ", pages=%" PRIu64
> + ", miss=%" PRIu64 "\n"
> + " miss_rate=%0.2f"
> + ", encode_rate=%0.2f"
> + ", overflow=%" PRIu64 "\n",
> + info->xbzrle_cache->cache_size,
> + info->xbzrle_cache->bytes,
> + info->xbzrle_cache->pages,
> + info->xbzrle_cache->cache_miss,
> + info->xbzrle_cache->cache_miss_rate,
> + info->xbzrle_cache->encoding_rate,
> info->xbzrle_cache->overflow);
> }
>
> if (info->has_cpu_throttle_percentage) {
> - monitor_printf(mon, "cpu throttle percentage: %" PRIu64 "\n",
> + monitor_printf(mon, "CPU Throttle (%%): %" PRIu64 "\n",
> info->cpu_throttle_percentage);
> }
>
> if (info->has_dirty_limit_throttle_time_per_round) {
> - monitor_printf(mon, "dirty-limit throttle time: %" PRIu64 " us\n",
> + monitor_printf(mon, "Dirty-limit Throttle (us): %" PRIu64 "\n",
> info->dirty_limit_throttle_time_per_round);
> }
>
> if (info->has_dirty_limit_ring_full_time) {
> - monitor_printf(mon, "dirty-limit ring full time: %" PRIu64 " us\n",
> + monitor_printf(mon, "Dirty-limit Ring Full (us): %" PRIu64 "\n",
> info->dirty_limit_ring_full_time);
> }
>
> if (info->has_postcopy_blocktime) {
> - monitor_printf(mon, "postcopy blocktime: %u\n",
> + monitor_printf(mon, "Postcopy Blocktime (ms): %" PRIu32 "\n",
> info->postcopy_blocktime);
> }
>
> @@ -189,28 +211,12 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
> visit_type_uint32List(v, NULL, &info->postcopy_vcpu_blocktime,
> &error_abort);
> visit_complete(v, &str);
> - monitor_printf(mon, "postcopy vcpu blocktime: %s\n", str);
> + monitor_printf(mon, "Postcopy vCPU Blocktime: %s\n", str);
> g_free(str);
> visit_free(v);
> }
> - if (info->has_socket_address) {
> - SocketAddressList *addr;
> -
> - monitor_printf(mon, "socket address: [\n");
> -
> - for (addr = info->socket_address; addr; addr = addr->next) {
> - char *s = socket_uri(addr->value);
> - monitor_printf(mon, "\t%s\n", s);
> - g_free(s);
> - }
> - monitor_printf(mon, "]\n");
> - }
> -
> - if (info->vfio) {
> - monitor_printf(mon, "vfio device transferred: %" PRIu64 " kbytes\n",
> - info->vfio->transferred >> 10);
> - }
>
> +out:
> qapi_free_MigrationInfo(info);
> }
>
> diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
> index c59cd6637b..639a450ee5 100644
> --- a/hmp-commands-info.hx
> +++ b/hmp-commands-info.hx
> @@ -475,9 +475,9 @@ ERST
>
> {
> .name = "migrate",
> - .args_type = "",
> - .params = "",
> - .help = "show migration status",
> + .args_type = "all:-a",
> + .params = "[-a]",
> + .help = "show migration status (-a: all, dump all status)",
> .cmd = hmp_info_migrate,
> },
>
> --
> 2.49.0
>
--
-----Open up your eyes, open up your mind, open up your code -------
/ Dr. David Alan Gilbert | Running GNU/Linux | Happy \
\ dave @ treblig.org | | In Hex /
\ _________________________|_____ http://www.treblig.org |_______/
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/2] migration/hmp: Add "info migrate -a", reorg the dump
2025-05-14 20:29 ` Dr. David Alan Gilbert
@ 2025-05-14 21:17 ` Peter Xu
2025-05-14 23:00 ` Dr. David Alan Gilbert
0 siblings, 1 reply; 17+ messages in thread
From: Peter Xu @ 2025-05-14 21:17 UTC (permalink / raw)
To: Dr. David Alan Gilbert
Cc: qemu-devel, Fabiano Rosas, Prasad Pandit, Juraj Marcin
On Wed, May 14, 2025 at 08:29:53PM +0000, Dr. David Alan Gilbert wrote:
> * Peter Xu (peterx@redhat.com) wrote:
> > A new parameter "-a" is added to "info migrate" to dump all info, while
> > when not specified it only dumps the important ones. When at it, reorg
> > everything to make it easier to read for human.
> >
> > The general rule is:
> >
> > - Put important things at the top
> > - Reuse a single line when things are very relevant, hence reducing lines
> > needed to show the results
> > - Remove almost useless ones (e.g. "normal_bytes", while we also have
> > both "page size" and "normal" pages)
> > - Regroup things, so that related fields will show together
> > - etc.
>
> Thanks for the update,
>
> Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org>
Thanks for the quick comments!
>
> Note that you did miss the change (which would be fine as a follow up)
> where I point out that I think your unit abbreviations are slightly wrong
Ouch, it's in the spam filter... :-( I would have missed that if you didn't
mention it. I would think any decent AI models would do better than this..
I have no idea how this could ever happen in 2025.
> (although I think I was wrong as well...)
> I think your throughput is in Mbps (capital M or Mb/s or Mbit/s) - ie.
> 10^6 bits/second.
>
> While I think all your KB are KiB not KB (i.e. 2^10 bytes).
True..
Now I've read the missing reply:
https://lore.kernel.org/qemu-devel/aCSXjRCTYKbDf9le@gallifrey/
So yeh, mbps is in unit of bit, but all the rest needs fixing. How about
below fixup to be squashed (if I won't need to repost for v3):
PS: in the fixup I also did s/psize/pagesize/ to be clear
diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
index 13e93d3c54..ea76f72fa4 100644
--- a/migration/migration-hmp-cmds.c
+++ b/migration/migration-hmp-cmds.c
@@ -111,9 +111,9 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
if (info->ram) {
monitor_printf(mon, "RAM info:\n");
- monitor_printf(mon, " Throughput (mbps): %0.2f\n",
+ monitor_printf(mon, " Throughput (Mbps): %0.2f\n",
info->ram->mbps);
- monitor_printf(mon, " Sizes (KB): psize=%" PRIu64
+ monitor_printf(mon, " Sizes (KiB): pagesize=%" PRIu64
", total=%" PRIu64 "\n",
info->ram->page_size >> 10,
info->ram->total >> 10);
--
Peter Xu
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/2] migration/hmp: Add "info migrate -a", reorg the dump
2025-05-14 21:17 ` Peter Xu
@ 2025-05-14 23:00 ` Dr. David Alan Gilbert
0 siblings, 0 replies; 17+ messages in thread
From: Dr. David Alan Gilbert @ 2025-05-14 23:00 UTC (permalink / raw)
To: Peter Xu; +Cc: qemu-devel, Fabiano Rosas, Prasad Pandit, Juraj Marcin
* Peter Xu (peterx@redhat.com) wrote:
> On Wed, May 14, 2025 at 08:29:53PM +0000, Dr. David Alan Gilbert wrote:
> > * Peter Xu (peterx@redhat.com) wrote:
> > > A new parameter "-a" is added to "info migrate" to dump all info, while
> > > when not specified it only dumps the important ones. When at it, reorg
> > > everything to make it easier to read for human.
> > >
> > > The general rule is:
> > >
> > > - Put important things at the top
> > > - Reuse a single line when things are very relevant, hence reducing lines
> > > needed to show the results
> > > - Remove almost useless ones (e.g. "normal_bytes", while we also have
> > > both "page size" and "normal" pages)
> > > - Regroup things, so that related fields will show together
> > > - etc.
> >
> > Thanks for the update,
> >
> > Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org>
>
> Thanks for the quick comments!
>
> >
> > Note that you did miss the change (which would be fine as a follow up)
> > where I point out that I think your unit abbreviations are slightly wrong
>
> Ouch, it's in the spam filter... :-( I would have missed that if you didn't
> mention it. I would think any decent AI models would do better than this..
> I have no idea how this could ever happen in 2025.
Ah...
> > (although I think I was wrong as well...)
> > I think your throughput is in Mbps (capital M or Mb/s or Mbit/s) - ie.
> > 10^6 bits/second.
> >
> > While I think all your KB are KiB not KB (i.e. 2^10 bytes).
>
> True..
>
> Now I've read the missing reply:
>
> https://lore.kernel.org/qemu-devel/aCSXjRCTYKbDf9le@gallifrey/
>
> So yeh, mbps is in unit of bit, but all the rest needs fixing. How about
> below fixup to be squashed (if I won't need to repost for v3):
>
> PS: in the fixup I also did s/psize/pagesize/ to be clear
That's fine.
> diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
> index 13e93d3c54..ea76f72fa4 100644
> --- a/migration/migration-hmp-cmds.c
> +++ b/migration/migration-hmp-cmds.c
> @@ -111,9 +111,9 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
>
> if (info->ram) {
> monitor_printf(mon, "RAM info:\n");
> - monitor_printf(mon, " Throughput (mbps): %0.2f\n",
> + monitor_printf(mon, " Throughput (Mbps): %0.2f\n",
> info->ram->mbps);
Right.
> - monitor_printf(mon, " Sizes (KB): psize=%" PRIu64
> + monitor_printf(mon, " Sizes (KiB): pagesize=%" PRIu64
Right.
Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org>
> ", total=%" PRIu64 "\n",
> info->ram->page_size >> 10,
> info->ram->total >> 10);
>
> --
> Peter Xu
>
--
-----Open up your eyes, open up your mind, open up your code -------
/ Dr. David Alan Gilbert | Running GNU/Linux | Happy \
\ dave @ treblig.org | | In Hex /
\ _________________________|_____ http://www.treblig.org |_______/
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 0/2] migration: Some fix and enhancements to HMP "info migrate"
2025-05-14 20:01 [PATCH v2 0/2] migration: Some fix and enhancements to HMP "info migrate" Peter Xu
2025-05-14 20:01 ` [PATCH v2 1/2] migration: Allow caps to be set when preempt or multifd cap enabled Peter Xu
2025-05-14 20:01 ` [PATCH v2 2/2] migration/hmp: Add "info migrate -a", reorg the dump Peter Xu
@ 2025-05-19 11:27 ` Mario Casquero
2025-05-20 17:03 ` Peter Xu
2 siblings, 1 reply; 17+ messages in thread
From: Mario Casquero @ 2025-05-19 11:27 UTC (permalink / raw)
To: Peter Xu
Cc: qemu-devel, Fabiano Rosas, Prasad Pandit, Dr . David Alan Gilbert,
Juraj Marcin
This series has been successfully tested. Now the HMP info migrate
command is more compact and readable. With the -a option the values of
the globals are displayed as well.
(qemu) info migrate
Status: active
Time (ms): total=4029, setup=36, exp_down=300
RAM info:
Throughput (mbps): 938.03
Sizes (KB): psize=4, total=16798280
transferred=426629, remain=6121884,
precopy=426752, multifd=0, postcopy=0
Pages: normal=105457, zero=466489, rate_per_sec=28728
Others: dirty_syncs=1
Tested-by: Mario Casquero <mcasquer@redhat.com>
On Wed, May 14, 2025 at 10:03 PM Peter Xu <peterx@redhat.com> wrote:
>
> v2:
> - Dropped patch 2, dump globals only if "-a" in the last patch [Dave]
> - Keep using "Throughput" for dumping ->mbps [Juraj]
> - Rearranged some more, e.g. put xbzrle/globals under -a too, added indents
> for the global dump, etc.
>
> Patch 1 was a bug I found set capabilities, so it's pretty separate issue.
>
> Patch 2 was an attempt that I made the HMP "info migrate" looks slightly
> easier to read. A new option "-a" is added to request a full dump,
> otherwise only the important info will be dumped.
>
> Comments welcomed, thanks.
>
> Peter Xu (2):
> migration: Allow caps to be set when preempt or multifd cap enabled
> migration/hmp: Add "info migrate -a", reorg the dump
>
> migration/migration-hmp-cmds.c | 186 +++++++++++++++++----------------
> migration/options.c | 4 +-
> hmp-commands-info.hx | 6 +-
> 3 files changed, 101 insertions(+), 95 deletions(-)
>
> --
> 2.49.0
>
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 0/2] migration: Some fix and enhancements to HMP "info migrate"
2025-05-19 11:27 ` [PATCH v2 0/2] migration: Some fix and enhancements to HMP "info migrate" Mario Casquero
@ 2025-05-20 17:03 ` Peter Xu
0 siblings, 0 replies; 17+ messages in thread
From: Peter Xu @ 2025-05-20 17:03 UTC (permalink / raw)
To: Mario Casquero
Cc: qemu-devel, Fabiano Rosas, Prasad Pandit, Dr . David Alan Gilbert,
Juraj Marcin
On Mon, May 19, 2025 at 01:27:35PM +0200, Mario Casquero wrote:
> This series has been successfully tested. Now the HMP info migrate
> command is more compact and readable. With the -a option the values of
> the globals are displayed as well.
>
> (qemu) info migrate
> Status: active
> Time (ms): total=4029, setup=36, exp_down=300
> RAM info:
> Throughput (mbps): 938.03
> Sizes (KB): psize=4, total=16798280
I just noticed there's the comma missing at the end of this line.. I'll add
it.
> transferred=426629, remain=6121884,
> precopy=426752, multifd=0, postcopy=0
> Pages: normal=105457, zero=466489, rate_per_sec=28728
> Others: dirty_syncs=1
>
> Tested-by: Mario Casquero <mcasquer@redhat.com>
Thanks Mario. I'll queue this series with the touch up.
--
Peter Xu
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/2] migration/hmp: Add "info migrate -a", reorg the dump
2025-05-14 20:01 ` [PATCH v2 2/2] migration/hmp: Add "info migrate -a", reorg the dump Peter Xu
2025-05-14 20:29 ` Dr. David Alan Gilbert
@ 2025-05-21 8:43 ` Zhijian Li (Fujitsu) via
2025-05-21 14:03 ` Peter Xu
1 sibling, 1 reply; 17+ messages in thread
From: Zhijian Li (Fujitsu) via @ 2025-05-21 8:43 UTC (permalink / raw)
To: Peter Xu, qemu-devel@nongnu.org
Cc: Fabiano Rosas, Prasad Pandit, Dr . David Alan Gilbert,
Juraj Marcin
On 15/05/2025 04:01, Peter Xu wrote:
> A new parameter "-a" is added to "info migrate" to dump all info, while
> when not specified it only dumps the important ones. When at it, reorg
> everything to make it easier to read for human.
>
> The general rule is:
>
> - Put important things at the top
> - Reuse a single line when things are very relevant, hence reducing lines
> needed to show the results
> - Remove almost useless ones (e.g. "normal_bytes", while we also have
> both "page size" and "normal" pages)
> - Regroup things, so that related fields will show together
> - etc.
>
> Before this change, it looks like (one example of a completed case):
>
> globals:
> store-global-state: on
> only-migratable: off
> send-configuration: on
> send-section-footer: on
> send-switchover-start: on
> clear-bitmap-shift: 18
> Migration status: completed
> total time: 122952 ms
> downtime: 76 ms
> setup: 15 ms
> transferred ram: 130825923 kbytes
> throughput: 8717.68 mbps
> remaining ram: 0 kbytes
> total ram: 16777992 kbytes
> duplicate: 997263 pages
> normal: 32622225 pages
> normal bytes: 130488900 kbytes
> dirty sync count: 10
> page size: 4 kbytes
> multifd bytes: 117134260 kbytes
> pages-per-second: 169431
> postcopy request count: 5835
> precopy ram: 15 kbytes
> postcopy ram: 13691151 kbytes
>
> After this change, sample output (default, no "-a" specified):
>
> Status: postcopy-active
> Time (ms): total=40504, setup=14, down=145
> RAM info:
> Bandwidth (mbps): 6102.65
> Sizes (KB): psize=4, total=16777992
> transferred=37673019, remain=2136404,
> precopy=3, multifd=26108780, postcopy=11563855
> Pages: normal=9394288, zero=600672, rate_per_sec=185875
> Others: dirty_syncs=3, dirty_pages_rate=278378, postcopy_req=4078
(Feel free to ignore my comment if you have reached a consensus.)
Putting multiple fields in one line is a true need for human reading?
I don't have confident to reorg them so I feed this request to the AI,
he suggested something like this:
Migration Status:
Status: completed
Time Statistics:
Setup: 15 ms
Downtime: 76 ms
Total: 122952 ms
RAM Transfer:
Throughput: 8717.68 mbps
Page Size: 4 KB
Transferred:
Total: 130825923 KB
Precopied: 15 KB
Postcopied: 13691151 KB
Multifd: 117134260 KB
Remaining: 0 KB
Total RAM: 16777992 KB
Page Statistics:
Normal Pages: 32622225
Zero Pages: 0
Duplicate Pages: 997263
Transfer Page Rate: 169431
Dirty Page Rate: 1234
Dirty Syncs: 10
Thanks
Zhijian
>
> Sample output when "-a" specified:
>
> Status: active
> Time (ms): total=3040, setup=4, exp_down=300
> RAM info:
> Throughput (mbps): 10.51
> Sizes (KB): psize=4, total=4211528
> transferred=3979, remain=4206452,
> precopy=3978, multifd=0, postcopy=0
> Pages: normal=992, zero=277, rate_per_sec=320
> Others: dirty_syncs=1
> Globals:
> store-global-state: on
> only-migratable: off
> send-configuration: on
> send-section-footer: on
> send-switchover-start: on
> clear-bitmap-shift: 18
> XBZRLE: size=67108864, transferred=0, pages=0, miss=188451
> miss_rate=0.00, encode_rate=0.00, overflow=0
> CPU Throttle (%): 0
> Dirty-limit Throttle (us): 0
> Dirty-limit Ring Full (us): 0
> Postcopy Blocktime (ms): 0
> Postcopy vCPU Blocktime: ...
>
> Signed-off-by: Peter Xu <peterx@redhat.com>
> ---
> migration/migration-hmp-cmds.c | 186 +++++++++++++++++----------------
> hmp-commands-info.hx | 6 +-
> 2 files changed, 99 insertions(+), 93 deletions(-)
>
> diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
> index 49c26daed3..13e93d3c54 100644
> --- a/migration/migration-hmp-cmds.c
> +++ b/migration/migration-hmp-cmds.c
> @@ -37,29 +37,28 @@ static void migration_global_dump(Monitor *mon)
> {
> MigrationState *ms = migrate_get_current();
>
> - monitor_printf(mon, "globals:\n");
> - monitor_printf(mon, "store-global-state: %s\n",
> + monitor_printf(mon, "Globals:\n");
> + monitor_printf(mon, " store-global-state: %s\n",
> ms->store_global_state ? "on" : "off");
> - monitor_printf(mon, "only-migratable: %s\n",
> + monitor_printf(mon, " only-migratable: %s\n",
> only_migratable ? "on" : "off");
> - monitor_printf(mon, "send-configuration: %s\n",
> + monitor_printf(mon, " send-configuration: %s\n",
> ms->send_configuration ? "on" : "off");
> - monitor_printf(mon, "send-section-footer: %s\n",
> + monitor_printf(mon, " send-section-footer: %s\n",
> ms->send_section_footer ? "on" : "off");
> - monitor_printf(mon, "send-switchover-start: %s\n",
> + monitor_printf(mon, " send-switchover-start: %s\n",
> ms->send_switchover_start ? "on" : "off");
> - monitor_printf(mon, "clear-bitmap-shift: %u\n",
> + monitor_printf(mon, " clear-bitmap-shift: %u\n",
> ms->clear_bitmap_shift);
> }
>
> void hmp_info_migrate(Monitor *mon, const QDict *qdict)
> {
> + bool show_all = qdict_get_try_bool(qdict, "all", false);
> MigrationInfo *info;
>
> info = qmp_query_migrate(NULL);
>
> - migration_global_dump(mon);
> -
> if (info->blocked_reasons) {
> strList *reasons = info->blocked_reasons;
> monitor_printf(mon, "Outgoing migration blocked:\n");
> @@ -70,7 +69,7 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
> }
>
> if (info->has_status) {
> - monitor_printf(mon, "Migration status: %s",
> + monitor_printf(mon, "Status: %s",
> MigrationStatus_str(info->status));
> if (info->status == MIGRATION_STATUS_FAILED && info->error_desc) {
> monitor_printf(mon, " (%s)\n", info->error_desc);
> @@ -78,107 +77,130 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
> monitor_printf(mon, "\n");
> }
>
> - monitor_printf(mon, "total time: %" PRIu64 " ms\n",
> - info->total_time);
> - if (info->has_expected_downtime) {
> - monitor_printf(mon, "expected downtime: %" PRIu64 " ms\n",
> - info->expected_downtime);
> - }
> - if (info->has_downtime) {
> - monitor_printf(mon, "downtime: %" PRIu64 " ms\n",
> - info->downtime);
> + if (info->total_time) {
> + monitor_printf(mon, "Time (ms): total=%" PRIu64,
> + info->total_time);
> + if (info->has_setup_time) {
> + monitor_printf(mon, ", setup=%" PRIu64,
> + info->setup_time);
> + }
> + if (info->has_expected_downtime) {
> + monitor_printf(mon, ", exp_down=%" PRIu64,
> + info->expected_downtime);
> + }
> + if (info->has_downtime) {
> + monitor_printf(mon, ", down=%" PRIu64,
> + info->downtime);
> + }
> + monitor_printf(mon, "\n");
> }
> - if (info->has_setup_time) {
> - monitor_printf(mon, "setup: %" PRIu64 " ms\n",
> - info->setup_time);
> + }
> +
> + if (info->has_socket_address) {
> + SocketAddressList *addr;
> +
> + monitor_printf(mon, "Sockets: [\n");
> +
> + for (addr = info->socket_address; addr; addr = addr->next) {
> + char *s = socket_uri(addr->value);
> + monitor_printf(mon, "\t%s\n", s);
> + g_free(s);
> }
> + monitor_printf(mon, "]\n");
> }
>
> if (info->ram) {
> - monitor_printf(mon, "transferred ram: %" PRIu64 " kbytes\n",
> - info->ram->transferred >> 10);
> - monitor_printf(mon, "throughput: %0.2f mbps\n",
> + monitor_printf(mon, "RAM info:\n");
> + monitor_printf(mon, " Throughput (mbps): %0.2f\n",
> info->ram->mbps);
> - monitor_printf(mon, "remaining ram: %" PRIu64 " kbytes\n",
> - info->ram->remaining >> 10);
> - monitor_printf(mon, "total ram: %" PRIu64 " kbytes\n",
> + monitor_printf(mon, " Sizes (KB): psize=%" PRIu64
> + ", total=%" PRIu64 "\n",
> + info->ram->page_size >> 10,
> info->ram->total >> 10);
> - monitor_printf(mon, "duplicate: %" PRIu64 " pages\n",
> - info->ram->duplicate);
> - monitor_printf(mon, "normal: %" PRIu64 " pages\n",
> - info->ram->normal);
> - monitor_printf(mon, "normal bytes: %" PRIu64 " kbytes\n",
> - info->ram->normal_bytes >> 10);
> - monitor_printf(mon, "dirty sync count: %" PRIu64 "\n",
> - info->ram->dirty_sync_count);
> - monitor_printf(mon, "page size: %" PRIu64 " kbytes\n",
> - info->ram->page_size >> 10);
> - monitor_printf(mon, "multifd bytes: %" PRIu64 " kbytes\n",
> - info->ram->multifd_bytes >> 10);
> - monitor_printf(mon, "pages-per-second: %" PRIu64 "\n",
> + monitor_printf(mon, " transferred=%" PRIu64
> + ", remain=%" PRIu64 ",\n",
> + info->ram->transferred >> 10,
> + info->ram->remaining >> 10);
> + monitor_printf(mon, " precopy=%" PRIu64
> + ", multifd=%" PRIu64
> + ", postcopy=%" PRIu64,
> + info->ram->precopy_bytes >> 10,
> + info->ram->multifd_bytes >> 10,
> + info->ram->postcopy_bytes >> 10);
> +
> + if (info->vfio) {
> + monitor_printf(mon, ", vfio=%" PRIu64,
> + info->vfio->transferred >> 10);
> + }
> + monitor_printf(mon, "\n");
> +
> + monitor_printf(mon, " Pages: normal=%" PRIu64 ", zero=%" PRIu64
> + ", rate_per_sec=%" PRIu64 "\n",
> + info->ram->normal,
> + info->ram->duplicate,
> info->ram->pages_per_second);
> + monitor_printf(mon, " Others: dirty_syncs=%" PRIu64,
> + info->ram->dirty_sync_count);
>
> if (info->ram->dirty_pages_rate) {
> - monitor_printf(mon, "dirty pages rate: %" PRIu64 " pages\n",
> + monitor_printf(mon, ", dirty_pages_rate=%" PRIu64,
> info->ram->dirty_pages_rate);
> }
> if (info->ram->postcopy_requests) {
> - monitor_printf(mon, "postcopy request count: %" PRIu64 "\n",
> + monitor_printf(mon, ", postcopy_req=%" PRIu64,
> info->ram->postcopy_requests);
> }
> - if (info->ram->precopy_bytes) {
> - monitor_printf(mon, "precopy ram: %" PRIu64 " kbytes\n",
> - info->ram->precopy_bytes >> 10);
> - }
> if (info->ram->downtime_bytes) {
> - monitor_printf(mon, "downtime ram: %" PRIu64 " kbytes\n",
> - info->ram->downtime_bytes >> 10);
> - }
> - if (info->ram->postcopy_bytes) {
> - monitor_printf(mon, "postcopy ram: %" PRIu64 " kbytes\n",
> - info->ram->postcopy_bytes >> 10);
> + monitor_printf(mon, ", downtime_ram=%" PRIu64,
> + info->ram->downtime_bytes);
> }
> if (info->ram->dirty_sync_missed_zero_copy) {
> - monitor_printf(mon,
> - "Zero-copy-send fallbacks happened: %" PRIu64 " times\n",
> + monitor_printf(mon, ", zerocopy_fallbacks=%" PRIu64,
> info->ram->dirty_sync_missed_zero_copy);
> }
> + monitor_printf(mon, "\n");
> + }
> +
> + if (!show_all) {
> + goto out;
> }
>
> + migration_global_dump(mon);
> +
> if (info->xbzrle_cache) {
> - monitor_printf(mon, "cache size: %" PRIu64 " bytes\n",
> - info->xbzrle_cache->cache_size);
> - monitor_printf(mon, "xbzrle transferred: %" PRIu64 " kbytes\n",
> - info->xbzrle_cache->bytes >> 10);
> - monitor_printf(mon, "xbzrle pages: %" PRIu64 " pages\n",
> - info->xbzrle_cache->pages);
> - monitor_printf(mon, "xbzrle cache miss: %" PRIu64 " pages\n",
> - info->xbzrle_cache->cache_miss);
> - monitor_printf(mon, "xbzrle cache miss rate: %0.2f\n",
> - info->xbzrle_cache->cache_miss_rate);
> - monitor_printf(mon, "xbzrle encoding rate: %0.2f\n",
> - info->xbzrle_cache->encoding_rate);
> - monitor_printf(mon, "xbzrle overflow: %" PRIu64 "\n",
> + monitor_printf(mon, "XBZRLE: size=%" PRIu64
> + ", transferred=%" PRIu64
> + ", pages=%" PRIu64
> + ", miss=%" PRIu64 "\n"
> + " miss_rate=%0.2f"
> + ", encode_rate=%0.2f"
> + ", overflow=%" PRIu64 "\n",
> + info->xbzrle_cache->cache_size,
> + info->xbzrle_cache->bytes,
> + info->xbzrle_cache->pages,
> + info->xbzrle_cache->cache_miss,
> + info->xbzrle_cache->cache_miss_rate,
> + info->xbzrle_cache->encoding_rate,
> info->xbzrle_cache->overflow);
> }
>
> if (info->has_cpu_throttle_percentage) {
> - monitor_printf(mon, "cpu throttle percentage: %" PRIu64 "\n",
> + monitor_printf(mon, "CPU Throttle (%%): %" PRIu64 "\n",
> info->cpu_throttle_percentage);
> }
>
> if (info->has_dirty_limit_throttle_time_per_round) {
> - monitor_printf(mon, "dirty-limit throttle time: %" PRIu64 " us\n",
> + monitor_printf(mon, "Dirty-limit Throttle (us): %" PRIu64 "\n",
> info->dirty_limit_throttle_time_per_round);
> }
>
> if (info->has_dirty_limit_ring_full_time) {
> - monitor_printf(mon, "dirty-limit ring full time: %" PRIu64 " us\n",
> + monitor_printf(mon, "Dirty-limit Ring Full (us): %" PRIu64 "\n",
> info->dirty_limit_ring_full_time);
> }
>
> if (info->has_postcopy_blocktime) {
> - monitor_printf(mon, "postcopy blocktime: %u\n",
> + monitor_printf(mon, "Postcopy Blocktime (ms): %" PRIu32 "\n",
> info->postcopy_blocktime);
> }
>
> @@ -189,28 +211,12 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
> visit_type_uint32List(v, NULL, &info->postcopy_vcpu_blocktime,
> &error_abort);
> visit_complete(v, &str);
> - monitor_printf(mon, "postcopy vcpu blocktime: %s\n", str);
> + monitor_printf(mon, "Postcopy vCPU Blocktime: %s\n", str);
> g_free(str);
> visit_free(v);
> }
> - if (info->has_socket_address) {
> - SocketAddressList *addr;
> -
> - monitor_printf(mon, "socket address: [\n");
> -
> - for (addr = info->socket_address; addr; addr = addr->next) {
> - char *s = socket_uri(addr->value);
> - monitor_printf(mon, "\t%s\n", s);
> - g_free(s);
> - }
> - monitor_printf(mon, "]\n");
> - }
> -
> - if (info->vfio) {
> - monitor_printf(mon, "vfio device transferred: %" PRIu64 " kbytes\n",
> - info->vfio->transferred >> 10);
> - }
>
> +out:
> qapi_free_MigrationInfo(info);
> }
>
> diff --git a/hmp-commands-info.hx b/hmp-commands-info.hx
> index c59cd6637b..639a450ee5 100644
> --- a/hmp-commands-info.hx
> +++ b/hmp-commands-info.hx
> @@ -475,9 +475,9 @@ ERST
>
> {
> .name = "migrate",
> - .args_type = "",
> - .params = "",
> - .help = "show migration status",
> + .args_type = "all:-a",
> + .params = "[-a]",
> + .help = "show migration status (-a: all, dump all status)",
> .cmd = hmp_info_migrate,
> },
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/2] migration/hmp: Add "info migrate -a", reorg the dump
2025-05-21 8:43 ` Zhijian Li (Fujitsu) via
@ 2025-05-21 14:03 ` Peter Xu
2025-05-21 21:04 ` Dr. David Alan Gilbert
2025-05-22 1:07 ` Zhijian Li (Fujitsu) via
0 siblings, 2 replies; 17+ messages in thread
From: Peter Xu @ 2025-05-21 14:03 UTC (permalink / raw)
To: Zhijian Li (Fujitsu)
Cc: qemu-devel@nongnu.org, Fabiano Rosas, Prasad Pandit,
Dr . David Alan Gilbert, Juraj Marcin
On Wed, May 21, 2025 at 08:43:37AM +0000, Zhijian Li (Fujitsu) wrote:
[...]
> > After this change, sample output (default, no "-a" specified):
> >
> > Status: postcopy-active
> > Time (ms): total=40504, setup=14, down=145
> > RAM info:
> > Bandwidth (mbps): 6102.65
> > Sizes (KB): psize=4, total=16777992
> > transferred=37673019, remain=2136404,
> > precopy=3, multifd=26108780, postcopy=11563855
> > Pages: normal=9394288, zero=600672, rate_per_sec=185875
> > Others: dirty_syncs=3, dirty_pages_rate=278378, postcopy_req=4078
>
> (Feel free to ignore my comment if you have reached a consensus.)
>
> Putting multiple fields in one line is a true need for human reading?
It definitely helps me but I agree that can be subjective. So I'm happy to
collect opinions.
So my above layout was trying to leverage more on screens where width is
bigger than the height (which is pretty much the default).
> I don't have confident to reorg them so I feed this request to the AI,
> he suggested something like this:
>
> Migration Status:
> Status: completed
>
> Time Statistics:
> Setup: 15 ms
> Downtime: 76 ms
> Total: 122952 ms
> RAM Transfer:
> Throughput: 8717.68 mbps
> Page Size: 4 KB
> Transferred:
> Total: 130825923 KB
> Precopied: 15 KB
> Postcopied: 13691151 KB
> Multifd: 117134260 KB
> Remaining: 0 KB
> Total RAM: 16777992 KB
> Page Statistics:
> Normal Pages: 32622225
> Zero Pages: 0
> Duplicate Pages: 997263
> Transfer Page Rate: 169431
> Dirty Page Rate: 1234
> Dirty Syncs: 10
I would trust you more than the AI, so feel free to share your opinion next
time (which won't hurt if it was a result of AI discussions, but only which
you agreed on :).
It's already in a pull, let's revisit whenever necessary. Thanks for the
input!
--
Peter Xu
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/2] migration/hmp: Add "info migrate -a", reorg the dump
2025-05-21 14:03 ` Peter Xu
@ 2025-05-21 21:04 ` Dr. David Alan Gilbert
2025-05-22 0:55 ` Zhijian Li (Fujitsu) via
2025-05-22 1:07 ` Zhijian Li (Fujitsu) via
1 sibling, 1 reply; 17+ messages in thread
From: Dr. David Alan Gilbert @ 2025-05-21 21:04 UTC (permalink / raw)
To: Peter Xu
Cc: Zhijian Li (Fujitsu), qemu-devel@nongnu.org, Fabiano Rosas,
Prasad Pandit, Juraj Marcin
* Peter Xu (peterx@redhat.com) wrote:
> On Wed, May 21, 2025 at 08:43:37AM +0000, Zhijian Li (Fujitsu) wrote:
> [...]
> > > After this change, sample output (default, no "-a" specified):
> > >
> > > Status: postcopy-active
> > > Time (ms): total=40504, setup=14, down=145
> > > RAM info:
> > > Bandwidth (mbps): 6102.65
> > > Sizes (KB): psize=4, total=16777992
> > > transferred=37673019, remain=2136404,
> > > precopy=3, multifd=26108780, postcopy=11563855
> > > Pages: normal=9394288, zero=600672, rate_per_sec=185875
> > > Others: dirty_syncs=3, dirty_pages_rate=278378, postcopy_req=4078
> >
> > (Feel free to ignore my comment if you have reached a consensus.)
> >
> > Putting multiple fields in one line is a true need for human reading?
>
> It definitely helps me but I agree that can be subjective. So I'm happy to
> collect opinions.
>
> So my above layout was trying to leverage more on screens where width is
> bigger than the height (which is pretty much the default).
I think perhaps the problem with the on-one-line layout is that the grouping
is wrong; grouping by unit probably doesn't make sense.
So it makes sense to me to have:
Sizes: psize=4/KB
Transfer: total=16777992 kB transferred=37673019 kB remain=11563855 kB
Pages: normal=9394288 zero=600672
Page rates: transferred=185875/s dirtied=278378/s
Other: dirty_sync=3 postcopy_req=4078
so you have things on one line when you're comparing them - so it's easy
to see the transferred page/s is way less than the dirtied in this example
(really??) because they're next to each other.
Or the 'Transfer' line is showing total, how much so far and how much remains
> > I don't have confident to reorg them so I feed this request to the AI,
> > he suggested something like this:
> >
> > Migration Status:
> > Status: completed
> >
> > Time Statistics:
> > Setup: 15 ms
> > Downtime: 76 ms
> > Total: 122952 ms
> > RAM Transfer:
> > Throughput: 8717.68 mbps
> > Page Size: 4 KB
> > Transferred:
> > Total: 130825923 KB
> > Precopied: 15 KB
> > Postcopied: 13691151 KB
> > Multifd: 117134260 KB
> > Remaining: 0 KB
> > Total RAM: 16777992 KB
> > Page Statistics:
> > Normal Pages: 32622225
> > Zero Pages: 0
> > Duplicate Pages: 997263
> > Transfer Page Rate: 169431
> > Dirty Page Rate: 1234
> > Dirty Syncs: 10
>
> I would trust you more than the AI, so feel free to share your opinion next
> time (which won't hurt if it was a result of AI discussions, but only which
> you agreed on :).
Haha, yes; whatever it is for those humans find easiest - that's the H in HMP!
(Those AIs can parse Json way easier than I can read Json!)
Of course you don't need to reorg it all at once again, if someone finds
one section hard, then reorg the way that people find it easy.
> It's already in a pull, let's revisit whenever necessary. Thanks for the
> input!
>
Nod.
Dave
> --
> Peter Xu
>
--
-----Open up your eyes, open up your mind, open up your code -------
/ Dr. David Alan Gilbert | Running GNU/Linux | Happy \
\ dave @ treblig.org | | In Hex /
\ _________________________|_____ http://www.treblig.org |_______/
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/2] migration/hmp: Add "info migrate -a", reorg the dump
2025-05-21 21:04 ` Dr. David Alan Gilbert
@ 2025-05-22 0:55 ` Zhijian Li (Fujitsu) via
2025-05-22 13:16 ` Peter Xu
0 siblings, 1 reply; 17+ messages in thread
From: Zhijian Li (Fujitsu) via @ 2025-05-22 0:55 UTC (permalink / raw)
To: Dr. David Alan Gilbert, Peter Xu
Cc: qemu-devel@nongnu.org, Fabiano Rosas, Prasad Pandit, Juraj Marcin
On 22/05/2025 05:04, Dr. David Alan Gilbert wrote:
> * Peter Xu (peterx@redhat.com) wrote:
>> On Wed, May 21, 2025 at 08:43:37AM +0000, Zhijian Li (Fujitsu) wrote:
>> [...]
>>>> After this change, sample output (default, no "-a" specified):
>>>>
>>>> Status: postcopy-active
>>>> Time (ms): total=40504, setup=14, down=145
>>>> RAM info:
>>>> Bandwidth (mbps): 6102.65
>>>> Sizes (KB): psize=4, total=16777992
>>>> transferred=37673019, remain=2136404,
>>>> precopy=3, multifd=26108780, postcopy=11563855
>>>> Pages: normal=9394288, zero=600672, rate_per_sec=185875
>>>> Others: dirty_syncs=3, dirty_pages_rate=278378, postcopy_req=4078
>>>
>>> (Feel free to ignore my comment if you have reached a consensus.)
>>>
>>> Putting multiple fields in one line is a true need for human reading?
>>
>> It definitely helps me but I agree that can be subjective. So I'm happy to
>> collect opinions.
>>
>> So my above layout was trying to leverage more on screens where width is
>> bigger than the height (which is pretty much the default).
>
> I think perhaps the problem with the on-one-line layout is that the grouping
> is wrong; grouping by unit probably doesn't make sense.
>
> So it makes sense to me to have:
> Sizes: psize=4/KB
> Transfer: total=16777992 kB transferred=37673019 kB remain=11563855 kB
> Pages: normal=9394288 zero=600672
> Page rates: transferred=185875/s dirtied=278378/s
> Other: dirty_sync=3 postcopy_req=4078
Oh, I vote this !!, more clear to me.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/2] migration/hmp: Add "info migrate -a", reorg the dump
2025-05-21 14:03 ` Peter Xu
2025-05-21 21:04 ` Dr. David Alan Gilbert
@ 2025-05-22 1:07 ` Zhijian Li (Fujitsu) via
1 sibling, 0 replies; 17+ messages in thread
From: Zhijian Li (Fujitsu) via @ 2025-05-22 1:07 UTC (permalink / raw)
To: Peter Xu
Cc: qemu-devel@nongnu.org, Fabiano Rosas, Prasad Pandit,
Dr . David Alan Gilbert, Juraj Marcin
On 21/05/2025 22:03, Peter Xu wrote:
> On Wed, May 21, 2025 at 08:43:37AM +0000, Zhijian Li (Fujitsu) wrote:
> [...]
>>> After this change, sample output (default, no "-a" specified):
>>>
>>> Status: postcopy-active
>>> Time (ms): total=40504, setup=14, down=145
>>> RAM info:
>>> Bandwidth (mbps): 6102.65
>>> Sizes (KB): psize=4, total=16777992
>>> transferred=37673019, remain=2136404,
>>> precopy=3, multifd=26108780, postcopy=11563855
>>> Pages: normal=9394288, zero=600672, rate_per_sec=185875
>>> Others: dirty_syncs=3, dirty_pages_rate=278378, postcopy_req=4078
>>
>> (Feel free to ignore my comment if you have reached a consensus.)
>>
>> Putting multiple fields in one line is a true need for human reading?
>
> It definitely helps me but I agree that can be subjective. So I'm happy to
> collect opinions.
>
> So my above layout was trying to leverage more on screens where width is
> bigger than the height (which is pretty much the default).
>
>> I don't have confident to reorg them so I feed this request to the AI,
>> he suggested something like this:
>>
>> Migration Status:
>> Status: completed
>>
>> Time Statistics:
>> Setup: 15 ms
>> Downtime: 76 ms
>> Total: 122952 ms
>> RAM Transfer:
>> Throughput: 8717.68 mbps
>> Page Size: 4 KB
>> Transferred:
>> Total: 130825923 KB
>> Precopied: 15 KB
>> Postcopied: 13691151 KB
>> Multifd: 117134260 KB
>> Remaining: 0 KB
>> Total RAM: 16777992 KB
>> Page Statistics:
>> Normal Pages: 32622225
>> Zero Pages: 0
>> Duplicate Pages: 997263
>> Transfer Page Rate: 169431
>> Dirty Page Rate: 1234
>> Dirty Syncs: 10
>
> I would trust you more than the AI, so feel free to share your opinion next
> time (which won't hurt if it was a result of AI discussions, but only which
> you agreed on :).
Thank you.
Actually the AI does much better than me in any aspects.
I have decided to surrender to AI:) https://syaro.io/1ksu/
>
> It's already in a pull, let's revisit whenever necessary. Thanks for the
> input!
Sounds good. Let’s proceed with the this and observe feedback from the end-uers..
Thanks
Zhijian
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/2] migration/hmp: Add "info migrate -a", reorg the dump
2025-05-22 0:55 ` Zhijian Li (Fujitsu) via
@ 2025-05-22 13:16 ` Peter Xu
2025-05-23 2:06 ` Zhijian Li (Fujitsu) via
0 siblings, 1 reply; 17+ messages in thread
From: Peter Xu @ 2025-05-22 13:16 UTC (permalink / raw)
To: Zhijian Li (Fujitsu)
Cc: Dr. David Alan Gilbert, qemu-devel@nongnu.org, Fabiano Rosas,
Prasad Pandit, Juraj Marcin
On Thu, May 22, 2025 at 12:55:05AM +0000, Zhijian Li (Fujitsu) wrote:
>
>
> On 22/05/2025 05:04, Dr. David Alan Gilbert wrote:
> > * Peter Xu (peterx@redhat.com) wrote:
> >> On Wed, May 21, 2025 at 08:43:37AM +0000, Zhijian Li (Fujitsu) wrote:
> >> [...]
> >>>> After this change, sample output (default, no "-a" specified):
> >>>>
> >>>> Status: postcopy-active
> >>>> Time (ms): total=40504, setup=14, down=145
> >>>> RAM info:
> >>>> Bandwidth (mbps): 6102.65
> >>>> Sizes (KB): psize=4, total=16777992
> >>>> transferred=37673019, remain=2136404,
> >>>> precopy=3, multifd=26108780, postcopy=11563855
> >>>> Pages: normal=9394288, zero=600672, rate_per_sec=185875
> >>>> Others: dirty_syncs=3, dirty_pages_rate=278378, postcopy_req=4078
> >>>
> >>> (Feel free to ignore my comment if you have reached a consensus.)
> >>>
> >>> Putting multiple fields in one line is a true need for human reading?
> >>
> >> It definitely helps me but I agree that can be subjective. So I'm happy to
> >> collect opinions.
> >>
> >> So my above layout was trying to leverage more on screens where width is
> >> bigger than the height (which is pretty much the default).
> >
> > I think perhaps the problem with the on-one-line layout is that the grouping
> > is wrong; grouping by unit probably doesn't make sense.
> >
> > So it makes sense to me to have:
> > Sizes: psize=4/KB
> > Transfer: total=16777992 kB transferred=37673019 kB remain=11563855 kB
> > Pages: normal=9394288 zero=600672
> > Page rates: transferred=185875/s dirtied=278378/s
> > Other: dirty_sync=3 postcopy_req=4078
>
>
> Oh, I vote this !!, more clear to me.
I followed up with Dave's idea, but then added all entries into it, below.
Status: postcopy-active
Time (ms): total=40504, setup=14, down=145
RAM info:
Throughput (Mbps): 6102.65
Sizes (KiB): pagesize=4, total=16777992
Transfers (KiB): transferred=37673019, remain=2136404
Channels (KiB): precopy=3, multifd=26108780, postcopy=11563855
Page Types: normal=9394288, zero=600672
Page Rates (pps): transfer_rate=185875, dirty_rate=278378
Others: dirty_syncs=3, postcopy_req=4078
Logically I should have moved "Throughput" out, because that should also
include all other things (non-ram iterators, device states). But currently
it's an entry under info->ram.. so I kept it there.
It also has the "total" in "Sizes" to make the next line shorter
(meanwhile, "total" is also a constant size like "psize"), the hope is it's
still close enough to read when reading "Transfers" on the next line.
I also provided further indents to "Channels" and "Page Types" because they
should be taken as sub-class of "Transfer".
How is this? Since we're at it, I can send a follow up patch after we
reach a consensus (I may also include that in another series where I'll
further add things into HMP; I'm looking at making blocktime to report page
latencies too).
--
Peter Xu
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/2] migration: Allow caps to be set when preempt or multifd cap enabled
2025-05-14 20:01 ` [PATCH v2 1/2] migration: Allow caps to be set when preempt or multifd cap enabled Peter Xu
@ 2025-05-22 20:15 ` Michael Tokarev
0 siblings, 0 replies; 17+ messages in thread
From: Michael Tokarev @ 2025-05-22 20:15 UTC (permalink / raw)
To: Peter Xu, qemu-devel
Cc: Fabiano Rosas, Prasad Pandit, Dr . David Alan Gilbert,
Juraj Marcin
On 14.05.2025 23:01, Peter Xu wrote:
> With commit 82137e6c8c ("migration: enforce multifd and postcopy preempt to
> be set before incoming"), and if postcopy preempt / multifd is enabled, one
> cannot setup any capability because these checks would always fail.
>
> (qemu) migrate_set_capability xbzrle off
> Error: Postcopy preempt must be set before incoming starts
>
> To fix it, check existing cap and only raise an error if the specific cap
> changed.
>
> Fixes: 82137e6c8c ("migration: enforce multifd and postcopy preempt to be set before incoming")
> Reviewed-by: Dr. David Alan Gilbert <dave@treblig.org>
> Reviewed-by: Juraj Marcin <jmarcin@redhat.com>
> Signed-off-by: Peter Xu <peterx@redhat.com>
Hi!
Is this a qemu-stable material (for 9.2 and 10.0 branches)?
Please let me know if it is not.
Thanks,
/mjt
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/2] migration/hmp: Add "info migrate -a", reorg the dump
2025-05-22 13:16 ` Peter Xu
@ 2025-05-23 2:06 ` Zhijian Li (Fujitsu) via
2025-05-26 15:40 ` Peter Xu
0 siblings, 1 reply; 17+ messages in thread
From: Zhijian Li (Fujitsu) via @ 2025-05-23 2:06 UTC (permalink / raw)
To: Peter Xu
Cc: Dr. David Alan Gilbert, qemu-devel@nongnu.org, Fabiano Rosas,
Prasad Pandit, Juraj Marcin
On 22/05/2025 21:16, Peter Xu wrote:
> I followed up with Dave's idea, but then added all entries into it, below.
>
> Status: postcopy-active
> Time (ms): total=40504, setup=14, down=145
> RAM info:
> Throughput (Mbps): 6102.65
> Sizes (KiB): pagesize=4, total=16777992
> Transfers (KiB): transferred=37673019, remain=2136404
> Channels (KiB): precopy=3, multifd=26108780, postcopy=11563855
> Page Types: normal=9394288, zero=600672
> Page Rates (pps): transfer_rate=185875, dirty_rate=278378
Regarding the "transfer_rate" and "dirty_rate" fields:
Would it be clearer to drop the "_rate" suffix since the category header
"Page Rates (pps)" already implies they are rate metrics?
> Others: dirty_syncs=3, postcopy_req=4078
>
> Logically I should have moved "Throughput" out, because that should also
> include all other things (non-ram iterators, device states). But currently
> it's an entry under info->ram.. so I kept it there.
>
> It also has the "total" in "Sizes" to make the next line shorter
> (meanwhile, "total" is also a constant size like "psize"), the hope is it's
> still close enough to read when reading "Transfers" on the next line.
>
> I also provided further indents to "Channels" and "Page Types" because they
> should be taken as sub-class of "Transfer".
>
> How is this? Since we're at it, I can send a follow up patch after we
> reach a consensus (I may also include that in another series where I'll
> further add things into HMP; I'm looking at making blocktime to report page
> latencies too).
Your revised layout aligns well with my preferences. Acked.
Thanks
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 2/2] migration/hmp: Add "info migrate -a", reorg the dump
2025-05-23 2:06 ` Zhijian Li (Fujitsu) via
@ 2025-05-26 15:40 ` Peter Xu
0 siblings, 0 replies; 17+ messages in thread
From: Peter Xu @ 2025-05-26 15:40 UTC (permalink / raw)
To: Zhijian Li (Fujitsu)
Cc: Dr. David Alan Gilbert, qemu-devel@nongnu.org, Fabiano Rosas,
Prasad Pandit, Juraj Marcin
On Fri, May 23, 2025 at 02:06:42AM +0000, Zhijian Li (Fujitsu) wrote:
>
>
> On 22/05/2025 21:16, Peter Xu wrote:
> > I followed up with Dave's idea, but then added all entries into it, below.
> >
> > Status: postcopy-active
> > Time (ms): total=40504, setup=14, down=145
> > RAM info:
> > Throughput (Mbps): 6102.65
> > Sizes (KiB): pagesize=4, total=16777992
> > Transfers (KiB): transferred=37673019, remain=2136404
> > Channels (KiB): precopy=3, multifd=26108780, postcopy=11563855
> > Page Types: normal=9394288, zero=600672
> > Page Rates (pps): transfer_rate=185875, dirty_rate=278378
>
>
> Regarding the "transfer_rate" and "dirty_rate" fields:
> Would it be clearer to drop the "_rate" suffix since the category header
> "Page Rates (pps)" already implies they are rate metrics?
I made it verbose to be clear while still suitable in a line. I don't feel
strongly - I can drop them when proposing the patch, thanks.
--
Peter Xu
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2025-05-26 15:41 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-14 20:01 [PATCH v2 0/2] migration: Some fix and enhancements to HMP "info migrate" Peter Xu
2025-05-14 20:01 ` [PATCH v2 1/2] migration: Allow caps to be set when preempt or multifd cap enabled Peter Xu
2025-05-22 20:15 ` Michael Tokarev
2025-05-14 20:01 ` [PATCH v2 2/2] migration/hmp: Add "info migrate -a", reorg the dump Peter Xu
2025-05-14 20:29 ` Dr. David Alan Gilbert
2025-05-14 21:17 ` Peter Xu
2025-05-14 23:00 ` Dr. David Alan Gilbert
2025-05-21 8:43 ` Zhijian Li (Fujitsu) via
2025-05-21 14:03 ` Peter Xu
2025-05-21 21:04 ` Dr. David Alan Gilbert
2025-05-22 0:55 ` Zhijian Li (Fujitsu) via
2025-05-22 13:16 ` Peter Xu
2025-05-23 2:06 ` Zhijian Li (Fujitsu) via
2025-05-26 15:40 ` Peter Xu
2025-05-22 1:07 ` Zhijian Li (Fujitsu) via
2025-05-19 11:27 ` [PATCH v2 0/2] migration: Some fix and enhancements to HMP "info migrate" Mario Casquero
2025-05-20 17:03 ` Peter Xu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).