From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Wei Wang <wei.w.wang@intel.com>
Cc: kevin.tian@intel.com, berrange@redhat.com, quintela@redhat.com,
qemu-devel@nongnu.org, peterx@redhat.com, gloryxiao@tencent.com,
yi.y.sun@intel.com
Subject: Re: [PATCH v2] migration/xbzrle: add encoding rate
Date: Tue, 28 Apr 2020 15:51:10 +0100 [thread overview]
Message-ID: <20200428145110.GH2794@work-vm> (raw)
In-Reply-To: <1587974511-14953-1-git-send-email-wei.w.wang@intel.com>
* Wei Wang (wei.w.wang@intel.com) wrote:
> Users may need to check the xbzrle encoding rate to know if the guest
> memory is xbzrle encoding-friendly, and dynamically turn off the
> encoding if the encoding rate is low.
>
> Signed-off-by: Yi Sun <yi.y.sun@intel.com>
> Signed-off-by: Wei Wang <wei.w.wang@intel.com>
> ---
> migration/migration.c | 1 +
> migration/ram.c | 38 ++++++++++++++++++++++++++++++++++++--
> monitor/hmp-cmds.c | 2 ++
> qapi/migration.json | 5 ++++-
> 4 files changed, 43 insertions(+), 3 deletions(-)
>
> ChangeLog:
> - include the 3 bytes (ENCODING_FLAG_XBZRLE flag and encoded_len) when
> calculating the encoding rate. Similar to the compress rate
> calculation, the 8 byte RAM_SAVE_FLAG_CONTINUE flag isn't included in
> the calculation.
>
> diff --git a/migration/migration.c b/migration/migration.c
> index 187ac04..e404213 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -930,6 +930,7 @@ static void populate_ram_info(MigrationInfo *info, MigrationState *s)
> info->xbzrle_cache->pages = xbzrle_counters.pages;
> info->xbzrle_cache->cache_miss = xbzrle_counters.cache_miss;
> info->xbzrle_cache->cache_miss_rate = xbzrle_counters.cache_miss_rate;
> + info->xbzrle_cache->encoding_rate = xbzrle_counters.encoding_rate;
> info->xbzrle_cache->overflow = xbzrle_counters.overflow;
> }
>
> diff --git a/migration/ram.c b/migration/ram.c
> index 04f13fe..f46ab96 100644
> --- a/migration/ram.c
> +++ b/migration/ram.c
> @@ -327,6 +327,10 @@ struct RAMState {
> uint64_t num_dirty_pages_period;
> /* xbzrle misses since the beginning of the period */
> uint64_t xbzrle_cache_miss_prev;
> + /* Amount of xbzrle pages since the beginning of the period */
> + uint64_t xbzrle_pages_prev;
> + /* Amount of xbzrle encoded bytes since the beginning of the period */
> + uint64_t xbzrle_bytes_prev;
>
> /* compression statistics since the beginning of the period */
> /* amount of count that no free thread to compress data */
> @@ -696,6 +700,18 @@ static int save_xbzrle_page(RAMState *rs, uint8_t **current_data,
> return -1;
> }
>
> + /*
> + * Reaching here means the page has hit the xbzrle cache, no matter what
> + * encoding result it is (normal encoding, overflow or skipping the page),
> + * count the page as encoded. This is used to caculate the encoding rate.
> + *
> + * Example: 2 pages (8KB) being encoded, first page encoding generates 2KB,
> + * 2nd page turns out to be skipped (i.e. no new bytes written to the
> + * page), the overall encoding rate will be 8KB / 2KB = 4, which has the
> + * skipped page included. In this way, the encoding rate can tell if the
> + * guest page is good for xbzrle encoding.
> + */
> + xbzrle_counters.pages++;
Can you explain how that works with overflow? Doesn't overflow return
-1 here, not increment the bytes, so it looks like you've xbzrle'd a
page, but the encoding rate hasn't incremented.
Dave
> prev_cached_page = get_cached_data(XBZRLE.cache, current_addr);
>
> /* save current buffer into memory */
> @@ -736,8 +752,12 @@ static int save_xbzrle_page(RAMState *rs, uint8_t **current_data,
> qemu_put_be16(rs->f, encoded_len);
> qemu_put_buffer(rs->f, XBZRLE.encoded_buf, encoded_len);
> bytes_xbzrle += encoded_len + 1 + 2;
> - xbzrle_counters.pages++;
> - xbzrle_counters.bytes += bytes_xbzrle;
> + /*
> + * Like compressed_size (please see update_compress_thread_counts),
> + * the xbzrle encoded bytes don't count the 8 byte header with
> + * RAM_SAVE_FLAG_CONTINUE.
> + */
> + xbzrle_counters.bytes += bytes_xbzrle - 8;
> ram_counters.transferred += bytes_xbzrle;
>
> return 1;
> @@ -870,9 +890,23 @@ static void migration_update_rates(RAMState *rs, int64_t end_time)
> }
>
> if (migrate_use_xbzrle()) {
> + double encoded_size, unencoded_size;
> +
> xbzrle_counters.cache_miss_rate = (double)(xbzrle_counters.cache_miss -
> rs->xbzrle_cache_miss_prev) / page_count;
> rs->xbzrle_cache_miss_prev = xbzrle_counters.cache_miss;
> + unencoded_size = (xbzrle_counters.pages - rs->xbzrle_pages_prev) *
> + TARGET_PAGE_SIZE;
> + encoded_size = xbzrle_counters.bytes - rs->xbzrle_bytes_prev;
> + if (xbzrle_counters.pages == rs->xbzrle_pages_prev) {
> + xbzrle_counters.encoding_rate = 0;
> + } else if (!encoded_size) {
> + xbzrle_counters.encoding_rate = UINT64_MAX;
> + } else {
> + xbzrle_counters.encoding_rate = unencoded_size / encoded_size;
> + }
> + rs->xbzrle_pages_prev = xbzrle_counters.pages;
> + rs->xbzrle_bytes_prev = xbzrle_counters.bytes;
> }
>
> if (migrate_use_compression()) {
> diff --git a/monitor/hmp-cmds.c b/monitor/hmp-cmds.c
> index 9b94e67..c2a3a66 100644
> --- a/monitor/hmp-cmds.c
> +++ b/monitor/hmp-cmds.c
> @@ -303,6 +303,8 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
> 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",
> info->xbzrle_cache->overflow);
> }
> diff --git a/qapi/migration.json b/qapi/migration.json
> index eca2981..358e402 100644
> --- a/qapi/migration.json
> +++ b/qapi/migration.json
> @@ -70,6 +70,8 @@
> #
> # @cache-miss-rate: rate of cache miss (since 2.1)
> #
> +# @encoding-rate: rate of encoded bytes (since 5.1)
> +#
> # @overflow: number of overflows
> #
> # Since: 1.2
> @@ -77,7 +79,7 @@
> { 'struct': 'XBZRLECacheStats',
> 'data': {'cache-size': 'int', 'bytes': 'int', 'pages': 'int',
> 'cache-miss': 'int', 'cache-miss-rate': 'number',
> - 'overflow': 'int' } }
> + 'encoding-rate': 'number', 'overflow': 'int' } }
>
> ##
> # @CompressionStats:
> @@ -337,6 +339,7 @@
> # "pages":2444343,
> # "cache-miss":2244,
> # "cache-miss-rate":0.123,
> +# "encoding-rate":80.1,
> # "overflow":34434
> # }
> # }
> --
> 1.8.3.1
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2020-04-28 14:52 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-27 8:01 [PATCH v2] migration/xbzrle: add encoding rate Wei Wang
2020-04-28 14:51 ` Dr. David Alan Gilbert [this message]
2020-04-29 1:00 ` Wei Wang
2020-04-29 11:00 ` Dr. David Alan Gilbert
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200428145110.GH2794@work-vm \
--to=dgilbert@redhat.com \
--cc=berrange@redhat.com \
--cc=gloryxiao@tencent.com \
--cc=kevin.tian@intel.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=wei.w.wang@intel.com \
--cc=yi.y.sun@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.