Message ID | 20190111063732.10484-2-xiaoguangrong@tencent.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | optimize waiting for free thread to do compression | expand |
On 1/11/19 12:37 AM, guangrong.xiao@gmail.com wrote: > From: Xiao Guangrong <xiaoguangrong@tencent.com> > > It introduces a new statistic, pages-per-second, as bandwidth or mbps is > not enough to measure the performance of posting pages out as we have > compression, xbzrle, which can significantly reduce the amount of the > data size, instead, pages-per-second is the one we want > > Signed-off-by: Xiao Guangrong <xiaoguangrong@tencent.com> > --- > hmp.c | 2 ++ > +++ b/migration/migration.h > @@ -126,6 +126,12 @@ struct MigrationState > */ > QemuSemaphore rate_limit_sem; > > + /* pages already send at the beggining of current interation */ beginning, iteration > + uint64_t iteration_initial_pages; > + > + /* pages transferred per second */ > + double pages_per_second; > + > /* bytes already send at the beggining of current interation */ although you copied the existing typos > +++ b/qapi/migration.json > @@ -41,6 +41,9 @@ > # > # @multifd-bytes: The number of bytes sent through multifd (since 3.0) > # > +# @pages-per-second: the number of memory pages transferred per second > +# (Since 3.2) > +# 3.2 was last year; you'll need to update your series to use 4.0 on all new stuff
* guangrong.xiao@gmail.com (guangrong.xiao@gmail.com) wrote: > From: Xiao Guangrong <xiaoguangrong@tencent.com> > > It introduces a new statistic, pages-per-second, as bandwidth or mbps is > not enough to measure the performance of posting pages out as we have > compression, xbzrle, which can significantly reduce the amount of the > data size, instead, pages-per-second is the one we want > This makes sense to me. (With the typos fixed): Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> > Signed-off-by: Xiao Guangrong <xiaoguangrong@tencent.com> > --- > hmp.c | 2 ++ > migration/migration.c | 11 ++++++++++- > migration/migration.h | 8 ++++++++ > migration/ram.c | 6 ++++++ > qapi/migration.json | 5 ++++- > 5 files changed, 30 insertions(+), 2 deletions(-) > > diff --git a/hmp.c b/hmp.c > index 80aa5ab504..944e3e072d 100644 > --- a/hmp.c > +++ b/hmp.c > @@ -236,6 +236,8 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict) > 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", > + info->ram->pages_per_second); > > if (info->ram->dirty_pages_rate) { > monitor_printf(mon, "dirty pages rate: %" PRIu64 " pages\n", > diff --git a/migration/migration.c b/migration/migration.c > index ffc4d9e556..a82d594f29 100644 > --- a/migration/migration.c > +++ b/migration/migration.c > @@ -777,6 +777,7 @@ static void populate_ram_info(MigrationInfo *info, MigrationState *s) > info->ram->postcopy_requests = ram_counters.postcopy_requests; > info->ram->page_size = qemu_target_page_size(); > info->ram->multifd_bytes = ram_counters.multifd_bytes; > + info->ram->pages_per_second = s->pages_per_second; > > if (migrate_use_xbzrle()) { > info->has_xbzrle_cache = true; > @@ -1563,6 +1564,7 @@ void migrate_init(MigrationState *s) > s->rp_state.from_dst_file = NULL; > s->rp_state.error = false; > s->mbps = 0.0; > + s->pages_per_second = 0.0; > s->downtime = 0; > s->expected_downtime = 0; > s->setup_time = 0; > @@ -2881,7 +2883,7 @@ static void migration_calculate_complete(MigrationState *s) > static void migration_update_counters(MigrationState *s, > int64_t current_time) > { > - uint64_t transferred, time_spent; > + uint64_t transferred, transferred_pages, time_spent; > uint64_t current_bytes; /* bytes transferred since the beginning */ > double bandwidth; > > @@ -2898,6 +2900,11 @@ static void migration_update_counters(MigrationState *s, > s->mbps = (((double) transferred * 8.0) / > ((double) time_spent / 1000.0)) / 1000.0 / 1000.0; > > + transferred_pages = ram_get_total_transferred_pages() - > + s->iteration_initial_pages; > + s->pages_per_second = (double) transferred_pages / > + (((double) time_spent / 1000.0)); > + > /* > * if we haven't sent anything, we don't want to > * recalculate. 10000 is a small enough number for our purposes > @@ -2910,6 +2917,7 @@ static void migration_update_counters(MigrationState *s, > > s->iteration_start_time = current_time; > s->iteration_initial_bytes = current_bytes; > + s->iteration_initial_pages = ram_get_total_transferred_pages(); > > trace_migrate_transferred(transferred, time_spent, > bandwidth, s->threshold_size); > @@ -3314,6 +3322,7 @@ static void migration_instance_init(Object *obj) > > ms->state = MIGRATION_STATUS_NONE; > ms->mbps = -1; > + ms->pages_per_second = -1; > qemu_sem_init(&ms->pause_sem, 0); > qemu_mutex_init(&ms->error_mutex); > > diff --git a/migration/migration.h b/migration/migration.h > index e413d4d8b6..810effc384 100644 > --- a/migration/migration.h > +++ b/migration/migration.h > @@ -126,6 +126,12 @@ struct MigrationState > */ > QemuSemaphore rate_limit_sem; > > + /* pages already send at the beggining of current interation */ > + uint64_t iteration_initial_pages; > + > + /* pages transferred per second */ > + double pages_per_second; > + > /* bytes already send at the beggining of current interation */ > uint64_t iteration_initial_bytes; > /* time at the start of current iteration */ > @@ -271,6 +277,8 @@ bool migrate_use_block_incremental(void); > int migrate_max_cpu_throttle(void); > bool migrate_use_return_path(void); > > +uint64_t ram_get_total_transferred_pages(void); > + > bool migrate_use_compression(void); > int migrate_compress_level(void); > int migrate_compress_threads(void); > diff --git a/migration/ram.c b/migration/ram.c > index 7e7deec4d8..7e429b0502 100644 > --- a/migration/ram.c > +++ b/migration/ram.c > @@ -1593,6 +1593,12 @@ uint64_t ram_pagesize_summary(void) > return summary; > } > > +uint64_t ram_get_total_transferred_pages(void) > +{ > + return ram_counters.normal + ram_counters.duplicate + > + compression_counters.pages + xbzrle_counters.pages; > +} > + > static void migration_update_rates(RAMState *rs, int64_t end_time) > { > uint64_t page_count = rs->target_page_count - rs->target_page_count_prev; > diff --git a/qapi/migration.json b/qapi/migration.json > index 31b589ec26..c5babd03b0 100644 > --- a/qapi/migration.json > +++ b/qapi/migration.json > @@ -41,6 +41,9 @@ > # > # @multifd-bytes: The number of bytes sent through multifd (since 3.0) > # > +# @pages-per-second: the number of memory pages transferred per second > +# (Since 3.2) > +# > # Since: 0.14.0 > ## > { 'struct': 'MigrationStats', > @@ -49,7 +52,7 @@ > 'normal-bytes': 'int', 'dirty-pages-rate' : 'int', > 'mbps' : 'number', 'dirty-sync-count' : 'int', > 'postcopy-requests' : 'int', 'page-size' : 'int', > - 'multifd-bytes' : 'uint64' } } > + 'multifd-bytes' : 'uint64', 'pages-per-second' : 'uint64' } } > > ## > # @XBZRLECacheStats: > -- > 2.14.5 > -- Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
* Eric Blake (eblake@redhat.com) wrote: > On 1/11/19 12:37 AM, guangrong.xiao@gmail.com wrote: > > From: Xiao Guangrong <xiaoguangrong@tencent.com> > > > > It introduces a new statistic, pages-per-second, as bandwidth or mbps is > > not enough to measure the performance of posting pages out as we have > > compression, xbzrle, which can significantly reduce the amount of the > > data size, instead, pages-per-second is the one we want > > > > Signed-off-by: Xiao Guangrong <xiaoguangrong@tencent.com> > > --- > > hmp.c | 2 ++ I've queued this 1/3 and fixed these typos during the merge. Dave > > > +++ b/migration/migration.h > > @@ -126,6 +126,12 @@ struct MigrationState > > */ > > QemuSemaphore rate_limit_sem; > > > > + /* pages already send at the beggining of current interation */ > > beginning, iteration > > > + uint64_t iteration_initial_pages; > > + > > + /* pages transferred per second */ > > + double pages_per_second; > > + > > /* bytes already send at the beggining of current interation */ > > although you copied the existing typos > > > +++ b/qapi/migration.json > > @@ -41,6 +41,9 @@ > > # > > # @multifd-bytes: The number of bytes sent through multifd (since 3.0) > > # > > +# @pages-per-second: the number of memory pages transferred per second > > +# (Since 3.2) > > +# > > 3.2 was last year; you'll need to update your series to use 4.0 on all > new stuff > > -- > Eric Blake, Principal Software Engineer > Red Hat, Inc. +1-919-301-3226 > Virtualization: qemu.org | libvirt.org > -- Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
diff --git a/hmp.c b/hmp.c index 80aa5ab504..944e3e072d 100644 --- a/hmp.c +++ b/hmp.c @@ -236,6 +236,8 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict) 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", + info->ram->pages_per_second); if (info->ram->dirty_pages_rate) { monitor_printf(mon, "dirty pages rate: %" PRIu64 " pages\n", diff --git a/migration/migration.c b/migration/migration.c index ffc4d9e556..a82d594f29 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -777,6 +777,7 @@ static void populate_ram_info(MigrationInfo *info, MigrationState *s) info->ram->postcopy_requests = ram_counters.postcopy_requests; info->ram->page_size = qemu_target_page_size(); info->ram->multifd_bytes = ram_counters.multifd_bytes; + info->ram->pages_per_second = s->pages_per_second; if (migrate_use_xbzrle()) { info->has_xbzrle_cache = true; @@ -1563,6 +1564,7 @@ void migrate_init(MigrationState *s) s->rp_state.from_dst_file = NULL; s->rp_state.error = false; s->mbps = 0.0; + s->pages_per_second = 0.0; s->downtime = 0; s->expected_downtime = 0; s->setup_time = 0; @@ -2881,7 +2883,7 @@ static void migration_calculate_complete(MigrationState *s) static void migration_update_counters(MigrationState *s, int64_t current_time) { - uint64_t transferred, time_spent; + uint64_t transferred, transferred_pages, time_spent; uint64_t current_bytes; /* bytes transferred since the beginning */ double bandwidth; @@ -2898,6 +2900,11 @@ static void migration_update_counters(MigrationState *s, s->mbps = (((double) transferred * 8.0) / ((double) time_spent / 1000.0)) / 1000.0 / 1000.0; + transferred_pages = ram_get_total_transferred_pages() - + s->iteration_initial_pages; + s->pages_per_second = (double) transferred_pages / + (((double) time_spent / 1000.0)); + /* * if we haven't sent anything, we don't want to * recalculate. 10000 is a small enough number for our purposes @@ -2910,6 +2917,7 @@ static void migration_update_counters(MigrationState *s, s->iteration_start_time = current_time; s->iteration_initial_bytes = current_bytes; + s->iteration_initial_pages = ram_get_total_transferred_pages(); trace_migrate_transferred(transferred, time_spent, bandwidth, s->threshold_size); @@ -3314,6 +3322,7 @@ static void migration_instance_init(Object *obj) ms->state = MIGRATION_STATUS_NONE; ms->mbps = -1; + ms->pages_per_second = -1; qemu_sem_init(&ms->pause_sem, 0); qemu_mutex_init(&ms->error_mutex); diff --git a/migration/migration.h b/migration/migration.h index e413d4d8b6..810effc384 100644 --- a/migration/migration.h +++ b/migration/migration.h @@ -126,6 +126,12 @@ struct MigrationState */ QemuSemaphore rate_limit_sem; + /* pages already send at the beggining of current interation */ + uint64_t iteration_initial_pages; + + /* pages transferred per second */ + double pages_per_second; + /* bytes already send at the beggining of current interation */ uint64_t iteration_initial_bytes; /* time at the start of current iteration */ @@ -271,6 +277,8 @@ bool migrate_use_block_incremental(void); int migrate_max_cpu_throttle(void); bool migrate_use_return_path(void); +uint64_t ram_get_total_transferred_pages(void); + bool migrate_use_compression(void); int migrate_compress_level(void); int migrate_compress_threads(void); diff --git a/migration/ram.c b/migration/ram.c index 7e7deec4d8..7e429b0502 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -1593,6 +1593,12 @@ uint64_t ram_pagesize_summary(void) return summary; } +uint64_t ram_get_total_transferred_pages(void) +{ + return ram_counters.normal + ram_counters.duplicate + + compression_counters.pages + xbzrle_counters.pages; +} + static void migration_update_rates(RAMState *rs, int64_t end_time) { uint64_t page_count = rs->target_page_count - rs->target_page_count_prev; diff --git a/qapi/migration.json b/qapi/migration.json index 31b589ec26..c5babd03b0 100644 --- a/qapi/migration.json +++ b/qapi/migration.json @@ -41,6 +41,9 @@ # # @multifd-bytes: The number of bytes sent through multifd (since 3.0) # +# @pages-per-second: the number of memory pages transferred per second +# (Since 3.2) +# # Since: 0.14.0 ## { 'struct': 'MigrationStats', @@ -49,7 +52,7 @@ 'normal-bytes': 'int', 'dirty-pages-rate' : 'int', 'mbps' : 'number', 'dirty-sync-count' : 'int', 'postcopy-requests' : 'int', 'page-size' : 'int', - 'multifd-bytes' : 'uint64' } } + 'multifd-bytes' : 'uint64', 'pages-per-second' : 'uint64' } } ## # @XBZRLECacheStats: