[libvirt] [RFC PATCH] libvirt support to force convergence of live guest migration

Jim Fehlig jfehlig at suse.com
Wed Jan 29 16:27:00 UTC 2014


Chegu Vinod wrote:
> Busy enterprise workloads hosted on large sized VM's tend to dirty
> memory faster than the transfer rate achieved via live guest migration.
> Despite some good recent improvements (& using dedicated 10Gig NICs
> between hosts) the live migration may NOT converge.
>
> Recently support was added in qemu (version 1.6) to allow a user to
> choose if they wish to force convergence of their migration via a
> new migration capability : "auto-converge". This feature allows for qemu
> to auto-detect lack of convergence and trigger a throttle-down of the
> VCPUs. 
>
> This RFC patch includes the libvirt support needed to trigger this
> feature. (Testing is still in progress)
>   

Vinod,

What is the status of this patch?  I see there were a few comments, but
don't see (or perhaps missed) a V2.

> Signed-off-by:  Chegu Vinod <chegu_vinod at hp.com>
> ---
>  include/libvirt/libvirt.h.in |    1 +
>  src/qemu/qemu_migration.c    |   44 ++++++++++++++++++++++++++++++++++++++++++
>  src/qemu/qemu_migration.h    |    1 +
>  src/qemu/qemu_monitor.c      |    2 +-
>  src/qemu/qemu_monitor.h      |    1 +
>  tools/virsh-domain.c         |    7 ++++++
>  6 files changed, 55 insertions(+), 1 deletions(-)
>
> diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
> index 146a59b..13b0bfc 100644
> --- a/include/libvirt/libvirt.h.in
> +++ b/include/libvirt/libvirt.h.in
> @@ -1192,6 +1192,7 @@ typedef enum {
>      VIR_MIGRATE_OFFLINE           = (1 << 10), /* offline migrate */
>      VIR_MIGRATE_COMPRESSED        = (1 << 11), /* compress data during migration */
>      VIR_MIGRATE_ABORT_ON_ERROR    = (1 << 12), /* abort migration on I/O errors happened during migration */
> +    VIR_MIGRATE_AUTO_CONVERGE     = (1 << 13), /* force auto-convergence during during migration */
>  } virDomainMigrateFlags;
>  
>  
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index e87ea85..8cc0c56 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -1565,6 +1565,40 @@ cleanup:
>  }
>  
>  static int
> +qemuMigrationSetAutoConverge(virQEMUDriverPtr driver,
> +                            virDomainObjPtr vm,
> +                            enum qemuDomainAsyncJob job)
> +{
> +    qemuDomainObjPrivatePtr priv = vm->privateData;
> +    int ret;
> +
> +    if (qemuDomainObjEnterMonitorAsync(driver, vm, job) < 0)
> +        return -1;
> +
> +    ret = qemuMonitorGetMigrationCapability(
> +                priv->mon,
> +                QEMU_MONITOR_MIGRATION_CAPS_AUTO_CONVERGE);
> +
> +    if (ret < 0) {
> +        goto cleanup;
> +    } else if (ret == 0) {
> +            virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
> +                           _("Auto-Converge migration is not supported by "
> +                             "QEMU binary"));
> +        ret = -1;
> +        goto cleanup;
> +    }
> +
> +    ret = qemuMonitorSetMigrationCapability(
> +                priv->mon,
> +                QEMU_MONITOR_MIGRATION_CAPS_AUTO_CONVERGE);
> +
> +cleanup:
> +    qemuDomainObjExitMonitor(driver, vm);
> +    return ret;
> +}
> +
> +static int
>  qemuMigrationWaitForSpice(virQEMUDriverPtr driver,
>                            virDomainObjPtr vm)
>  {
> @@ -2389,6 +2423,11 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver,
>                                      QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
>          goto stop;
>  
> +    if (flags & VIR_MIGRATE_AUTO_CONVERGE &&
> +        qemuMigrationSetAutoConverge(driver, vm,
> +                                    QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
> +        goto stop;
> +
>      if (mig->lockState) {
>          VIR_DEBUG("Received lockstate %s", mig->lockState);
>          VIR_FREE(priv->lockState);
> @@ -3181,6 +3220,11 @@ qemuMigrationRun(virQEMUDriverPtr driver,
>                                      QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
>          goto cleanup;
>  
> +    if (flags & VIR_MIGRATE_AUTO_CONVERGE &&
> +        qemuMigrationSetAutoConverge(driver, vm,
> +                                    QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
> +        goto cleanup;
> +
>      if (qemuDomainObjEnterMonitorAsync(driver, vm,
>                                         QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
>          goto cleanup;
> diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
> index cafa2a2..c4258a1 100644
> --- a/src/qemu/qemu_migration.h
> +++ b/src/qemu/qemu_migration.h
> @@ -39,6 +39,7 @@
>       VIR_MIGRATE_UNSAFE |                       \
>       VIR_MIGRATE_OFFLINE |                      \
>       VIR_MIGRATE_COMPRESSED |                   \
> +     VIR_MIGRATE_AUTO_CONVERGE |                \
>       VIR_MIGRATE_ABORT_ON_ERROR)
>  
>  /* All supported migration parameters and their types. */
> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> index 1514715..780a29a 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -118,7 +118,7 @@ VIR_ENUM_IMPL(qemuMonitorMigrationStatus,
>  
>  VIR_ENUM_IMPL(qemuMonitorMigrationCaps,
>                QEMU_MONITOR_MIGRATION_CAPS_LAST,
> -              "xbzrle")
> +              "xbzrle", "auto-converge")
>  
>  VIR_ENUM_IMPL(qemuMonitorVMStatus,
>                QEMU_MONITOR_VM_STATUS_LAST,
> diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
> index eabf000..95e70ab 100644
> --- a/src/qemu/qemu_monitor.h
> +++ b/src/qemu/qemu_monitor.h
> @@ -440,6 +440,7 @@ int qemuMonitorGetSpiceMigrationStatus(qemuMonitorPtr mon,
>  
>  typedef enum {
>      QEMU_MONITOR_MIGRATION_CAPS_XBZRLE,
> +    QEMU_MONITOR_MIGRATION_CAPS_AUTO_CONVERGE,
>  
>      QEMU_MONITOR_MIGRATION_CAPS_LAST
>  } qemuMonitorMigrationCaps;
> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> index 1fe138c..d94a81b 100644
> --- a/tools/virsh-domain.c
> +++ b/tools/virsh-domain.c
> @@ -8532,6 +8532,10 @@ static const vshCmdOptDef opts_migrate[] = {
>       .type = VSH_OT_BOOL,
>       .help = N_("compress repeated pages during live migration")
>      },
> +    {.name = "auto-converge",
> +     .type = VSH_OT_BOOL,
> +     .help = N_("force auto convergence during live migration")
> +    },
>      {.name = "abort-on-error",
>       .type = VSH_OT_BOOL,
>       .help = N_("abort on soft errors during migration")
> @@ -8676,6 +8680,9 @@ doMigrate(void *opaque)
>      if (vshCommandOptBool(cmd, "compressed"))
>          flags |= VIR_MIGRATE_COMPRESSED;
>  
> +    if (vshCommandOptBool(cmd, "auto-converge"))
> +        flags |= VIR_MIGRATE_AUTO_CONVERGE;
> +
>      if (vshCommandOptBool(cmd, "offline")) {
>          flags |= VIR_MIGRATE_OFFLINE;
>      }
>   

virsh.pod needs updated too.

Do you have time to continue working on this patch?  If not, I could
find some cycles to help out.  Thanks!

Regards,
Jim




More information about the libvir-list mailing list