From: Orit Wasserman <owasserm@redhat.com>
To: qemu-devel@nongnu.org
Cc: blauwirbel@gmail.com, stefanha@gmail.com,
Orit Wasserman <owasserm@redhat.com>,
avi@redhat.com, quintela@redhat.com
Subject: [Qemu-devel] [PATCH v6 11/11] Add XBZRLE statstics information
Date: Wed, 25 Jan 2012 13:26:49 +0200 [thread overview]
Message-ID: <1327490809-21393-12-git-send-email-owasserm@redhat.com> (raw)
In-Reply-To: <1327490809-21393-1-git-send-email-owasserm@redhat.com>
Signed-off-by: Orit Wasserman <owasserm@redhat.com>
---
arch_init.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
migration.c | 10 +++++++++
migration.h | 9 ++++++++
qapi-schema.json | 20 ++++++++++++++++-
4 files changed, 97 insertions(+), 2 deletions(-)
diff --git a/arch_init.c b/arch_init.c
index c7da4d7..92f1315 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -184,6 +184,59 @@ void arch_set_params(const MigrationParams *params, void *opaque)
arch_mig_state.use_xbzrle = params->use_xbzrle;
arch_mig_state.xbzrle_cache_size = params->xbzrle_cache_size;
}
+
+/* accounting */
+typedef struct AccountingInfo {
+ uint64_t dup_pages;
+ uint64_t norm_pages;
+ uint64_t xbzrle_bytes;
+ uint64_t xbzrle_pages;
+ uint64_t xbzrle_cache_miss;
+ uint64_t iterations;
+} AccountingInfo;
+
+static AccountingInfo acct_info;
+
+static void acct_clear(void)
+{
+ memset(&acct_info, 0, sizeof(acct_info));
+}
+
+uint64_t dup_mig_bytes_transferred(void)
+{
+ return acct_info.dup_pages * TARGET_PAGE_SIZE;
+}
+
+uint64_t dup_mig_pages_transferred(void)
+{
+ return acct_info.dup_pages;
+}
+
+uint64_t norm_mig_bytes_transferred(void)
+{
+ return acct_info.norm_pages * TARGET_PAGE_SIZE;
+}
+
+uint64_t norm_mig_pages_transferred(void)
+{
+ return acct_info.norm_pages;
+}
+
+uint64_t xbzrle_mig_bytes_transferred(void)
+{
+ return acct_info.xbzrle_bytes;
+}
+
+uint64_t xbzrle_mig_pages_transferred(void)
+{
+ return acct_info.xbzrle_pages;
+}
+
+uint64_t xbzrle_mig_pages_cache_miss(void)
+{
+ return acct_info.xbzrle_cache_miss;
+}
+
/***********************************************************/
/* XBRLE page cache implementation */
static CacheItem *cache_item_get(unsigned long pos, int item)
@@ -346,6 +399,7 @@ static int save_xbzrle_page(QEMUFile *f, uint8_t *current_data,
/* get location */
slot = cache_is_cached(current_addr);
if (slot == -1) {
+ acct_info.xbzrle_cache_miss++;
goto done;
}
cache_location = cache_get_cache_pos(current_addr);
@@ -369,7 +423,9 @@ static int save_xbzrle_page(QEMUFile *f, uint8_t *current_data,
save_block_hdr(f, block, offset, cont, RAM_SAVE_FLAG_XBZRLE);
qemu_put_buffer(f, (uint8_t *) &hdr, sizeof(hdr));
qemu_put_buffer(f, encoded_buf, encoded_len);
+ acct_info.xbzrle_pages++;
bytes_sent = encoded_len + sizeof(hdr);
+ acct_info.xbzrle_bytes += bytes_sent;
done:
g_free(encoded_buf);
@@ -407,6 +463,7 @@ static int ram_save_block(QEMUFile *f, int stage)
save_block_hdr(f, block, offset, cont, RAM_SAVE_FLAG_COMPRESS);
qemu_put_byte(f, *p);
bytes_sent = 1;
+ acct_info.dup_pages++;
} else if (stage == 2 && arch_mig_state.use_xbzrle) {
bytes_sent = save_xbzrle_page(f, p, current_addr, block,
offset, cont);
@@ -415,6 +472,7 @@ static int ram_save_block(QEMUFile *f, int stage)
save_block_hdr(f, block, offset, cont, RAM_SAVE_FLAG_PAGE);
qemu_put_buffer(f, p, TARGET_PAGE_SIZE);
bytes_sent = TARGET_PAGE_SIZE;
+ acct_info.norm_pages++;
}
if (arch_mig_state.use_xbzrle) {
cache_insert(current_addr, p);
@@ -535,6 +593,7 @@ int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
if (arch_mig_state.use_xbzrle) {
cache_init(arch_mig_state.xbzrle_cache_size);
+ acct_clear();
}
/* Make sure all dirty bits are set */
@@ -568,6 +627,7 @@ int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
/* bytes_sent -1 represent unchanged page */
if (bytes_sent > 0) {
bytes_transferred += bytes_sent;
+ acct_info.iterations++;
} else if (bytes_sent == 0) { /* no more blocks */
break;
}
diff --git a/migration.c b/migration.c
index 1cca73f..bf59036 100644
--- a/migration.c
+++ b/migration.c
@@ -135,6 +135,8 @@ MigrationInfo *qmp_query_migrate(Error **errp)
info->ram->transferred = ram_bytes_transferred();
info->ram->remaining = ram_bytes_remaining();
info->ram->total = ram_bytes_total();
+ info->ram->duplicate = dup_mig_pages_transferred();
+ info->ram->norm = norm_mig_pages_transferred();
if (blk_mig_active()) {
info->has_disk = true;
@@ -143,6 +145,14 @@ MigrationInfo *qmp_query_migrate(Error **errp)
info->disk->remaining = blk_mig_bytes_remaining();
info->disk->total = blk_mig_bytes_total();
}
+
+ if (s->params.use_xbzrle) {
+ info->has_cache = true;
+ info->cache = g_malloc0(sizeof(*info->cache));
+ info->cache->xbzrle_bytes = xbzrle_mig_bytes_transferred();
+ info->cache->xbzrle_pages = xbzrle_mig_pages_transferred();
+ info->cache->xbzrle_cache_miss = xbzrle_mig_pages_cache_miss();
+ }
break;
case MIG_STATE_COMPLETED:
info->has_status = true;
diff --git a/migration.h b/migration.h
index 4e53760..5e2e3c9 100644
--- a/migration.h
+++ b/migration.h
@@ -85,6 +85,15 @@ uint64_t ram_bytes_remaining(void);
uint64_t ram_bytes_transferred(void);
uint64_t ram_bytes_total(void);
+uint64_t dup_mig_bytes_transferred(void);
+uint64_t dup_mig_pages_transferred(void);
+uint64_t norm_mig_bytes_transferred(void);
+uint64_t norm_mig_pages_transferred(void);
+uint64_t xbzrle_mig_bytes_transferred(void);
+uint64_t xbzrle_mig_pages_transferred(void);
+uint64_t xbzrle_mig_pages_overflow(void);
+uint64_t xbzrle_mig_pages_cache_miss(void);
+
int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque);
int ram_load(QEMUFile *f, void *opaque, int version_id);
diff --git a/qapi-schema.json b/qapi-schema.json
index cb057d5..3e3b239 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -239,7 +239,23 @@
# Since: 0.14.0.
##
{ 'type': 'MigrationStats',
- 'data': {'transferred': 'int', 'remaining': 'int', 'total': 'int' } }
+ 'data': {'transferred': 'int', 'remaining': 'int', 'total': 'int', 'duplicate': 'int', 'norm': 'int' } }
+
+##
+# @CacheStats
+#
+# Detailed XBZRLE migration cache statistics
+#
+# @xbzrle_bytes: amount of bytes already transferred to the target VM
+#
+# @xbzrle_pages: amount of pages transferred to the target VM
+#
+# @xbzrle_cache_miss: numer of cache miss
+#
+# Since: 1.1
+##
+{ 'type': 'CacheStats',
+ 'data': {'xbzrle_bytes': 'int', 'xbzrle_pages': 'int', 'xbzrle_cache_miss': 'int' } }
##
# @MigrationInfo
@@ -262,7 +278,7 @@
##
{ 'type': 'MigrationInfo',
'data': {'*status': 'str', '*ram': 'MigrationStats',
- '*disk': 'MigrationStats'} }
+ '*disk': 'MigrationStats', '*cache': 'CacheStats'} }
##
# @query-migrate
--
1.7.6.5
next prev parent reply other threads:[~2012-01-25 11:30 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-25 11:26 [Qemu-devel] [PATCH v6 00/11] XBRLE delta for live migration of large memory app Orit Wasserman
2012-01-25 11:26 ` [Qemu-devel] [PATCH v6 01/11] Add cache handling functions Orit Wasserman
2012-01-25 11:26 ` [Qemu-devel] [PATCH v6 02/11] Add uleb encoding/decoding functions Orit Wasserman
2012-01-25 11:48 ` Avi Kivity
2012-01-25 12:22 ` Orit Wasserman
2012-01-25 12:27 ` Orit Wasserman
2012-01-25 11:26 ` [Qemu-devel] [PATCH v6 03/11] Add save_block_hdr function Orit Wasserman
2012-01-25 11:26 ` [Qemu-devel] [PATCH v6 04/11] Add host_from_stream_offset_versioned function Orit Wasserman
2012-01-25 11:26 ` [Qemu-devel] [PATCH v6 05/11] Add XBZRLE to ram_save_block and ram_save_live Orit Wasserman
2012-01-25 11:26 ` [Qemu-devel] [PATCH v6 06/11] Add MigrationParams structure Orit Wasserman
2012-01-25 11:26 ` [Qemu-devel] [PATCH v6 07/11] Add XBZRLE parameters to MigrationState Orit Wasserman
2012-01-25 11:26 ` [Qemu-devel] [PATCH v6 08/11] Add migration capabilties Orit Wasserman
2012-01-25 11:26 ` [Qemu-devel] [PATCH v6 09/11] Add set_cachesize command Orit Wasserman
2012-01-25 11:26 ` [Qemu-devel] [PATCH v6 10/11] Add XBZRLE option to migrate command Orit Wasserman
2012-01-25 11:26 ` Orit Wasserman [this message]
2012-01-25 11:53 ` [Qemu-devel] [PATCH v6 00/11] XBRLE delta for live migration of large memory app Avi Kivity
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=1327490809-21393-12-git-send-email-owasserm@redhat.com \
--to=owasserm@redhat.com \
--cc=avi@redhat.com \
--cc=blauwirbel@gmail.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=stefanha@gmail.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 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).