From: "Michael R. Hines" <mrhines@linux.vnet.ibm.com>
To: quintela@redhat.com
Cc: GILR@il.ibm.com, SADEKJ@il.ibm.com, BIRAN@il.ibm.com,
hinesmr@cn.ibm.com, qemu-devel@nongnu.org, EREZH@il.ibm.com,
owasserm@redhat.com, onom@us.ibm.com, junqing.wang@cs2c.com.cn,
lig.fnst@cn.fujitsu.com, gokul@us.ibm.com, dbulkow@gmail.com,
pbonzini@redhat.com, abali@us.ibm.com, isaku.yamahata@gmail.com,
"Michael R. Hines" <mrhines@us.ibm.com>
Subject: Re: [Qemu-devel] [RFC PATCH v2 07/12] mc: introduce additional QMP statistics for micro-checkpointing
Date: Fri, 04 Apr 2014 11:55:47 +0800 [thread overview]
Message-ID: <533E2D43.1040002@linux.vnet.ibm.com> (raw)
In-Reply-To: <87vbvkz9ay.fsf@elfo.mitica>
On 03/12/2014 05:59 AM, Juan Quintela wrote:
> mrhines@linux.vnet.ibm.com wrote:
>> From: "Michael R. Hines" <mrhines@us.ibm.com>
>>
>> MC provides a lot of new information, including the same RAM statistics
>> that ordinary migration does, so we centralize a lot of that printing
>> code into a common function so that the QMP printing statements don't
>> get duplicated too much.
>>
>> We also introduce a new MCStats structure (like MigrationStats) due
>> to the large number of non-migration related statistics - don't want
>> to confuse migration and MC too much, so let's keep them separate for now.
>>
>> Signed-off-by: Michael R. Hines <mrhines@us.ibm.com>
> We can add the non-mc stats if you split them. And you get a smaller
> series.
Well, the MIG_STATE_COMPLETED and the MIG_STATE_ACTIVE cleanup
is removing a ton of duplicated code anyway - that needed to be cleaned
up regardless.
But, for the MC-related statistics, this really is a completely new state
in the migration state machine with so many new statistics - I don't think
they belong in the MigrationInfo structure at all......
- Michael
> Later, Juan.
>
>
>> ---
>> hmp.c | 17 +++++++++
>> include/migration/migration.h | 6 +++
>> migration.c | 86 ++++++++++++++++++++++++++-----------------
>> qapi-schema.json | 33 +++++++++++++++++
>> 4 files changed, 109 insertions(+), 33 deletions(-)
>>
>> diff --git a/hmp.c b/hmp.c
>> index 1af0809..edf062e 100644
>> --- a/hmp.c
>> +++ b/hmp.c
>> @@ -203,6 +203,23 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
>> info->disk->total >> 10);
>> }
>>
>> + if (info->has_mc) {
>> + monitor_printf(mon, "checkpoints: %" PRIu64 "\n",
>> + info->mc->checkpoints);
>> + monitor_printf(mon, "xmit_time: %" PRIu64 " ms\n",
>> + info->mc->xmit_time);
>> + monitor_printf(mon, "log_dirty_time: %" PRIu64 " ms\n",
>> + info->mc->log_dirty_time);
>> + monitor_printf(mon, "migration_bitmap_time: %" PRIu64 " ms\n",
>> + info->mc->migration_bitmap_time);
>> + monitor_printf(mon, "ram_copy_time: %" PRIu64 " ms\n",
>> + info->mc->ram_copy_time);
>> + monitor_printf(mon, "copy_mbps: %0.2f mbps\n",
>> + info->mc->copy_mbps);
>> + monitor_printf(mon, "throughput: %0.2f mbps\n",
>> + info->mc->mbps);
>> + }
>> +
>> if (info->has_xbzrle_cache) {
>> monitor_printf(mon, "cache size: %" PRIu64 " bytes\n",
>> info->xbzrle_cache->cache_size);
>> diff --git a/include/migration/migration.h b/include/migration/migration.h
>> index e876a2c..f18ff5e 100644
>> --- a/include/migration/migration.h
>> +++ b/include/migration/migration.h
>> @@ -53,14 +53,20 @@ struct MigrationState
>> int state;
>> MigrationParams params;
>> double mbps;
>> + double copy_mbps;
>> int64_t total_time;
>> int64_t downtime;
>> int64_t expected_downtime;
>> + int64_t xmit_time;
>> + int64_t ram_copy_time;
>> + int64_t log_dirty_time;
>> + int64_t bitmap_time;
>> int64_t dirty_pages_rate;
>> int64_t dirty_bytes_rate;
>> bool enabled_capabilities[MIGRATION_CAPABILITY_MAX];
>> int64_t xbzrle_cache_size;
>> int64_t setup_time;
>> + int64_t checkpoints;
>> };
>>
>> void process_incoming_migration(QEMUFile *f);
>> diff --git a/migration.c b/migration.c
>> index f42dae4..0ccbeaa 100644
>> --- a/migration.c
>> +++ b/migration.c
>> @@ -59,7 +59,6 @@ MigrationState *migrate_get_current(void)
>> .state = MIG_STATE_NONE,
>> .bandwidth_limit = MAX_THROTTLE,
>> .xbzrle_cache_size = DEFAULT_MIGRATE_CACHE_SIZE,
>> - .mbps = -1,
>> };
>>
>> return ¤t_migration;
>> @@ -173,6 +172,31 @@ static void get_xbzrle_cache_stats(MigrationInfo *info)
>> }
>> }
>>
>> +static void get_ram_stats(MigrationState *s, MigrationInfo *info)
>> +{
>> + info->has_total_time = true;
>> + info->total_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME)
>> + - s->total_time;
>> +
>> + info->has_ram = true;
>> + info->ram = g_malloc0(sizeof(*info->ram));
>> + info->ram->transferred = ram_bytes_transferred();
>> + info->ram->total = ram_bytes_total();
>> + info->ram->duplicate = dup_mig_pages_transferred();
>> + info->ram->skipped = skipped_mig_pages_transferred();
>> + info->ram->normal = norm_mig_pages_transferred();
>> + info->ram->normal_bytes = norm_mig_bytes_transferred();
>> + info->ram->mbps = s->mbps;
>> +
>> + if (blk_mig_active()) {
>> + info->has_disk = true;
>> + info->disk = g_malloc0(sizeof(*info->disk));
>> + info->disk->transferred = blk_mig_bytes_transferred();
>> + info->disk->remaining = blk_mig_bytes_remaining();
>> + info->disk->total = blk_mig_bytes_total();
>> + }
>> +}
>> +
>> MigrationInfo *qmp_query_migrate(Error **errp)
>> {
>> MigrationInfo *info = g_malloc0(sizeof(*info));
>> @@ -199,26 +223,8 @@ MigrationInfo *qmp_query_migrate(Error **errp)
>> info->has_setup_time = true;
>> info->setup_time = s->setup_time;
>>
>> - info->has_ram = true;
>> - info->ram = g_malloc0(sizeof(*info->ram));
>> - 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->skipped = skipped_mig_pages_transferred();
>> - info->ram->normal = norm_mig_pages_transferred();
>> - info->ram->normal_bytes = norm_mig_bytes_transferred();
>> + get_ram_stats(s, info);
>> info->ram->dirty_pages_rate = s->dirty_pages_rate;
>> - info->ram->mbps = s->mbps;
>> -
>> - if (blk_mig_active()) {
>> - info->has_disk = true;
>> - info->disk = g_malloc0(sizeof(*info->disk));
>> - info->disk->transferred = blk_mig_bytes_transferred();
>> - info->disk->remaining = blk_mig_bytes_remaining();
>> - info->disk->total = blk_mig_bytes_total();
>> - }
>> -
>> get_xbzrle_cache_stats(info);
>> break;
>> case MIG_STATE_COMPLETED:
>> @@ -227,22 +233,37 @@ MigrationInfo *qmp_query_migrate(Error **errp)
>> info->has_status = true;
>> info->status = g_strdup("completed");
>> info->has_total_time = true;
>> - info->total_time = s->total_time;
>> + info->total_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME)
>> + - s->total_time;
>> info->has_downtime = true;
>> info->downtime = s->downtime;
>> info->has_setup_time = true;
>> info->setup_time = s->setup_time;
>>
>> - info->has_ram = true;
>> - info->ram = g_malloc0(sizeof(*info->ram));
>> - info->ram->transferred = ram_bytes_transferred();
>> - info->ram->remaining = 0;
>> - info->ram->total = ram_bytes_total();
>> - info->ram->duplicate = dup_mig_pages_transferred();
>> - info->ram->skipped = skipped_mig_pages_transferred();
>> - info->ram->normal = norm_mig_pages_transferred();
>> - info->ram->normal_bytes = norm_mig_bytes_transferred();
>> - info->ram->mbps = s->mbps;
>> + get_ram_stats(s, info);
>> + break;
>> + case MIG_STATE_CHECKPOINTING:
>> + info->has_status = true;
>> + info->status = g_strdup("checkpointing");
>> + info->has_setup_time = true;
>> + info->setup_time = s->setup_time;
>> + info->has_downtime = true;
>> + info->downtime = s->downtime;
>> +
>> + get_ram_stats(s, info);
>> + info->ram->dirty_pages_rate = s->dirty_pages_rate;
>> + get_xbzrle_cache_stats(info);
>> +
>> +
>> + info->has_mc = true;
>> + info->mc = g_malloc0(sizeof(*info->mc));
>> + info->mc->xmit_time = s->xmit_time;
>> + info->mc->log_dirty_time = s->log_dirty_time;
>> + info->mc->migration_bitmap_time = s->bitmap_time;
>> + info->mc->ram_copy_time = s->ram_copy_time;
>> + info->mc->copy_mbps = s->copy_mbps;
>> + info->mc->mbps = s->mbps;
>> + info->mc->checkpoints = s->checkpoints;
>> break;
>> case MIG_STATE_ERROR:
>> info->has_status = true;
>> @@ -646,8 +667,7 @@ static void *migration_thread(void *opaque)
>> double bandwidth = transferred_bytes / time_spent;
>> max_size = bandwidth * migrate_max_downtime() / 1000000;
>>
>> - s->mbps = time_spent ? (((double) transferred_bytes * 8.0) /
>> - ((double) time_spent / 1000.0)) / 1000.0 / 1000.0 : -1;
>> + s->mbps = MBPS(transferred_bytes, time_spent);
>>
>> DPRINTF("transferred %" PRIu64 " time_spent %" PRIu64
>> " bandwidth %g max_size %" PRId64 "\n",
>> diff --git a/qapi-schema.json b/qapi-schema.json
>> index 3c2ee4d..7306adc 100644
>> --- a/qapi-schema.json
>> +++ b/qapi-schema.json
>> @@ -603,6 +603,36 @@
>> 'cache-miss': 'int', 'overflow': 'int' } }
>>
>> ##
>> +# @MCStats
>> +#
>> +# Detailed Micro Checkpointing (MC) statistics
>> +#
>> +# @mbps: throughput of transmitting last MC
>> +#
>> +# @xmit-time: milliseconds to transmit last MC
>> +#
>> +# @log-dirty-time: milliseconds to GET_LOG_DIRTY for last MC
>> +#
>> +# @migration-bitmap-time: milliseconds to prepare dirty bitmap for last MC
>> +#
>> +# @ram-copy-time: milliseconds to ram_save_live() last MC to staging memory
>> +#
>> +# @copy-mbps: throughput of ram_save_live() to staging memory for last MC
>> +#
>> +# @checkpoints: cummulative total number of MCs generated
>> +#
>> +# Since: 2.x
>> +##
>> +{ 'type': 'MCStats',
>> + 'data': {'mbps': 'number',
>> + 'xmit-time': 'uint64',
>> + 'log-dirty-time': 'uint64',
>> + 'migration-bitmap-time': 'uint64',
>> + 'ram-copy-time': 'uint64',
>> + 'checkpoints' : 'uint64',
>> + 'copy-mbps': 'number' }}
>> +
>> +##
>> # @MigrationInfo
>> #
>> # Information about current migration process.
>> @@ -624,6 +654,8 @@
>> # migration statistics, only returned if XBZRLE feature is on and
>> # status is 'active' or 'completed' (since 1.2)
>> #
>> +# @mc: #options @MCStats containing details Micro-Checkpointing statistics
>> +#
>> # @total-time: #optional total amount of milliseconds since migration started.
>> # If migration has ended, it returns the total migration
>> # time. (since 1.2)
>> @@ -648,6 +680,7 @@
>> 'data': {'*status': 'str', '*ram': 'MigrationStats',
>> '*disk': 'MigrationStats',
>> '*xbzrle-cache': 'XBZRLECacheStats',
>> + '*mc': 'MCStats',
>> '*total-time': 'int',
>> '*expected-downtime': 'int',
>> '*downtime': 'int',
next prev parent reply other threads:[~2014-04-04 3:57 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-18 8:50 [Qemu-devel] [RFC PATCH v2 00/12] mc: fault tolerante through micro-checkpointing mrhines
2014-02-18 8:50 ` [Qemu-devel] [RFC PATCH v2 01/12] mc: add documentation for micro-checkpointing mrhines
2014-02-18 12:45 ` Dr. David Alan Gilbert
2014-02-19 1:40 ` Michael R. Hines
2014-02-19 11:27 ` Dr. David Alan Gilbert
2014-02-20 1:17 ` Michael R. Hines
2014-02-20 10:09 ` Dr. David Alan Gilbert
2014-02-20 11:14 ` Li Guang
2014-02-20 14:58 ` Michael R. Hines
2014-02-20 14:57 ` Michael R. Hines
2014-02-20 16:32 ` Dr. David Alan Gilbert
2014-02-21 4:54 ` Michael R. Hines
2014-02-21 9:44 ` Dr. David Alan Gilbert
2014-03-03 6:08 ` Michael R. Hines
2014-02-18 8:50 ` [Qemu-devel] [RFC PATCH v2 02/12] mc: timestamp migration_bitmap and KVM logdirty usage mrhines
2014-02-18 10:32 ` Dr. David Alan Gilbert
2014-02-19 1:42 ` Michael R. Hines
2014-03-11 21:31 ` Juan Quintela
2014-04-04 3:08 ` Michael R. Hines
2014-02-18 8:50 ` [Qemu-devel] [RFC PATCH v2 03/12] mc: introduce a 'checkpointing' status check into the VCPU states mrhines
2014-03-11 21:36 ` Juan Quintela
2014-04-04 3:11 ` Michael R. Hines
2014-03-11 21:40 ` Eric Blake
2014-04-04 3:12 ` Michael R. Hines
2014-02-18 8:50 ` [Qemu-devel] [RFC PATCH v2 04/12] mc: support custom page loading and copying mrhines
2014-02-18 8:50 ` [Qemu-devel] [RFC PATCH v2 05/12] rdma: accelerated memcpy() support and better external RDMA user interfaces mrhines
2014-02-18 8:50 ` [Qemu-devel] [RFC PATCH v2 06/12] mc: introduce state machine changes for MC mrhines
2014-02-19 1:00 ` Li Guang
2014-02-19 2:14 ` Michael R. Hines
2014-02-20 5:03 ` Michael R. Hines
2014-02-21 8:13 ` Michael R. Hines
2014-02-24 6:48 ` Li Guang
2014-02-26 2:52 ` Li Guang
2014-03-11 21:57 ` Juan Quintela
2014-04-04 3:50 ` Michael R. Hines
2014-02-18 8:50 ` [Qemu-devel] [RFC PATCH v2 07/12] mc: introduce additional QMP statistics for micro-checkpointing mrhines
2014-03-11 21:45 ` Eric Blake
2014-04-04 3:15 ` Michael R. Hines
2014-04-04 4:22 ` Eric Blake
2014-03-11 21:59 ` Juan Quintela
2014-04-04 3:55 ` Michael R. Hines [this message]
2014-02-18 8:50 ` [Qemu-devel] [RFC PATCH v2 08/12] mc: core logic mrhines
2014-02-19 1:07 ` Li Guang
2014-02-19 2:16 ` Michael R. Hines
2014-02-19 2:53 ` Li Guang
2014-02-19 4:27 ` Michael R. Hines
2014-02-18 8:50 ` [Qemu-devel] [RFC PATCH v2 09/12] mc: configure and makefile support mrhines
2014-02-18 8:50 ` [Qemu-devel] [RFC PATCH v2 10/12] mc: expose tunable parameter for checkpointing frequency mrhines
2014-03-11 21:49 ` Eric Blake
2014-03-11 22:15 ` Juan Quintela
2014-03-11 22:49 ` Eric Blake
2014-04-04 5:29 ` Michael R. Hines
2014-04-04 14:56 ` Eric Blake
2014-04-11 6:10 ` Michael R. Hines
2014-04-04 16:28 ` Dr. David Alan Gilbert
2014-04-04 16:35 ` Eric Blake
2014-04-04 3:29 ` Michael R. Hines
2014-02-18 8:50 ` [Qemu-devel] [RFC PATCH v2 11/12] mc: introduce new capabilities to control micro-checkpointing mrhines
2014-03-11 21:57 ` Eric Blake
2014-04-04 3:38 ` Michael R. Hines
2014-04-04 4:25 ` Eric Blake
2014-03-11 22:02 ` Juan Quintela
2014-03-11 22:07 ` Eric Blake
2014-04-04 3:57 ` Michael R. Hines
2014-04-04 3:56 ` Michael R. Hines
2014-02-18 8:50 ` [Qemu-devel] [RFC PATCH v2 12/12] mc: activate and use MC if requested mrhines
2014-02-18 9:28 ` [Qemu-devel] [RFC PATCH v2 00/12] mc: fault tolerante through micro-checkpointing Li Guang
2014-02-19 1:29 ` Michael R. Hines
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=533E2D43.1040002@linux.vnet.ibm.com \
--to=mrhines@linux.vnet.ibm.com \
--cc=BIRAN@il.ibm.com \
--cc=EREZH@il.ibm.com \
--cc=GILR@il.ibm.com \
--cc=SADEKJ@il.ibm.com \
--cc=abali@us.ibm.com \
--cc=dbulkow@gmail.com \
--cc=gokul@us.ibm.com \
--cc=hinesmr@cn.ibm.com \
--cc=isaku.yamahata@gmail.com \
--cc=junqing.wang@cs2c.com.cn \
--cc=lig.fnst@cn.fujitsu.com \
--cc=mrhines@us.ibm.com \
--cc=onom@us.ibm.com \
--cc=owasserm@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.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.