[libvirt] [RFC PATCH v2 1/3] qemu: Expose additional timing metrics for 'setup' and 'mbps'
Michael R. Hines
mrhines at linux.vnet.ibm.com
Fri Apr 4 05:40:19 UTC 2014
On 02/03/2014 08:32 PM, Jiri Denemark wrote:
> On Mon, Jan 13, 2014 at 14:28:10 +0800, mrhines at linux.vnet.ibm.com wrote:
>> From: "Michael R. Hines" <mrhines at us.ibm.com>
>>
>> RDMA migration uses the 'setup' state in QEMU to optionally lock
>> all memory before the migration starts. The total time spent in
>> this state is already exposed by QEMU, so expose it in libvirt.
>>
>> Additionally, QEMU also now exports migration throughput (mbps),
>> so let's see that one too...
>>
>> Signed-off-by: Michael R. Hines <mrhines at us.ibm.com>
>> ---
>> include/libvirt/libvirt.h.in | 15 +++++++++++++++
>> src/qemu/qemu_driver.c | 14 ++++++++++++++
>> src/qemu/qemu_monitor.h | 12 ++++++++++++
>> src/qemu/qemu_monitor_json.c | 8 ++++++++
>> 4 files changed, 49 insertions(+)
>>
>> diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
>> index 5aad75c..5ac2694 100644
>> --- a/include/libvirt/libvirt.h.in
>> +++ b/include/libvirt/libvirt.h.in
>> @@ -4153,6 +4153,21 @@ int virDomainAbortJob(virDomainPtr dom);
>> #define VIR_DOMAIN_JOB_DOWNTIME "downtime"
>>
>> /**
>> + * VIR_DOMAIN_JOB_MBPS:
>> + *
>> + * virDomainGetJobStats field: network throughput used while migrating.
>> + */
>> +#define VIR_DOMAIN_JOB_MBPS "mbps"
> I think this would be better as
>
> #define VIR_DOMAIN_JOB_THROUGHPUT "throughput"
>
> And you need to explicitly mention the type of the value returned in
> this parameter.
Acknowledged.
>
>> +
>> +/**
>> + * VIR_DOMAIN_JOB_SETUP_TIME:
>> + *
>> + * virDomainGetJobStats field: total time in milliseconds spent preparing
>> + * the migration in the 'setup' phase before the iterations begin.
>> + */
>> +#define VIR_DOMAIN_JOB_SETUP_TIME "setup_time"
> Again, the documentation does not mention what type is returned.
Acknowledged.
>> +
>> +/**
>> * VIR_DOMAIN_JOB_DATA_TOTAL:
>> *
>> * virDomainGetJobStats field: total number of bytes supposed to be
>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 47d8a09..6a7dcc7 100644
>> --- a/src/qemu/qemu_driver.c
>> +++ b/src/qemu/qemu_driver.c
>> @@ -11078,6 +11078,20 @@ qemuDomainGetJobStats(virDomainPtr dom,
>> goto cleanup;
>> }
>>
>> + if (priv->job.status.mbps_set) {
>> + if (virTypedParamsAddDouble(&par, &npar, &maxpar,
>> + VIR_DOMAIN_JOB_MBPS,
>> + priv->job.status.mbps) < 0)
>> + goto cleanup;
>> + }
> I think we should take the Mbps value from qemu and turn it into Bps (or
> even bps), which would make this parameter consistent with other
> migration statistics parameters that return values in bytes. And then we
> can change the type to ULLong.
>
Acknowledged.
>> +
>> + if (priv->job.status.setup_time_set) {
>> + if (virTypedParamsAddULLong(&par, &npar, &maxpar,
>> + VIR_DOMAIN_JOB_SETUP_TIME,
>> + priv->job.status.setup_time) < 0)
>> + goto cleanup;
>> + }
>> +
>> if (virTypedParamsAddULLong(&par, &npar, &maxpar,
>> VIR_DOMAIN_JOB_DISK_TOTAL,
>> priv->job.info.fileTotal) < 0 ||
>> diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
>> index eabf000..27f9cb4 100644
>> --- a/src/qemu/qemu_monitor.h
>> +++ b/src/qemu/qemu_monitor.h
>> @@ -412,6 +412,18 @@ struct _qemuMonitorMigrationStatus {
>> /* total or expected depending on status */
>> bool downtime_set;
>> unsigned long long downtime;
>> + /*
>> + * Duration of the QEMU 'setup' state.
>> + * for RDMA, this may be on the order of several seconds
>> + * if pinning support is requested before the migration begins.
>> + */
>> + bool setup_time_set;
>> + unsigned long long setup_time;
>> + /*
>> + * Migration throughput in Mbps.
>> + */
>> + bool mbps_set;
>> + double mbps;
>>
>> unsigned long long ram_transferred;
>> unsigned long long ram_remaining;
>> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
>> index ec3b958..214e140 100644
>> --- a/src/qemu/qemu_monitor_json.c
>> +++ b/src/qemu/qemu_monitor_json.c
>> @@ -2426,6 +2426,14 @@ qemuMonitorJSONGetMigrationStatusReply(virJSONValuePtr reply,
>> virJSONValueObjectGetNumberUlong(ram, "normal-bytes",
>> &status->ram_normal_bytes);
>>
>> + if (virJSONValueObjectGetNumberDouble(ram, "mbps",
>> + &status->mbps) == 0)
>> + status->mbps_set = true;
>> +
>> + if (virJSONValueObjectGetNumberUlong(ret, "setup-time",
>> + &status->setup_time) == 0)
>> + status->setup_time_set = true;
>> +
>> virJSONValuePtr disk = virJSONValueObjectGet(ret, "disk");
>> if (disk) {
>> rc = virJSONValueObjectGetNumberUlong(disk, "transferred",
> Overall the patch looks good and could even be pushed separately.
>
> Jirka
>
Will submit a v3 for everything soon....
- Michae
More information about the libvir-list
mailing list