diff mbox series

migrate/cpu-throttle: Add max-cpu-throttle migration parameter

Message ID 1533128420-2745-1-git-send-email-liq3ea@gmail.com (mailing list archive)
State New, archived
Headers show
Series migrate/cpu-throttle: Add max-cpu-throttle migration parameter | expand

Commit Message

Li Qiang Aug. 1, 2018, 1 p.m. UTC
Currently, the default maximum CPU throttle for migration is
99(CPU_THROTTLE_PCT_MAX). This is too big and can make a remarkable
performance effect for the guest. We see a lot of packets latency
exceed 500ms when the CPU_THROTTLE_PCT_MAX reached. This patch set
adds a new max-cpu-throttle parameter to limit the CPU throttle.

Signed-off-by: Li Qiang <liq3ea@gmail.com>
---
 hmp.c                 |  8 ++++++++
 migration/migration.c | 23 ++++++++++++++++++++++-
 migration/migration.h |  1 +
 migration/ram.c       |  4 +++-
 qapi/migration.json   | 21 ++++++++++++++++++---
 5 files changed, 52 insertions(+), 5 deletions(-)

Comments

Dr. David Alan Gilbert Aug. 2, 2018, 10:47 a.m. UTC | #1
* Li Qiang (liq3ea@gmail.com) wrote:
> Currently, the default maximum CPU throttle for migration is
> 99(CPU_THROTTLE_PCT_MAX). This is too big and can make a remarkable
> performance effect for the guest. We see a lot of packets latency
> exceed 500ms when the CPU_THROTTLE_PCT_MAX reached. This patch set
> adds a new max-cpu-throttle parameter to limit the CPU throttle.

I think this is OK, so

Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>

but I do have one comment below which made me think

> Signed-off-by: Li Qiang <liq3ea@gmail.com>
> ---
>  hmp.c                 |  8 ++++++++
>  migration/migration.c | 23 ++++++++++++++++++++++-
>  migration/migration.h |  1 +
>  migration/ram.c       |  4 +++-
>  qapi/migration.json   | 21 ++++++++++++++++++---
>  5 files changed, 52 insertions(+), 5 deletions(-)
> 
> diff --git a/hmp.c b/hmp.c
> index 2aafb50e8e..c38e8b1f78 100644
> --- a/hmp.c
> +++ b/hmp.c
> @@ -339,6 +339,10 @@ void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)
>          monitor_printf(mon, "%s: %u\n",
>              MigrationParameter_str(MIGRATION_PARAMETER_CPU_THROTTLE_INCREMENT),
>              params->cpu_throttle_increment);
> +        assert(params->has_max_cpu_throttle);
> +        monitor_printf(mon, "%s: %u\n",
> +            MigrationParameter_str(MIGRATION_PARAMETER_MAX_CPU_THROTTLE),
> +            params->max_cpu_throttle);
>          assert(params->has_tls_creds);
>          monitor_printf(mon, "%s: '%s'\n",
>              MigrationParameter_str(MIGRATION_PARAMETER_TLS_CREDS),
> @@ -1635,6 +1639,10 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
>          p->has_cpu_throttle_increment = true;
>          visit_type_int(v, param, &p->cpu_throttle_increment, &err);
>          break;
> +    case MIGRATION_PARAMETER_MAX_CPU_THROTTLE:
> +        p->has_max_cpu_throttle = true;
> +        visit_type_int(v, param, &p->max_cpu_throttle, &err);
> +        break;
>      case MIGRATION_PARAMETER_TLS_CREDS:
>          p->has_tls_creds = true;
>          p->tls_creds = g_new0(StrOrNull, 1);
> diff --git a/migration/migration.c b/migration/migration.c
> index b7d9854bda..570da6c0e7 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -71,6 +71,7 @@
>  /* Define default autoconverge cpu throttle migration parameters */
>  #define DEFAULT_MIGRATE_CPU_THROTTLE_INITIAL 20
>  #define DEFAULT_MIGRATE_CPU_THROTTLE_INCREMENT 10
> +#define DEFAULT_MIGRATE_MAX_CPU_THROTTLE 99
>  
>  /* Migration XBZRLE default cache size */
>  #define DEFAULT_MIGRATE_XBZRLE_CACHE_SIZE (64 * 1024 * 1024)
> @@ -697,6 +698,8 @@ MigrationParameters *qmp_query_migrate_parameters(Error **errp)
>      params->xbzrle_cache_size = s->parameters.xbzrle_cache_size;
>      params->has_max_postcopy_bandwidth = true;
>      params->max_postcopy_bandwidth = s->parameters.max_postcopy_bandwidth;
> +    params->has_max_cpu_throttle = true;
> +    params->max_cpu_throttle = s->parameters.max_cpu_throttle;
>  
>      return params;
>  }
> @@ -1043,6 +1046,15 @@ static bool migrate_params_check(MigrationParameters *params, Error **errp)
>          return false;
>      }
>  
> +    if (params->has_max_cpu_throttle &&
> +        (params->max_cpu_throttle < params->cpu_throttle_initial ||
> +         params->max_cpu_throttle > 99)) {
> +        error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
> +                   "max_cpu_throttle",
> +                   "an integer in the range of cpu_throttle_initial to 99");
> +        return false;
> +    }
> +
>      return true;
>  }
>  
> @@ -1110,6 +1122,9 @@ static void migrate_params_test_apply(MigrateSetParameters *params,
>      if (params->has_max_postcopy_bandwidth) {
>          dest->max_postcopy_bandwidth = params->max_postcopy_bandwidth;
>      }
> +    if (params->has_max_cpu_throttle) {
> +        dest->max_cpu_throttle = params->max_cpu_throttle;
> +    }
>  }
>  
>  static void migrate_params_apply(MigrateSetParameters *params, Error **errp)
> @@ -1185,6 +1200,9 @@ static void migrate_params_apply(MigrateSetParameters *params, Error **errp)
>      if (params->has_max_postcopy_bandwidth) {
>          s->parameters.max_postcopy_bandwidth = params->max_postcopy_bandwidth;
>      }
> +    if (params->has_max_cpu_throttle) {
> +        s->parameters.max_cpu_throttle = params->max_cpu_throttle;
> +    }
>  }
>  
>  void qmp_migrate_set_parameters(MigrateSetParameters *params, Error **errp)
> @@ -1962,7 +1980,6 @@ static int64_t migrate_max_postcopy_bandwidth(void)
>      return s->parameters.max_postcopy_bandwidth;
>  }
>  
> -
>  bool migrate_use_block(void)
>  {
>      MigrationState *s;
> @@ -3160,6 +3177,9 @@ static Property migration_properties[] = {
>      DEFINE_PROP_SIZE("max-postcopy-bandwidth", MigrationState,
>                        parameters.max_postcopy_bandwidth,
>                        DEFAULT_MIGRATE_MAX_POSTCOPY_BANDWIDTH),
> +    DEFINE_PROP_UINT8("max-cpu-throttle", MigrationState,
> +                      parameters.max_cpu_throttle,
> +                      DEFAULT_MIGRATE_MAX_CPU_THROTTLE),
>  
>      /* Migration capabilities */
>      DEFINE_PROP_MIG_CAP("x-xbzrle", MIGRATION_CAPABILITY_XBZRLE),
> @@ -3230,6 +3250,7 @@ static void migration_instance_init(Object *obj)
>      params->has_x_multifd_page_count = true;
>      params->has_xbzrle_cache_size = true;
>      params->has_max_postcopy_bandwidth = true;
> +    params->has_max_cpu_throttle = true;
>  
>      qemu_sem_init(&ms->postcopy_pause_sem, 0);
>      qemu_sem_init(&ms->postcopy_pause_rp_sem, 0);
> diff --git a/migration/migration.h b/migration/migration.h
> index 64a7b33735..eb0c04a7b4 100644
> --- a/migration/migration.h
> +++ b/migration/migration.h
> @@ -266,6 +266,7 @@ bool migrate_colo_enabled(void);
>  
>  bool migrate_use_block(void);
>  bool migrate_use_block_incremental(void);
> +int migrate_max_cpu_throttle(void);
>  bool migrate_use_return_path(void);
>  
>  bool migrate_use_compression(void);
> diff --git a/migration/ram.c b/migration/ram.c
> index 24dea2730c..cdd4349177 100644
> --- a/migration/ram.c
> +++ b/migration/ram.c
> @@ -1390,13 +1390,15 @@ static void mig_throttle_guest_down(void)
>      MigrationState *s = migrate_get_current();
>      uint64_t pct_initial = s->parameters.cpu_throttle_initial;
>      uint64_t pct_icrement = s->parameters.cpu_throttle_increment;
> +    int pct_max = s->parameters.max_cpu_throttle;
>  
>      /* We have not started throttling yet. Let's start it. */
>      if (!cpu_throttle_active()) {
>          cpu_throttle_set(pct_initial);
>      } else {
>          /* Throttling already on, just increase the rate */
> -        cpu_throttle_set(cpu_throttle_get_percentage() + pct_icrement);
> +        cpu_throttle_set(MIN(cpu_throttle_get_percentage() + pct_icrement,
> +                         pct_max));

I wondered whether we should just make this change inside
cpu_throttle_set and remove the CPU_THROTTLE_PCT_MAX define; but in the
end I decided you're code is probably better, because the
cpu_throttle_set code is generic, where as this limitation is specific
to why we're throttling it for migration.

Dave

>      }
>  }
>  
> diff --git a/qapi/migration.json b/qapi/migration.json
> index 186e8a7303..865064e18c 100644
> --- a/qapi/migration.json
> +++ b/qapi/migration.json
> @@ -523,6 +523,9 @@
>  # @max-postcopy-bandwidth: Background transfer bandwidth during postcopy.
>  #                     Defaults to 0 (unlimited).  In bytes per second.
>  #                     (Since 3.0)
> +#
> +# @max-cpu-throttle: maximum cpu throttle percentage.
> +#                    Defaults to 99. (Since 3.1)
>  # Since: 2.4
>  ##
>  { 'enum': 'MigrationParameter',
> @@ -531,7 +534,8 @@
>             'tls-creds', 'tls-hostname', 'max-bandwidth',
>             'downtime-limit', 'x-checkpoint-delay', 'block-incremental',
>             'x-multifd-channels', 'x-multifd-page-count',
> -           'xbzrle-cache-size', 'max-postcopy-bandwidth' ] }
> +           'xbzrle-cache-size', 'max-postcopy-bandwidth',
> +           'max-cpu-throttle' ] }
>  
>  ##
>  # @MigrateSetParameters:
> @@ -603,6 +607,10 @@
>  # @max-postcopy-bandwidth: Background transfer bandwidth during postcopy.
>  #                     Defaults to 0 (unlimited).  In bytes per second.
>  #                     (Since 3.0)
> +#
> +# @max-cpu-throttle: maximum cpu throttle percentage.
> +#                    The default value is 99. (Since 3.1)
> +#
>  # Since: 2.4
>  ##
>  # TODO either fuse back into MigrationParameters, or make
> @@ -622,7 +630,8 @@
>              '*x-multifd-channels': 'int',
>              '*x-multifd-page-count': 'int',
>              '*xbzrle-cache-size': 'size',
> -            '*max-postcopy-bandwidth': 'size' } }
> +            '*max-postcopy-bandwidth': 'size',
> +	    '*max-cpu-throttle': 'int' } }
>  
>  ##
>  # @migrate-set-parameters:
> @@ -709,6 +718,11 @@
>  # @max-postcopy-bandwidth: Background transfer bandwidth during postcopy.
>  #                     Defaults to 0 (unlimited).  In bytes per second.
>  #                     (Since 3.0)
> +#
> +# @max-cpu-throttle: maximum cpu throttle percentage.
> +#                    Defaults to 99.
> +#                     (Since 3.1)
> +#
>  # Since: 2.4
>  ##
>  { 'struct': 'MigrationParameters',
> @@ -726,7 +740,8 @@
>              '*x-multifd-channels': 'uint8',
>              '*x-multifd-page-count': 'uint32',
>              '*xbzrle-cache-size': 'size',
> -            '*max-postcopy-bandwidth': 'size'  } }
> +	    '*max-postcopy-bandwidth': 'size',
> +            '*max-cpu-throttle':'uint8'} }
>  
>  ##
>  # @query-migrate-parameters:
> -- 
> 2.11.0
> 
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
Li Qiang Aug. 3, 2018, 3:10 a.m. UTC | #2
2018-08-02 18:47 GMT+08:00 Dr. David Alan Gilbert <dgilbert@redhat.com>:

> * Li Qiang (liq3ea@gmail.com) wrote:
> > Currently, the default maximum CPU throttle for migration is
> > 99(CPU_THROTTLE_PCT_MAX). This is too big and can make a remarkable
> > performance effect for the guest. We see a lot of packets latency
> > exceed 500ms when the CPU_THROTTLE_PCT_MAX reached. This patch set
> > adds a new max-cpu-throttle parameter to limit the CPU throttle.
>
> I think this is OK, so
>
> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
>
> but I do have one comment below which made me think
>
> > Signed-off-by: Li Qiang <liq3ea@gmail.com>
> > ---
> >  hmp.c                 |  8 ++++++++
> >  migration/migration.c | 23 ++++++++++++++++++++++-
> >  migration/migration.h |  1 +
> >  migration/ram.c       |  4 +++-
> >  qapi/migration.json   | 21 ++++++++++++++++++---
> >  5 files changed, 52 insertions(+), 5 deletions(-)
> >
> > diff --git a/hmp.c b/hmp.c
> > index 2aafb50e8e..c38e8b1f78 100644
> > --- a/hmp.c
> > +++ b/hmp.c
> > @@ -339,6 +339,10 @@ void hmp_info_migrate_parameters(Monitor *mon,
> const QDict *qdict)
> >          monitor_printf(mon, "%s: %u\n",
> >              MigrationParameter_str(MIGRATION_PARAMETER_CPU_
> THROTTLE_INCREMENT),
> >              params->cpu_throttle_increment);
> > +        assert(params->has_max_cpu_throttle);
> > +        monitor_printf(mon, "%s: %u\n",
> > +            MigrationParameter_str(MIGRATION_PARAMETER_MAX_CPU_
> THROTTLE),
> > +            params->max_cpu_throttle);
> >          assert(params->has_tls_creds);
> >          monitor_printf(mon, "%s: '%s'\n",
> >              MigrationParameter_str(MIGRATION_PARAMETER_TLS_CREDS),
> > @@ -1635,6 +1639,10 @@ void hmp_migrate_set_parameter(Monitor *mon,
> const QDict *qdict)
> >          p->has_cpu_throttle_increment = true;
> >          visit_type_int(v, param, &p->cpu_throttle_increment, &err);
> >          break;
> > +    case MIGRATION_PARAMETER_MAX_CPU_THROTTLE:
> > +        p->has_max_cpu_throttle = true;
> > +        visit_type_int(v, param, &p->max_cpu_throttle, &err);
> > +        break;
> >      case MIGRATION_PARAMETER_TLS_CREDS:
> >          p->has_tls_creds = true;
> >          p->tls_creds = g_new0(StrOrNull, 1);
> > diff --git a/migration/migration.c b/migration/migration.c
> > index b7d9854bda..570da6c0e7 100644
> > --- a/migration/migration.c
> > +++ b/migration/migration.c
> > @@ -71,6 +71,7 @@
> >  /* Define default autoconverge cpu throttle migration parameters */
> >  #define DEFAULT_MIGRATE_CPU_THROTTLE_INITIAL 20
> >  #define DEFAULT_MIGRATE_CPU_THROTTLE_INCREMENT 10
> > +#define DEFAULT_MIGRATE_MAX_CPU_THROTTLE 99
> >
> >  /* Migration XBZRLE default cache size */
> >  #define DEFAULT_MIGRATE_XBZRLE_CACHE_SIZE (64 * 1024 * 1024)
> > @@ -697,6 +698,8 @@ MigrationParameters *qmp_query_migrate_parameters(Error
> **errp)
> >      params->xbzrle_cache_size = s->parameters.xbzrle_cache_size;
> >      params->has_max_postcopy_bandwidth = true;
> >      params->max_postcopy_bandwidth = s->parameters.max_postcopy_
> bandwidth;
> > +    params->has_max_cpu_throttle = true;
> > +    params->max_cpu_throttle = s->parameters.max_cpu_throttle;
> >
> >      return params;
> >  }
> > @@ -1043,6 +1046,15 @@ static bool migrate_params_check(MigrationParameters
> *params, Error **errp)
> >          return false;
> >      }
> >
> > +    if (params->has_max_cpu_throttle &&
> > +        (params->max_cpu_throttle < params->cpu_throttle_initial ||
> > +         params->max_cpu_throttle > 99)) {
> > +        error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
> > +                   "max_cpu_throttle",
> > +                   "an integer in the range of cpu_throttle_initial to
> 99");
> > +        return false;
> > +    }
> > +
> >      return true;
> >  }
> >
> > @@ -1110,6 +1122,9 @@ static void migrate_params_test_apply(MigrateSetParameters
> *params,
> >      if (params->has_max_postcopy_bandwidth) {
> >          dest->max_postcopy_bandwidth = params->max_postcopy_bandwidth;
> >      }
> > +    if (params->has_max_cpu_throttle) {
> > +        dest->max_cpu_throttle = params->max_cpu_throttle;
> > +    }
> >  }
> >
> >  static void migrate_params_apply(MigrateSetParameters *params, Error
> **errp)
> > @@ -1185,6 +1200,9 @@ static void migrate_params_apply(MigrateSetParameters
> *params, Error **errp)
> >      if (params->has_max_postcopy_bandwidth) {
> >          s->parameters.max_postcopy_bandwidth = params->max_postcopy_
> bandwidth;
> >      }
> > +    if (params->has_max_cpu_throttle) {
> > +        s->parameters.max_cpu_throttle = params->max_cpu_throttle;
> > +    }
> >  }
> >
> >  void qmp_migrate_set_parameters(MigrateSetParameters *params, Error
> **errp)
> > @@ -1962,7 +1980,6 @@ static int64_t migrate_max_postcopy_
> bandwidth(void)
> >      return s->parameters.max_postcopy_bandwidth;
> >  }
> >
> > -
> >  bool migrate_use_block(void)
> >  {
> >      MigrationState *s;
> > @@ -3160,6 +3177,9 @@ static Property migration_properties[] = {
> >      DEFINE_PROP_SIZE("max-postcopy-bandwidth", MigrationState,
> >                        parameters.max_postcopy_bandwidth,
> >                        DEFAULT_MIGRATE_MAX_POSTCOPY_BANDWIDTH),
> > +    DEFINE_PROP_UINT8("max-cpu-throttle", MigrationState,
> > +                      parameters.max_cpu_throttle,
> > +                      DEFAULT_MIGRATE_MAX_CPU_THROTTLE),
> >
> >      /* Migration capabilities */
> >      DEFINE_PROP_MIG_CAP("x-xbzrle", MIGRATION_CAPABILITY_XBZRLE),
> > @@ -3230,6 +3250,7 @@ static void migration_instance_init(Object *obj)
> >      params->has_x_multifd_page_count = true;
> >      params->has_xbzrle_cache_size = true;
> >      params->has_max_postcopy_bandwidth = true;
> > +    params->has_max_cpu_throttle = true;
> >
> >      qemu_sem_init(&ms->postcopy_pause_sem, 0);
> >      qemu_sem_init(&ms->postcopy_pause_rp_sem, 0);
> > diff --git a/migration/migration.h b/migration/migration.h
> > index 64a7b33735..eb0c04a7b4 100644
> > --- a/migration/migration.h
> > +++ b/migration/migration.h
> > @@ -266,6 +266,7 @@ bool migrate_colo_enabled(void);
> >
> >  bool migrate_use_block(void);
> >  bool migrate_use_block_incremental(void);
> > +int migrate_max_cpu_throttle(void);
> >  bool migrate_use_return_path(void);
> >
> >  bool migrate_use_compression(void);
> > diff --git a/migration/ram.c b/migration/ram.c
> > index 24dea2730c..cdd4349177 100644
> > --- a/migration/ram.c
> > +++ b/migration/ram.c
> > @@ -1390,13 +1390,15 @@ static void mig_throttle_guest_down(void)
> >      MigrationState *s = migrate_get_current();
> >      uint64_t pct_initial = s->parameters.cpu_throttle_initial;
> >      uint64_t pct_icrement = s->parameters.cpu_throttle_increment;
> > +    int pct_max = s->parameters.max_cpu_throttle;
> >
> >      /* We have not started throttling yet. Let's start it. */
> >      if (!cpu_throttle_active()) {
> >          cpu_throttle_set(pct_initial);
> >      } else {
> >          /* Throttling already on, just increase the rate */
> > -        cpu_throttle_set(cpu_throttle_get_percentage() + pct_icrement);
> > +        cpu_throttle_set(MIN(cpu_throttle_get_percentage() +
> pct_icrement,
> > +                         pct_max));
>
> I wondered whether we should just make this change inside
> cpu_throttle_set and remove the CPU_THROTTLE_PCT_MAX define; but in the
> end I decided you're code is probably better, because the
> cpu_throttle_set code is generic, where as this limitation is specific
> to why we're throttling it for migration.
>
>
Exactly.
I also have a more think here. I made the change in ' cpu_throttle_set ' in
the qmp version.
But here I choice this as it is more clear. Also I noticed the '
cpu_throttle_set' is not used only
in 'mig_throttle_guest_down' but also in ui/cocoa.m file(Though I'm not
sure what this is for.

Thanks,
Li Qiang


> Dave
>
> >      }
> >  }
> >
> > diff --git a/qapi/migration.json b/qapi/migration.json
> > index 186e8a7303..865064e18c 100644
> > --- a/qapi/migration.json
> > +++ b/qapi/migration.json
> > @@ -523,6 +523,9 @@
> >  # @max-postcopy-bandwidth: Background transfer bandwidth during
> postcopy.
> >  #                     Defaults to 0 (unlimited).  In bytes per second.
> >  #                     (Since 3.0)
> > +#
> > +# @max-cpu-throttle: maximum cpu throttle percentage.
> > +#                    Defaults to 99. (Since 3.1)
> >  # Since: 2.4
> >  ##
> >  { 'enum': 'MigrationParameter',
> > @@ -531,7 +534,8 @@
> >             'tls-creds', 'tls-hostname', 'max-bandwidth',
> >             'downtime-limit', 'x-checkpoint-delay', 'block-incremental',
> >             'x-multifd-channels', 'x-multifd-page-count',
> > -           'xbzrle-cache-size', 'max-postcopy-bandwidth' ] }
> > +           'xbzrle-cache-size', 'max-postcopy-bandwidth',
> > +           'max-cpu-throttle' ] }
> >
> >  ##
> >  # @MigrateSetParameters:
> > @@ -603,6 +607,10 @@
> >  # @max-postcopy-bandwidth: Background transfer bandwidth during
> postcopy.
> >  #                     Defaults to 0 (unlimited).  In bytes per second.
> >  #                     (Since 3.0)
> > +#
> > +# @max-cpu-throttle: maximum cpu throttle percentage.
> > +#                    The default value is 99. (Since 3.1)
> > +#
> >  # Since: 2.4
> >  ##
> >  # TODO either fuse back into MigrationParameters, or make
> > @@ -622,7 +630,8 @@
> >              '*x-multifd-channels': 'int',
> >              '*x-multifd-page-count': 'int',
> >              '*xbzrle-cache-size': 'size',
> > -            '*max-postcopy-bandwidth': 'size' } }
> > +            '*max-postcopy-bandwidth': 'size',
> > +         '*max-cpu-throttle': 'int' } }
> >
> >  ##
> >  # @migrate-set-parameters:
> > @@ -709,6 +718,11 @@
> >  # @max-postcopy-bandwidth: Background transfer bandwidth during
> postcopy.
> >  #                     Defaults to 0 (unlimited).  In bytes per second.
> >  #                     (Since 3.0)
> > +#
> > +# @max-cpu-throttle: maximum cpu throttle percentage.
> > +#                    Defaults to 99.
> > +#                     (Since 3.1)
> > +#
> >  # Since: 2.4
> >  ##
> >  { 'struct': 'MigrationParameters',
> > @@ -726,7 +740,8 @@
> >              '*x-multifd-channels': 'uint8',
> >              '*x-multifd-page-count': 'uint32',
> >              '*xbzrle-cache-size': 'size',
> > -            '*max-postcopy-bandwidth': 'size'  } }
> > +         '*max-postcopy-bandwidth': 'size',
> > +            '*max-cpu-throttle':'uint8'} }
> >
> >  ##
> >  # @query-migrate-parameters:
> > --
> > 2.11.0
> >
> >
> --
> Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
>
Dr. David Alan Gilbert Aug. 3, 2018, 8:10 a.m. UTC | #3
* Li Qiang (liq3ea@gmail.com) wrote:
> 2018-08-02 18:47 GMT+08:00 Dr. David Alan Gilbert <dgilbert@redhat.com>:
> 
> > * Li Qiang (liq3ea@gmail.com) wrote:
> > > Currently, the default maximum CPU throttle for migration is
> > > 99(CPU_THROTTLE_PCT_MAX). This is too big and can make a remarkable
> > > performance effect for the guest. We see a lot of packets latency
> > > exceed 500ms when the CPU_THROTTLE_PCT_MAX reached. This patch set
> > > adds a new max-cpu-throttle parameter to limit the CPU throttle.
> >
> > I think this is OK, so
> >
> > Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> >
> > but I do have one comment below which made me think
> >
> > > Signed-off-by: Li Qiang <liq3ea@gmail.com>
> > > ---
> > >  hmp.c                 |  8 ++++++++
> > >  migration/migration.c | 23 ++++++++++++++++++++++-
> > >  migration/migration.h |  1 +
> > >  migration/ram.c       |  4 +++-
> > >  qapi/migration.json   | 21 ++++++++++++++++++---
> > >  5 files changed, 52 insertions(+), 5 deletions(-)
> > >
> > > diff --git a/hmp.c b/hmp.c
> > > index 2aafb50e8e..c38e8b1f78 100644
> > > --- a/hmp.c
> > > +++ b/hmp.c
> > > @@ -339,6 +339,10 @@ void hmp_info_migrate_parameters(Monitor *mon,
> > const QDict *qdict)
> > >          monitor_printf(mon, "%s: %u\n",
> > >              MigrationParameter_str(MIGRATION_PARAMETER_CPU_
> > THROTTLE_INCREMENT),
> > >              params->cpu_throttle_increment);
> > > +        assert(params->has_max_cpu_throttle);
> > > +        monitor_printf(mon, "%s: %u\n",
> > > +            MigrationParameter_str(MIGRATION_PARAMETER_MAX_CPU_
> > THROTTLE),
> > > +            params->max_cpu_throttle);
> > >          assert(params->has_tls_creds);
> > >          monitor_printf(mon, "%s: '%s'\n",
> > >              MigrationParameter_str(MIGRATION_PARAMETER_TLS_CREDS),
> > > @@ -1635,6 +1639,10 @@ void hmp_migrate_set_parameter(Monitor *mon,
> > const QDict *qdict)
> > >          p->has_cpu_throttle_increment = true;
> > >          visit_type_int(v, param, &p->cpu_throttle_increment, &err);
> > >          break;
> > > +    case MIGRATION_PARAMETER_MAX_CPU_THROTTLE:
> > > +        p->has_max_cpu_throttle = true;
> > > +        visit_type_int(v, param, &p->max_cpu_throttle, &err);
> > > +        break;
> > >      case MIGRATION_PARAMETER_TLS_CREDS:
> > >          p->has_tls_creds = true;
> > >          p->tls_creds = g_new0(StrOrNull, 1);
> > > diff --git a/migration/migration.c b/migration/migration.c
> > > index b7d9854bda..570da6c0e7 100644
> > > --- a/migration/migration.c
> > > +++ b/migration/migration.c
> > > @@ -71,6 +71,7 @@
> > >  /* Define default autoconverge cpu throttle migration parameters */
> > >  #define DEFAULT_MIGRATE_CPU_THROTTLE_INITIAL 20
> > >  #define DEFAULT_MIGRATE_CPU_THROTTLE_INCREMENT 10
> > > +#define DEFAULT_MIGRATE_MAX_CPU_THROTTLE 99
> > >
> > >  /* Migration XBZRLE default cache size */
> > >  #define DEFAULT_MIGRATE_XBZRLE_CACHE_SIZE (64 * 1024 * 1024)
> > > @@ -697,6 +698,8 @@ MigrationParameters *qmp_query_migrate_parameters(Error
> > **errp)
> > >      params->xbzrle_cache_size = s->parameters.xbzrle_cache_size;
> > >      params->has_max_postcopy_bandwidth = true;
> > >      params->max_postcopy_bandwidth = s->parameters.max_postcopy_
> > bandwidth;
> > > +    params->has_max_cpu_throttle = true;
> > > +    params->max_cpu_throttle = s->parameters.max_cpu_throttle;
> > >
> > >      return params;
> > >  }
> > > @@ -1043,6 +1046,15 @@ static bool migrate_params_check(MigrationParameters
> > *params, Error **errp)
> > >          return false;
> > >      }
> > >
> > > +    if (params->has_max_cpu_throttle &&
> > > +        (params->max_cpu_throttle < params->cpu_throttle_initial ||
> > > +         params->max_cpu_throttle > 99)) {
> > > +        error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
> > > +                   "max_cpu_throttle",
> > > +                   "an integer in the range of cpu_throttle_initial to
> > 99");
> > > +        return false;
> > > +    }
> > > +
> > >      return true;
> > >  }
> > >
> > > @@ -1110,6 +1122,9 @@ static void migrate_params_test_apply(MigrateSetParameters
> > *params,
> > >      if (params->has_max_postcopy_bandwidth) {
> > >          dest->max_postcopy_bandwidth = params->max_postcopy_bandwidth;
> > >      }
> > > +    if (params->has_max_cpu_throttle) {
> > > +        dest->max_cpu_throttle = params->max_cpu_throttle;
> > > +    }
> > >  }
> > >
> > >  static void migrate_params_apply(MigrateSetParameters *params, Error
> > **errp)
> > > @@ -1185,6 +1200,9 @@ static void migrate_params_apply(MigrateSetParameters
> > *params, Error **errp)
> > >      if (params->has_max_postcopy_bandwidth) {
> > >          s->parameters.max_postcopy_bandwidth = params->max_postcopy_
> > bandwidth;
> > >      }
> > > +    if (params->has_max_cpu_throttle) {
> > > +        s->parameters.max_cpu_throttle = params->max_cpu_throttle;
> > > +    }
> > >  }
> > >
> > >  void qmp_migrate_set_parameters(MigrateSetParameters *params, Error
> > **errp)
> > > @@ -1962,7 +1980,6 @@ static int64_t migrate_max_postcopy_
> > bandwidth(void)
> > >      return s->parameters.max_postcopy_bandwidth;
> > >  }
> > >
> > > -
> > >  bool migrate_use_block(void)
> > >  {
> > >      MigrationState *s;
> > > @@ -3160,6 +3177,9 @@ static Property migration_properties[] = {
> > >      DEFINE_PROP_SIZE("max-postcopy-bandwidth", MigrationState,
> > >                        parameters.max_postcopy_bandwidth,
> > >                        DEFAULT_MIGRATE_MAX_POSTCOPY_BANDWIDTH),
> > > +    DEFINE_PROP_UINT8("max-cpu-throttle", MigrationState,
> > > +                      parameters.max_cpu_throttle,
> > > +                      DEFAULT_MIGRATE_MAX_CPU_THROTTLE),
> > >
> > >      /* Migration capabilities */
> > >      DEFINE_PROP_MIG_CAP("x-xbzrle", MIGRATION_CAPABILITY_XBZRLE),
> > > @@ -3230,6 +3250,7 @@ static void migration_instance_init(Object *obj)
> > >      params->has_x_multifd_page_count = true;
> > >      params->has_xbzrle_cache_size = true;
> > >      params->has_max_postcopy_bandwidth = true;
> > > +    params->has_max_cpu_throttle = true;
> > >
> > >      qemu_sem_init(&ms->postcopy_pause_sem, 0);
> > >      qemu_sem_init(&ms->postcopy_pause_rp_sem, 0);
> > > diff --git a/migration/migration.h b/migration/migration.h
> > > index 64a7b33735..eb0c04a7b4 100644
> > > --- a/migration/migration.h
> > > +++ b/migration/migration.h
> > > @@ -266,6 +266,7 @@ bool migrate_colo_enabled(void);
> > >
> > >  bool migrate_use_block(void);
> > >  bool migrate_use_block_incremental(void);
> > > +int migrate_max_cpu_throttle(void);
> > >  bool migrate_use_return_path(void);
> > >
> > >  bool migrate_use_compression(void);
> > > diff --git a/migration/ram.c b/migration/ram.c
> > > index 24dea2730c..cdd4349177 100644
> > > --- a/migration/ram.c
> > > +++ b/migration/ram.c
> > > @@ -1390,13 +1390,15 @@ static void mig_throttle_guest_down(void)
> > >      MigrationState *s = migrate_get_current();
> > >      uint64_t pct_initial = s->parameters.cpu_throttle_initial;
> > >      uint64_t pct_icrement = s->parameters.cpu_throttle_increment;
> > > +    int pct_max = s->parameters.max_cpu_throttle;
> > >
> > >      /* We have not started throttling yet. Let's start it. */
> > >      if (!cpu_throttle_active()) {
> > >          cpu_throttle_set(pct_initial);
> > >      } else {
> > >          /* Throttling already on, just increase the rate */
> > > -        cpu_throttle_set(cpu_throttle_get_percentage() + pct_icrement);
> > > +        cpu_throttle_set(MIN(cpu_throttle_get_percentage() +
> > pct_icrement,
> > > +                         pct_max));
> >
> > I wondered whether we should just make this change inside
> > cpu_throttle_set and remove the CPU_THROTTLE_PCT_MAX define; but in the
> > end I decided you're code is probably better, because the
> > cpu_throttle_set code is generic, where as this limitation is specific
> > to why we're throttling it for migration.
> >
> >
> Exactly.
> I also have a more think here. I made the change in ' cpu_throttle_set ' in
> the qmp version.
> But here I choice this as it is more clear. Also I noticed the '
> cpu_throttle_set' is not used only
> in 'mig_throttle_guest_down' but also in ui/cocoa.m file(Though I'm not
> sure what this is for.

Oh hadn't spotted that; it's one of the GUI frontends (for MacOS) and it
looks like it just has an option to let you slow the guest down.

Dave

> Thanks,
> Li Qiang
> 
> 
> > Dave
> >
> > >      }
> > >  }
> > >
> > > diff --git a/qapi/migration.json b/qapi/migration.json
> > > index 186e8a7303..865064e18c 100644
> > > --- a/qapi/migration.json
> > > +++ b/qapi/migration.json
> > > @@ -523,6 +523,9 @@
> > >  # @max-postcopy-bandwidth: Background transfer bandwidth during
> > postcopy.
> > >  #                     Defaults to 0 (unlimited).  In bytes per second.
> > >  #                     (Since 3.0)
> > > +#
> > > +# @max-cpu-throttle: maximum cpu throttle percentage.
> > > +#                    Defaults to 99. (Since 3.1)
> > >  # Since: 2.4
> > >  ##
> > >  { 'enum': 'MigrationParameter',
> > > @@ -531,7 +534,8 @@
> > >             'tls-creds', 'tls-hostname', 'max-bandwidth',
> > >             'downtime-limit', 'x-checkpoint-delay', 'block-incremental',
> > >             'x-multifd-channels', 'x-multifd-page-count',
> > > -           'xbzrle-cache-size', 'max-postcopy-bandwidth' ] }
> > > +           'xbzrle-cache-size', 'max-postcopy-bandwidth',
> > > +           'max-cpu-throttle' ] }
> > >
> > >  ##
> > >  # @MigrateSetParameters:
> > > @@ -603,6 +607,10 @@
> > >  # @max-postcopy-bandwidth: Background transfer bandwidth during
> > postcopy.
> > >  #                     Defaults to 0 (unlimited).  In bytes per second.
> > >  #                     (Since 3.0)
> > > +#
> > > +# @max-cpu-throttle: maximum cpu throttle percentage.
> > > +#                    The default value is 99. (Since 3.1)
> > > +#
> > >  # Since: 2.4
> > >  ##
> > >  # TODO either fuse back into MigrationParameters, or make
> > > @@ -622,7 +630,8 @@
> > >              '*x-multifd-channels': 'int',
> > >              '*x-multifd-page-count': 'int',
> > >              '*xbzrle-cache-size': 'size',
> > > -            '*max-postcopy-bandwidth': 'size' } }
> > > +            '*max-postcopy-bandwidth': 'size',
> > > +         '*max-cpu-throttle': 'int' } }
> > >
> > >  ##
> > >  # @migrate-set-parameters:
> > > @@ -709,6 +718,11 @@
> > >  # @max-postcopy-bandwidth: Background transfer bandwidth during
> > postcopy.
> > >  #                     Defaults to 0 (unlimited).  In bytes per second.
> > >  #                     (Since 3.0)
> > > +#
> > > +# @max-cpu-throttle: maximum cpu throttle percentage.
> > > +#                    Defaults to 99.
> > > +#                     (Since 3.1)
> > > +#
> > >  # Since: 2.4
> > >  ##
> > >  { 'struct': 'MigrationParameters',
> > > @@ -726,7 +740,8 @@
> > >              '*x-multifd-channels': 'uint8',
> > >              '*x-multifd-page-count': 'uint32',
> > >              '*xbzrle-cache-size': 'size',
> > > -            '*max-postcopy-bandwidth': 'size'  } }
> > > +         '*max-postcopy-bandwidth': 'size',
> > > +            '*max-cpu-throttle':'uint8'} }
> > >
> > >  ##
> > >  # @query-migrate-parameters:
> > > --
> > > 2.11.0
> > >
> > >
> > --
> > Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
> >
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
Li Qiang Aug. 7, 2018, 6:07 a.m. UTC | #4
Hello Dave,

What's status of this patch, Do you gonna merge it?

Thanks,
Li Qiang


2018-08-02 18:47 GMT+08:00 Dr. David Alan Gilbert <dgilbert@redhat.com>:

> * Li Qiang (liq3ea@gmail.com) wrote:
> > Currently, the default maximum CPU throttle for migration is
> > 99(CPU_THROTTLE_PCT_MAX). This is too big and can make a remarkable
> > performance effect for the guest. We see a lot of packets latency
> > exceed 500ms when the CPU_THROTTLE_PCT_MAX reached. This patch set
> > adds a new max-cpu-throttle parameter to limit the CPU throttle.
>
> I think this is OK, so
>
> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
>
> but I do have one comment below which made me think
>
> > Signed-off-by: Li Qiang <liq3ea@gmail.com>
> > ---
> >  hmp.c                 |  8 ++++++++
> >  migration/migration.c | 23 ++++++++++++++++++++++-
> >  migration/migration.h |  1 +
> >  migration/ram.c       |  4 +++-
> >  qapi/migration.json   | 21 ++++++++++++++++++---
> >  5 files changed, 52 insertions(+), 5 deletions(-)
> >
> > diff --git a/hmp.c b/hmp.c
> > index 2aafb50e8e..c38e8b1f78 100644
> > --- a/hmp.c
> > +++ b/hmp.c
> > @@ -339,6 +339,10 @@ void hmp_info_migrate_parameters(Monitor *mon,
> const QDict *qdict)
> >          monitor_printf(mon, "%s: %u\n",
> >              MigrationParameter_str(MIGRATION_PARAMETER_CPU_
> THROTTLE_INCREMENT),
> >              params->cpu_throttle_increment);
> > +        assert(params->has_max_cpu_throttle);
> > +        monitor_printf(mon, "%s: %u\n",
> > +            MigrationParameter_str(MIGRATION_PARAMETER_MAX_CPU_
> THROTTLE),
> > +            params->max_cpu_throttle);
> >          assert(params->has_tls_creds);
> >          monitor_printf(mon, "%s: '%s'\n",
> >              MigrationParameter_str(MIGRATION_PARAMETER_TLS_CREDS),
> > @@ -1635,6 +1639,10 @@ void hmp_migrate_set_parameter(Monitor *mon,
> const QDict *qdict)
> >          p->has_cpu_throttle_increment = true;
> >          visit_type_int(v, param, &p->cpu_throttle_increment, &err);
> >          break;
> > +    case MIGRATION_PARAMETER_MAX_CPU_THROTTLE:
> > +        p->has_max_cpu_throttle = true;
> > +        visit_type_int(v, param, &p->max_cpu_throttle, &err);
> > +        break;
> >      case MIGRATION_PARAMETER_TLS_CREDS:
> >          p->has_tls_creds = true;
> >          p->tls_creds = g_new0(StrOrNull, 1);
> > diff --git a/migration/migration.c b/migration/migration.c
> > index b7d9854bda..570da6c0e7 100644
> > --- a/migration/migration.c
> > +++ b/migration/migration.c
> > @@ -71,6 +71,7 @@
> >  /* Define default autoconverge cpu throttle migration parameters */
> >  #define DEFAULT_MIGRATE_CPU_THROTTLE_INITIAL 20
> >  #define DEFAULT_MIGRATE_CPU_THROTTLE_INCREMENT 10
> > +#define DEFAULT_MIGRATE_MAX_CPU_THROTTLE 99
> >
> >  /* Migration XBZRLE default cache size */
> >  #define DEFAULT_MIGRATE_XBZRLE_CACHE_SIZE (64 * 1024 * 1024)
> > @@ -697,6 +698,8 @@ MigrationParameters *qmp_query_migrate_parameters(Error
> **errp)
> >      params->xbzrle_cache_size = s->parameters.xbzrle_cache_size;
> >      params->has_max_postcopy_bandwidth = true;
> >      params->max_postcopy_bandwidth = s->parameters.max_postcopy_
> bandwidth;
> > +    params->has_max_cpu_throttle = true;
> > +    params->max_cpu_throttle = s->parameters.max_cpu_throttle;
> >
> >      return params;
> >  }
> > @@ -1043,6 +1046,15 @@ static bool migrate_params_check(MigrationParameters
> *params, Error **errp)
> >          return false;
> >      }
> >
> > +    if (params->has_max_cpu_throttle &&
> > +        (params->max_cpu_throttle < params->cpu_throttle_initial ||
> > +         params->max_cpu_throttle > 99)) {
> > +        error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
> > +                   "max_cpu_throttle",
> > +                   "an integer in the range of cpu_throttle_initial to
> 99");
> > +        return false;
> > +    }
> > +
> >      return true;
> >  }
> >
> > @@ -1110,6 +1122,9 @@ static void migrate_params_test_apply(MigrateSetParameters
> *params,
> >      if (params->has_max_postcopy_bandwidth) {
> >          dest->max_postcopy_bandwidth = params->max_postcopy_bandwidth;
> >      }
> > +    if (params->has_max_cpu_throttle) {
> > +        dest->max_cpu_throttle = params->max_cpu_throttle;
> > +    }
> >  }
> >
> >  static void migrate_params_apply(MigrateSetParameters *params, Error
> **errp)
> > @@ -1185,6 +1200,9 @@ static void migrate_params_apply(MigrateSetParameters
> *params, Error **errp)
> >      if (params->has_max_postcopy_bandwidth) {
> >          s->parameters.max_postcopy_bandwidth = params->max_postcopy_
> bandwidth;
> >      }
> > +    if (params->has_max_cpu_throttle) {
> > +        s->parameters.max_cpu_throttle = params->max_cpu_throttle;
> > +    }
> >  }
> >
> >  void qmp_migrate_set_parameters(MigrateSetParameters *params, Error
> **errp)
> > @@ -1962,7 +1980,6 @@ static int64_t migrate_max_postcopy_
> bandwidth(void)
> >      return s->parameters.max_postcopy_bandwidth;
> >  }
> >
> > -
> >  bool migrate_use_block(void)
> >  {
> >      MigrationState *s;
> > @@ -3160,6 +3177,9 @@ static Property migration_properties[] = {
> >      DEFINE_PROP_SIZE("max-postcopy-bandwidth", MigrationState,
> >                        parameters.max_postcopy_bandwidth,
> >                        DEFAULT_MIGRATE_MAX_POSTCOPY_BANDWIDTH),
> > +    DEFINE_PROP_UINT8("max-cpu-throttle", MigrationState,
> > +                      parameters.max_cpu_throttle,
> > +                      DEFAULT_MIGRATE_MAX_CPU_THROTTLE),
> >
> >      /* Migration capabilities */
> >      DEFINE_PROP_MIG_CAP("x-xbzrle", MIGRATION_CAPABILITY_XBZRLE),
> > @@ -3230,6 +3250,7 @@ static void migration_instance_init(Object *obj)
> >      params->has_x_multifd_page_count = true;
> >      params->has_xbzrle_cache_size = true;
> >      params->has_max_postcopy_bandwidth = true;
> > +    params->has_max_cpu_throttle = true;
> >
> >      qemu_sem_init(&ms->postcopy_pause_sem, 0);
> >      qemu_sem_init(&ms->postcopy_pause_rp_sem, 0);
> > diff --git a/migration/migration.h b/migration/migration.h
> > index 64a7b33735..eb0c04a7b4 100644
> > --- a/migration/migration.h
> > +++ b/migration/migration.h
> > @@ -266,6 +266,7 @@ bool migrate_colo_enabled(void);
> >
> >  bool migrate_use_block(void);
> >  bool migrate_use_block_incremental(void);
> > +int migrate_max_cpu_throttle(void);
> >  bool migrate_use_return_path(void);
> >
> >  bool migrate_use_compression(void);
> > diff --git a/migration/ram.c b/migration/ram.c
> > index 24dea2730c..cdd4349177 100644
> > --- a/migration/ram.c
> > +++ b/migration/ram.c
> > @@ -1390,13 +1390,15 @@ static void mig_throttle_guest_down(void)
> >      MigrationState *s = migrate_get_current();
> >      uint64_t pct_initial = s->parameters.cpu_throttle_initial;
> >      uint64_t pct_icrement = s->parameters.cpu_throttle_increment;
> > +    int pct_max = s->parameters.max_cpu_throttle;
> >
> >      /* We have not started throttling yet. Let's start it. */
> >      if (!cpu_throttle_active()) {
> >          cpu_throttle_set(pct_initial);
> >      } else {
> >          /* Throttling already on, just increase the rate */
> > -        cpu_throttle_set(cpu_throttle_get_percentage() + pct_icrement);
> > +        cpu_throttle_set(MIN(cpu_throttle_get_percentage() +
> pct_icrement,
> > +                         pct_max));
>
> I wondered whether we should just make this change inside
> cpu_throttle_set and remove the CPU_THROTTLE_PCT_MAX define; but in the
> end I decided you're code is probably better, because the
> cpu_throttle_set code is generic, where as this limitation is specific
> to why we're throttling it for migration.
>
> Dave
>
> >      }
> >  }
> >
> > diff --git a/qapi/migration.json b/qapi/migration.json
> > index 186e8a7303..865064e18c 100644
> > --- a/qapi/migration.json
> > +++ b/qapi/migration.json
> > @@ -523,6 +523,9 @@
> >  # @max-postcopy-bandwidth: Background transfer bandwidth during
> postcopy.
> >  #                     Defaults to 0 (unlimited).  In bytes per second.
> >  #                     (Since 3.0)
> > +#
> > +# @max-cpu-throttle: maximum cpu throttle percentage.
> > +#                    Defaults to 99. (Since 3.1)
> >  # Since: 2.4
> >  ##
> >  { 'enum': 'MigrationParameter',
> > @@ -531,7 +534,8 @@
> >             'tls-creds', 'tls-hostname', 'max-bandwidth',
> >             'downtime-limit', 'x-checkpoint-delay', 'block-incremental',
> >             'x-multifd-channels', 'x-multifd-page-count',
> > -           'xbzrle-cache-size', 'max-postcopy-bandwidth' ] }
> > +           'xbzrle-cache-size', 'max-postcopy-bandwidth',
> > +           'max-cpu-throttle' ] }
> >
> >  ##
> >  # @MigrateSetParameters:
> > @@ -603,6 +607,10 @@
> >  # @max-postcopy-bandwidth: Background transfer bandwidth during
> postcopy.
> >  #                     Defaults to 0 (unlimited).  In bytes per second.
> >  #                     (Since 3.0)
> > +#
> > +# @max-cpu-throttle: maximum cpu throttle percentage.
> > +#                    The default value is 99. (Since 3.1)
> > +#
> >  # Since: 2.4
> >  ##
> >  # TODO either fuse back into MigrationParameters, or make
> > @@ -622,7 +630,8 @@
> >              '*x-multifd-channels': 'int',
> >              '*x-multifd-page-count': 'int',
> >              '*xbzrle-cache-size': 'size',
> > -            '*max-postcopy-bandwidth': 'size' } }
> > +            '*max-postcopy-bandwidth': 'size',
> > +         '*max-cpu-throttle': 'int' } }
> >
> >  ##
> >  # @migrate-set-parameters:
> > @@ -709,6 +718,11 @@
> >  # @max-postcopy-bandwidth: Background transfer bandwidth during
> postcopy.
> >  #                     Defaults to 0 (unlimited).  In bytes per second.
> >  #                     (Since 3.0)
> > +#
> > +# @max-cpu-throttle: maximum cpu throttle percentage.
> > +#                    Defaults to 99.
> > +#                     (Since 3.1)
> > +#
> >  # Since: 2.4
> >  ##
> >  { 'struct': 'MigrationParameters',
> > @@ -726,7 +740,8 @@
> >              '*x-multifd-channels': 'uint8',
> >              '*x-multifd-page-count': 'uint32',
> >              '*xbzrle-cache-size': 'size',
> > -            '*max-postcopy-bandwidth': 'size'  } }
> > +         '*max-postcopy-bandwidth': 'size',
> > +            '*max-cpu-throttle':'uint8'} }
> >
> >  ##
> >  # @query-migrate-parameters:
> > --
> > 2.11.0
> >
> >
> --
> Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
>
Dr. David Alan Gilbert Aug. 7, 2018, 8:03 a.m. UTC | #5
* Li Qiang (liq3ea@gmail.com) wrote:
>  Hello Dave,
> 
> What's status of this patch, Do you gonna merge it?

Yes, once 3.1 opens.

Dave

> Thanks,
> Li Qiang
> 
> 
> 2018-08-02 18:47 GMT+08:00 Dr. David Alan Gilbert <dgilbert@redhat.com>:
> 
> > * Li Qiang (liq3ea@gmail.com) wrote:
> > > Currently, the default maximum CPU throttle for migration is
> > > 99(CPU_THROTTLE_PCT_MAX). This is too big and can make a remarkable
> > > performance effect for the guest. We see a lot of packets latency
> > > exceed 500ms when the CPU_THROTTLE_PCT_MAX reached. This patch set
> > > adds a new max-cpu-throttle parameter to limit the CPU throttle.
> >
> > I think this is OK, so
> >
> > Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> >
> > but I do have one comment below which made me think
> >
> > > Signed-off-by: Li Qiang <liq3ea@gmail.com>
> > > ---
> > >  hmp.c                 |  8 ++++++++
> > >  migration/migration.c | 23 ++++++++++++++++++++++-
> > >  migration/migration.h |  1 +
> > >  migration/ram.c       |  4 +++-
> > >  qapi/migration.json   | 21 ++++++++++++++++++---
> > >  5 files changed, 52 insertions(+), 5 deletions(-)
> > >
> > > diff --git a/hmp.c b/hmp.c
> > > index 2aafb50e8e..c38e8b1f78 100644
> > > --- a/hmp.c
> > > +++ b/hmp.c
> > > @@ -339,6 +339,10 @@ void hmp_info_migrate_parameters(Monitor *mon,
> > const QDict *qdict)
> > >          monitor_printf(mon, "%s: %u\n",
> > >              MigrationParameter_str(MIGRATION_PARAMETER_CPU_
> > THROTTLE_INCREMENT),
> > >              params->cpu_throttle_increment);
> > > +        assert(params->has_max_cpu_throttle);
> > > +        monitor_printf(mon, "%s: %u\n",
> > > +            MigrationParameter_str(MIGRATION_PARAMETER_MAX_CPU_
> > THROTTLE),
> > > +            params->max_cpu_throttle);
> > >          assert(params->has_tls_creds);
> > >          monitor_printf(mon, "%s: '%s'\n",
> > >              MigrationParameter_str(MIGRATION_PARAMETER_TLS_CREDS),
> > > @@ -1635,6 +1639,10 @@ void hmp_migrate_set_parameter(Monitor *mon,
> > const QDict *qdict)
> > >          p->has_cpu_throttle_increment = true;
> > >          visit_type_int(v, param, &p->cpu_throttle_increment, &err);
> > >          break;
> > > +    case MIGRATION_PARAMETER_MAX_CPU_THROTTLE:
> > > +        p->has_max_cpu_throttle = true;
> > > +        visit_type_int(v, param, &p->max_cpu_throttle, &err);
> > > +        break;
> > >      case MIGRATION_PARAMETER_TLS_CREDS:
> > >          p->has_tls_creds = true;
> > >          p->tls_creds = g_new0(StrOrNull, 1);
> > > diff --git a/migration/migration.c b/migration/migration.c
> > > index b7d9854bda..570da6c0e7 100644
> > > --- a/migration/migration.c
> > > +++ b/migration/migration.c
> > > @@ -71,6 +71,7 @@
> > >  /* Define default autoconverge cpu throttle migration parameters */
> > >  #define DEFAULT_MIGRATE_CPU_THROTTLE_INITIAL 20
> > >  #define DEFAULT_MIGRATE_CPU_THROTTLE_INCREMENT 10
> > > +#define DEFAULT_MIGRATE_MAX_CPU_THROTTLE 99
> > >
> > >  /* Migration XBZRLE default cache size */
> > >  #define DEFAULT_MIGRATE_XBZRLE_CACHE_SIZE (64 * 1024 * 1024)
> > > @@ -697,6 +698,8 @@ MigrationParameters *qmp_query_migrate_parameters(Error
> > **errp)
> > >      params->xbzrle_cache_size = s->parameters.xbzrle_cache_size;
> > >      params->has_max_postcopy_bandwidth = true;
> > >      params->max_postcopy_bandwidth = s->parameters.max_postcopy_
> > bandwidth;
> > > +    params->has_max_cpu_throttle = true;
> > > +    params->max_cpu_throttle = s->parameters.max_cpu_throttle;
> > >
> > >      return params;
> > >  }
> > > @@ -1043,6 +1046,15 @@ static bool migrate_params_check(MigrationParameters
> > *params, Error **errp)
> > >          return false;
> > >      }
> > >
> > > +    if (params->has_max_cpu_throttle &&
> > > +        (params->max_cpu_throttle < params->cpu_throttle_initial ||
> > > +         params->max_cpu_throttle > 99)) {
> > > +        error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
> > > +                   "max_cpu_throttle",
> > > +                   "an integer in the range of cpu_throttle_initial to
> > 99");
> > > +        return false;
> > > +    }
> > > +
> > >      return true;
> > >  }
> > >
> > > @@ -1110,6 +1122,9 @@ static void migrate_params_test_apply(MigrateSetParameters
> > *params,
> > >      if (params->has_max_postcopy_bandwidth) {
> > >          dest->max_postcopy_bandwidth = params->max_postcopy_bandwidth;
> > >      }
> > > +    if (params->has_max_cpu_throttle) {
> > > +        dest->max_cpu_throttle = params->max_cpu_throttle;
> > > +    }
> > >  }
> > >
> > >  static void migrate_params_apply(MigrateSetParameters *params, Error
> > **errp)
> > > @@ -1185,6 +1200,9 @@ static void migrate_params_apply(MigrateSetParameters
> > *params, Error **errp)
> > >      if (params->has_max_postcopy_bandwidth) {
> > >          s->parameters.max_postcopy_bandwidth = params->max_postcopy_
> > bandwidth;
> > >      }
> > > +    if (params->has_max_cpu_throttle) {
> > > +        s->parameters.max_cpu_throttle = params->max_cpu_throttle;
> > > +    }
> > >  }
> > >
> > >  void qmp_migrate_set_parameters(MigrateSetParameters *params, Error
> > **errp)
> > > @@ -1962,7 +1980,6 @@ static int64_t migrate_max_postcopy_
> > bandwidth(void)
> > >      return s->parameters.max_postcopy_bandwidth;
> > >  }
> > >
> > > -
> > >  bool migrate_use_block(void)
> > >  {
> > >      MigrationState *s;
> > > @@ -3160,6 +3177,9 @@ static Property migration_properties[] = {
> > >      DEFINE_PROP_SIZE("max-postcopy-bandwidth", MigrationState,
> > >                        parameters.max_postcopy_bandwidth,
> > >                        DEFAULT_MIGRATE_MAX_POSTCOPY_BANDWIDTH),
> > > +    DEFINE_PROP_UINT8("max-cpu-throttle", MigrationState,
> > > +                      parameters.max_cpu_throttle,
> > > +                      DEFAULT_MIGRATE_MAX_CPU_THROTTLE),
> > >
> > >      /* Migration capabilities */
> > >      DEFINE_PROP_MIG_CAP("x-xbzrle", MIGRATION_CAPABILITY_XBZRLE),
> > > @@ -3230,6 +3250,7 @@ static void migration_instance_init(Object *obj)
> > >      params->has_x_multifd_page_count = true;
> > >      params->has_xbzrle_cache_size = true;
> > >      params->has_max_postcopy_bandwidth = true;
> > > +    params->has_max_cpu_throttle = true;
> > >
> > >      qemu_sem_init(&ms->postcopy_pause_sem, 0);
> > >      qemu_sem_init(&ms->postcopy_pause_rp_sem, 0);
> > > diff --git a/migration/migration.h b/migration/migration.h
> > > index 64a7b33735..eb0c04a7b4 100644
> > > --- a/migration/migration.h
> > > +++ b/migration/migration.h
> > > @@ -266,6 +266,7 @@ bool migrate_colo_enabled(void);
> > >
> > >  bool migrate_use_block(void);
> > >  bool migrate_use_block_incremental(void);
> > > +int migrate_max_cpu_throttle(void);
> > >  bool migrate_use_return_path(void);
> > >
> > >  bool migrate_use_compression(void);
> > > diff --git a/migration/ram.c b/migration/ram.c
> > > index 24dea2730c..cdd4349177 100644
> > > --- a/migration/ram.c
> > > +++ b/migration/ram.c
> > > @@ -1390,13 +1390,15 @@ static void mig_throttle_guest_down(void)
> > >      MigrationState *s = migrate_get_current();
> > >      uint64_t pct_initial = s->parameters.cpu_throttle_initial;
> > >      uint64_t pct_icrement = s->parameters.cpu_throttle_increment;
> > > +    int pct_max = s->parameters.max_cpu_throttle;
> > >
> > >      /* We have not started throttling yet. Let's start it. */
> > >      if (!cpu_throttle_active()) {
> > >          cpu_throttle_set(pct_initial);
> > >      } else {
> > >          /* Throttling already on, just increase the rate */
> > > -        cpu_throttle_set(cpu_throttle_get_percentage() + pct_icrement);
> > > +        cpu_throttle_set(MIN(cpu_throttle_get_percentage() +
> > pct_icrement,
> > > +                         pct_max));
> >
> > I wondered whether we should just make this change inside
> > cpu_throttle_set and remove the CPU_THROTTLE_PCT_MAX define; but in the
> > end I decided you're code is probably better, because the
> > cpu_throttle_set code is generic, where as this limitation is specific
> > to why we're throttling it for migration.
> >
> > Dave
> >
> > >      }
> > >  }
> > >
> > > diff --git a/qapi/migration.json b/qapi/migration.json
> > > index 186e8a7303..865064e18c 100644
> > > --- a/qapi/migration.json
> > > +++ b/qapi/migration.json
> > > @@ -523,6 +523,9 @@
> > >  # @max-postcopy-bandwidth: Background transfer bandwidth during
> > postcopy.
> > >  #                     Defaults to 0 (unlimited).  In bytes per second.
> > >  #                     (Since 3.0)
> > > +#
> > > +# @max-cpu-throttle: maximum cpu throttle percentage.
> > > +#                    Defaults to 99. (Since 3.1)
> > >  # Since: 2.4
> > >  ##
> > >  { 'enum': 'MigrationParameter',
> > > @@ -531,7 +534,8 @@
> > >             'tls-creds', 'tls-hostname', 'max-bandwidth',
> > >             'downtime-limit', 'x-checkpoint-delay', 'block-incremental',
> > >             'x-multifd-channels', 'x-multifd-page-count',
> > > -           'xbzrle-cache-size', 'max-postcopy-bandwidth' ] }
> > > +           'xbzrle-cache-size', 'max-postcopy-bandwidth',
> > > +           'max-cpu-throttle' ] }
> > >
> > >  ##
> > >  # @MigrateSetParameters:
> > > @@ -603,6 +607,10 @@
> > >  # @max-postcopy-bandwidth: Background transfer bandwidth during
> > postcopy.
> > >  #                     Defaults to 0 (unlimited).  In bytes per second.
> > >  #                     (Since 3.0)
> > > +#
> > > +# @max-cpu-throttle: maximum cpu throttle percentage.
> > > +#                    The default value is 99. (Since 3.1)
> > > +#
> > >  # Since: 2.4
> > >  ##
> > >  # TODO either fuse back into MigrationParameters, or make
> > > @@ -622,7 +630,8 @@
> > >              '*x-multifd-channels': 'int',
> > >              '*x-multifd-page-count': 'int',
> > >              '*xbzrle-cache-size': 'size',
> > > -            '*max-postcopy-bandwidth': 'size' } }
> > > +            '*max-postcopy-bandwidth': 'size',
> > > +         '*max-cpu-throttle': 'int' } }
> > >
> > >  ##
> > >  # @migrate-set-parameters:
> > > @@ -709,6 +718,11 @@
> > >  # @max-postcopy-bandwidth: Background transfer bandwidth during
> > postcopy.
> > >  #                     Defaults to 0 (unlimited).  In bytes per second.
> > >  #                     (Since 3.0)
> > > +#
> > > +# @max-cpu-throttle: maximum cpu throttle percentage.
> > > +#                    Defaults to 99.
> > > +#                     (Since 3.1)
> > > +#
> > >  # Since: 2.4
> > >  ##
> > >  { 'struct': 'MigrationParameters',
> > > @@ -726,7 +740,8 @@
> > >              '*x-multifd-channels': 'uint8',
> > >              '*x-multifd-page-count': 'uint32',
> > >              '*xbzrle-cache-size': 'size',
> > > -            '*max-postcopy-bandwidth': 'size'  } }
> > > +         '*max-postcopy-bandwidth': 'size',
> > > +            '*max-cpu-throttle':'uint8'} }
> > >
> > >  ##
> > >  # @query-migrate-parameters:
> > > --
> > > 2.11.0
> > >
> > >
> > --
> > Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
> >
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
Juan Quintela Aug. 22, 2018, 9:41 a.m. UTC | #6
Li Qiang <liq3ea@gmail.com> wrote:
> Currently, the default maximum CPU throttle for migration is
> 99(CPU_THROTTLE_PCT_MAX). This is too big and can make a remarkable
> performance effect for the guest. We see a lot of packets latency
> exceed 500ms when the CPU_THROTTLE_PCT_MAX reached. This patch set
> adds a new max-cpu-throttle parameter to limit the CPU throttle.
>
> Signed-off-by: Li Qiang <liq3ea@gmail.com>

Reviewed-by: Juan Quintela <quintela@redhat.com>
diff mbox series

Patch

diff --git a/hmp.c b/hmp.c
index 2aafb50e8e..c38e8b1f78 100644
--- a/hmp.c
+++ b/hmp.c
@@ -339,6 +339,10 @@  void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)
         monitor_printf(mon, "%s: %u\n",
             MigrationParameter_str(MIGRATION_PARAMETER_CPU_THROTTLE_INCREMENT),
             params->cpu_throttle_increment);
+        assert(params->has_max_cpu_throttle);
+        monitor_printf(mon, "%s: %u\n",
+            MigrationParameter_str(MIGRATION_PARAMETER_MAX_CPU_THROTTLE),
+            params->max_cpu_throttle);
         assert(params->has_tls_creds);
         monitor_printf(mon, "%s: '%s'\n",
             MigrationParameter_str(MIGRATION_PARAMETER_TLS_CREDS),
@@ -1635,6 +1639,10 @@  void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
         p->has_cpu_throttle_increment = true;
         visit_type_int(v, param, &p->cpu_throttle_increment, &err);
         break;
+    case MIGRATION_PARAMETER_MAX_CPU_THROTTLE:
+        p->has_max_cpu_throttle = true;
+        visit_type_int(v, param, &p->max_cpu_throttle, &err);
+        break;
     case MIGRATION_PARAMETER_TLS_CREDS:
         p->has_tls_creds = true;
         p->tls_creds = g_new0(StrOrNull, 1);
diff --git a/migration/migration.c b/migration/migration.c
index b7d9854bda..570da6c0e7 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -71,6 +71,7 @@ 
 /* Define default autoconverge cpu throttle migration parameters */
 #define DEFAULT_MIGRATE_CPU_THROTTLE_INITIAL 20
 #define DEFAULT_MIGRATE_CPU_THROTTLE_INCREMENT 10
+#define DEFAULT_MIGRATE_MAX_CPU_THROTTLE 99
 
 /* Migration XBZRLE default cache size */
 #define DEFAULT_MIGRATE_XBZRLE_CACHE_SIZE (64 * 1024 * 1024)
@@ -697,6 +698,8 @@  MigrationParameters *qmp_query_migrate_parameters(Error **errp)
     params->xbzrle_cache_size = s->parameters.xbzrle_cache_size;
     params->has_max_postcopy_bandwidth = true;
     params->max_postcopy_bandwidth = s->parameters.max_postcopy_bandwidth;
+    params->has_max_cpu_throttle = true;
+    params->max_cpu_throttle = s->parameters.max_cpu_throttle;
 
     return params;
 }
@@ -1043,6 +1046,15 @@  static bool migrate_params_check(MigrationParameters *params, Error **errp)
         return false;
     }
 
+    if (params->has_max_cpu_throttle &&
+        (params->max_cpu_throttle < params->cpu_throttle_initial ||
+         params->max_cpu_throttle > 99)) {
+        error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
+                   "max_cpu_throttle",
+                   "an integer in the range of cpu_throttle_initial to 99");
+        return false;
+    }
+
     return true;
 }
 
@@ -1110,6 +1122,9 @@  static void migrate_params_test_apply(MigrateSetParameters *params,
     if (params->has_max_postcopy_bandwidth) {
         dest->max_postcopy_bandwidth = params->max_postcopy_bandwidth;
     }
+    if (params->has_max_cpu_throttle) {
+        dest->max_cpu_throttle = params->max_cpu_throttle;
+    }
 }
 
 static void migrate_params_apply(MigrateSetParameters *params, Error **errp)
@@ -1185,6 +1200,9 @@  static void migrate_params_apply(MigrateSetParameters *params, Error **errp)
     if (params->has_max_postcopy_bandwidth) {
         s->parameters.max_postcopy_bandwidth = params->max_postcopy_bandwidth;
     }
+    if (params->has_max_cpu_throttle) {
+        s->parameters.max_cpu_throttle = params->max_cpu_throttle;
+    }
 }
 
 void qmp_migrate_set_parameters(MigrateSetParameters *params, Error **errp)
@@ -1962,7 +1980,6 @@  static int64_t migrate_max_postcopy_bandwidth(void)
     return s->parameters.max_postcopy_bandwidth;
 }
 
-
 bool migrate_use_block(void)
 {
     MigrationState *s;
@@ -3160,6 +3177,9 @@  static Property migration_properties[] = {
     DEFINE_PROP_SIZE("max-postcopy-bandwidth", MigrationState,
                       parameters.max_postcopy_bandwidth,
                       DEFAULT_MIGRATE_MAX_POSTCOPY_BANDWIDTH),
+    DEFINE_PROP_UINT8("max-cpu-throttle", MigrationState,
+                      parameters.max_cpu_throttle,
+                      DEFAULT_MIGRATE_MAX_CPU_THROTTLE),
 
     /* Migration capabilities */
     DEFINE_PROP_MIG_CAP("x-xbzrle", MIGRATION_CAPABILITY_XBZRLE),
@@ -3230,6 +3250,7 @@  static void migration_instance_init(Object *obj)
     params->has_x_multifd_page_count = true;
     params->has_xbzrle_cache_size = true;
     params->has_max_postcopy_bandwidth = true;
+    params->has_max_cpu_throttle = true;
 
     qemu_sem_init(&ms->postcopy_pause_sem, 0);
     qemu_sem_init(&ms->postcopy_pause_rp_sem, 0);
diff --git a/migration/migration.h b/migration/migration.h
index 64a7b33735..eb0c04a7b4 100644
--- a/migration/migration.h
+++ b/migration/migration.h
@@ -266,6 +266,7 @@  bool migrate_colo_enabled(void);
 
 bool migrate_use_block(void);
 bool migrate_use_block_incremental(void);
+int migrate_max_cpu_throttle(void);
 bool migrate_use_return_path(void);
 
 bool migrate_use_compression(void);
diff --git a/migration/ram.c b/migration/ram.c
index 24dea2730c..cdd4349177 100644
--- a/migration/ram.c
+++ b/migration/ram.c
@@ -1390,13 +1390,15 @@  static void mig_throttle_guest_down(void)
     MigrationState *s = migrate_get_current();
     uint64_t pct_initial = s->parameters.cpu_throttle_initial;
     uint64_t pct_icrement = s->parameters.cpu_throttle_increment;
+    int pct_max = s->parameters.max_cpu_throttle;
 
     /* We have not started throttling yet. Let's start it. */
     if (!cpu_throttle_active()) {
         cpu_throttle_set(pct_initial);
     } else {
         /* Throttling already on, just increase the rate */
-        cpu_throttle_set(cpu_throttle_get_percentage() + pct_icrement);
+        cpu_throttle_set(MIN(cpu_throttle_get_percentage() + pct_icrement,
+                         pct_max));
     }
 }
 
diff --git a/qapi/migration.json b/qapi/migration.json
index 186e8a7303..865064e18c 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -523,6 +523,9 @@ 
 # @max-postcopy-bandwidth: Background transfer bandwidth during postcopy.
 #                     Defaults to 0 (unlimited).  In bytes per second.
 #                     (Since 3.0)
+#
+# @max-cpu-throttle: maximum cpu throttle percentage.
+#                    Defaults to 99. (Since 3.1)
 # Since: 2.4
 ##
 { 'enum': 'MigrationParameter',
@@ -531,7 +534,8 @@ 
            'tls-creds', 'tls-hostname', 'max-bandwidth',
            'downtime-limit', 'x-checkpoint-delay', 'block-incremental',
            'x-multifd-channels', 'x-multifd-page-count',
-           'xbzrle-cache-size', 'max-postcopy-bandwidth' ] }
+           'xbzrle-cache-size', 'max-postcopy-bandwidth',
+           'max-cpu-throttle' ] }
 
 ##
 # @MigrateSetParameters:
@@ -603,6 +607,10 @@ 
 # @max-postcopy-bandwidth: Background transfer bandwidth during postcopy.
 #                     Defaults to 0 (unlimited).  In bytes per second.
 #                     (Since 3.0)
+#
+# @max-cpu-throttle: maximum cpu throttle percentage.
+#                    The default value is 99. (Since 3.1)
+#
 # Since: 2.4
 ##
 # TODO either fuse back into MigrationParameters, or make
@@ -622,7 +630,8 @@ 
             '*x-multifd-channels': 'int',
             '*x-multifd-page-count': 'int',
             '*xbzrle-cache-size': 'size',
-            '*max-postcopy-bandwidth': 'size' } }
+            '*max-postcopy-bandwidth': 'size',
+	    '*max-cpu-throttle': 'int' } }
 
 ##
 # @migrate-set-parameters:
@@ -709,6 +718,11 @@ 
 # @max-postcopy-bandwidth: Background transfer bandwidth during postcopy.
 #                     Defaults to 0 (unlimited).  In bytes per second.
 #                     (Since 3.0)
+#
+# @max-cpu-throttle: maximum cpu throttle percentage.
+#                    Defaults to 99.
+#                     (Since 3.1)
+#
 # Since: 2.4
 ##
 { 'struct': 'MigrationParameters',
@@ -726,7 +740,8 @@ 
             '*x-multifd-channels': 'uint8',
             '*x-multifd-page-count': 'uint32',
             '*xbzrle-cache-size': 'size',
-            '*max-postcopy-bandwidth': 'size'  } }
+	    '*max-postcopy-bandwidth': 'size',
+            '*max-cpu-throttle':'uint8'} }
 
 ##
 # @query-migrate-parameters: