[PATCH RESEND RFC 08/10] migration: Introduce cpu-responsive-throttle parameter

Hyman Huang posted 10 patches 2 months, 2 weeks ago
There is a newer version of this series
[PATCH RESEND RFC 08/10] migration: Introduce cpu-responsive-throttle parameter
Posted by Hyman Huang 2 months, 2 weeks ago
To enable the responsive throttle that will be implemented
in the next commit, introduce the cpu-responsive-throttle
parameter.

Signed-off-by: Hyman Huang <yong.huang@smartx.com>
---
 migration/migration-hmp-cmds.c |  8 ++++++++
 migration/options.c            | 20 ++++++++++++++++++++
 migration/options.h            |  1 +
 qapi/migration.json            | 16 +++++++++++++++-
 4 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
index f7b8e06bb4..a3d4d3f62f 100644
--- a/migration/migration-hmp-cmds.c
+++ b/migration/migration-hmp-cmds.c
@@ -273,6 +273,10 @@ void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)
             MigrationParameter_str(
                 MIGRATION_PARAMETER_CPU_PERIODIC_THROTTLE_INTERVAL),
             params->cpu_periodic_throttle_interval);
+        assert(params->has_cpu_responsive_throttle);
+        monitor_printf(mon, "%s: %s\n",
+            MigrationParameter_str(MIGRATION_PARAMETER_CPU_RESPONSIVE_THROTTLE),
+            params->cpu_responsive_throttle ? "on" : "off");
         assert(params->has_max_cpu_throttle);
         monitor_printf(mon, "%s: %u\n",
             MigrationParameter_str(MIGRATION_PARAMETER_MAX_CPU_THROTTLE),
@@ -529,6 +533,10 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
         p->has_cpu_periodic_throttle_interval = true;
         visit_type_uint8(v, param, &p->cpu_periodic_throttle_interval, &err);
         break;
+    case MIGRATION_PARAMETER_CPU_RESPONSIVE_THROTTLE:
+        p->has_cpu_responsive_throttle = true;
+        visit_type_bool(v, param, &p->cpu_responsive_throttle, &err);
+        break;
     case MIGRATION_PARAMETER_MAX_CPU_THROTTLE:
         p->has_max_cpu_throttle = true;
         visit_type_uint8(v, param, &p->max_cpu_throttle, &err);
diff --git a/migration/options.c b/migration/options.c
index 2dbe275ba0..aa233684ee 100644
--- a/migration/options.c
+++ b/migration/options.c
@@ -110,6 +110,8 @@ Property migration_properties[] = {
     DEFINE_PROP_UINT8("x-cpu-periodic-throttle-interval", MigrationState,
                       parameters.cpu_periodic_throttle_interval,
                       DEFAULT_MIGRATE_CPU_PERIODIC_THROTTLE_INTERVAL),
+    DEFINE_PROP_BOOL("x-cpu-responsive-throttle", MigrationState,
+                      parameters.cpu_responsive_throttle, false),
     DEFINE_PROP_SIZE("x-max-bandwidth", MigrationState,
                       parameters.max_bandwidth, MAX_THROTTLE),
     DEFINE_PROP_SIZE("avail-switchover-bandwidth", MigrationState,
@@ -715,6 +717,13 @@ bool migrate_periodic_throttle(void)
     return s->parameters.cpu_periodic_throttle;
 }
 
+bool migrate_responsive_throttle(void)
+{
+    MigrationState *s = migrate_get_current();
+
+    return s->parameters.cpu_responsive_throttle;
+}
+
 bool migrate_cpu_throttle_tailslow(void)
 {
     MigrationState *s = migrate_get_current();
@@ -899,6 +908,8 @@ MigrationParameters *qmp_query_migrate_parameters(Error **errp)
     params->has_cpu_periodic_throttle_interval = true;
     params->cpu_periodic_throttle_interval =
         s->parameters.cpu_periodic_throttle_interval;
+    params->has_cpu_responsive_throttle = true;
+    params->cpu_responsive_throttle = s->parameters.cpu_responsive_throttle;
     params->tls_creds = g_strdup(s->parameters.tls_creds);
     params->tls_hostname = g_strdup(s->parameters.tls_hostname);
     params->tls_authz = g_strdup(s->parameters.tls_authz ?
@@ -967,6 +978,7 @@ void migrate_params_init(MigrationParameters *params)
     params->has_cpu_throttle_tailslow = true;
     params->has_cpu_periodic_throttle = true;
     params->has_cpu_periodic_throttle_interval = true;
+    params->has_cpu_responsive_throttle = true;
     params->has_max_bandwidth = true;
     params->has_downtime_limit = true;
     params->has_x_checkpoint_delay = true;
@@ -1208,6 +1220,10 @@ static void migrate_params_test_apply(MigrateSetParameters *params,
             params->cpu_periodic_throttle_interval;
     }
 
+    if (params->has_cpu_responsive_throttle) {
+        dest->cpu_responsive_throttle = params->cpu_responsive_throttle;
+    }
+
     if (params->tls_creds) {
         assert(params->tls_creds->type == QTYPE_QSTRING);
         dest->tls_creds = params->tls_creds->u.s;
@@ -1325,6 +1341,10 @@ static void migrate_params_apply(MigrateSetParameters *params, Error **errp)
             params->cpu_periodic_throttle_interval;
     }
 
+    if (params->has_cpu_responsive_throttle) {
+        s->parameters.cpu_responsive_throttle = params->cpu_responsive_throttle;
+    }
+
     if (params->tls_creds) {
         g_free(s->parameters.tls_creds);
         assert(params->tls_creds->type == QTYPE_QSTRING);
diff --git a/migration/options.h b/migration/options.h
index efeac01470..613d675003 100644
--- a/migration/options.h
+++ b/migration/options.h
@@ -70,6 +70,7 @@ uint8_t migrate_cpu_throttle_increment(void);
 uint8_t migrate_cpu_throttle_initial(void);
 uint8_t migrate_periodic_throttle_interval(void);
 bool migrate_periodic_throttle(void);
+bool migrate_responsive_throttle(void);
 bool migrate_cpu_throttle_tailslow(void);
 bool migrate_direct_io(void);
 uint64_t migrate_downtime_limit(void);
diff --git a/qapi/migration.json b/qapi/migration.json
index 6d8358c202..9f52ed1899 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -734,6 +734,10 @@
 # @cpu-periodic-throttle-interval: Interval of the periodic CPU throttling.
 #     (Since 9.1)
 #
+# @cpu-responsive-throttle: Make CPU throttling more responsively by
+#                           introduce an extra detection metric of
+#                           migration convergence. (Since 9.1)
+#
 # @tls-creds: ID of the 'tls-creds' object that provides credentials
 #     for establishing a TLS connection over the migration data
 #     channel.  On the outgoing side of the migration, the credentials
@@ -855,7 +859,7 @@
            'throttle-trigger-threshold',
            'cpu-throttle-initial', 'cpu-throttle-increment',
            'cpu-throttle-tailslow', 'cpu-periodic-throttle',
-           'cpu-periodic-throttle-interval',
+           'cpu-periodic-throttle-interval', 'cpu-responsive-throttle',
            'tls-creds', 'tls-hostname', 'tls-authz', 'max-bandwidth',
            'avail-switchover-bandwidth', 'downtime-limit',
            { 'name': 'x-checkpoint-delay', 'features': [ 'unstable' ] },
@@ -916,6 +920,10 @@
 # @cpu-periodic-throttle-interval: Interval of the periodic CPU throttling.
 #     (Since 9.1)
 #
+# @cpu-responsive-throttle: Make CPU throttling more responsively by
+#                           introduce an extra detection metric of
+#                           migration convergence. (Since 9.1)
+#
 # @tls-creds: ID of the 'tls-creds' object that provides credentials
 #     for establishing a TLS connection over the migration data
 #     channel.  On the outgoing side of the migration, the credentials
@@ -1045,6 +1053,7 @@
             '*cpu-throttle-tailslow': 'bool',
             '*cpu-periodic-throttle': 'bool',
             '*cpu-periodic-throttle-interval': 'uint8',
+            '*cpu-responsive-throttle': 'bool',
             '*tls-creds': 'StrOrNull',
             '*tls-hostname': 'StrOrNull',
             '*tls-authz': 'StrOrNull',
@@ -1132,6 +1141,10 @@
 # @cpu-periodic-throttle-interval: Interval of the periodic CPU throttling.
 #     (Since 9.1)
 #
+# @cpu-responsive-throttle: Make CPU throttling more responsively by
+#                           introduce an extra detection metric of
+#                           migration convergence. (Since 9.1)
+#
 # @tls-creds: ID of the 'tls-creds' object that provides credentials
 #     for establishing a TLS connection over the migration data
 #     channel.  On the outgoing side of the migration, the credentials
@@ -1254,6 +1267,7 @@
             '*cpu-throttle-tailslow': 'bool',
             '*cpu-periodic-throttle': 'bool',
             '*cpu-periodic-throttle-interval': 'uint8',
+            '*cpu-responsive-throttle': 'bool',
             '*tls-creds': 'str',
             '*tls-hostname': 'str',
             '*tls-authz': 'str',
-- 
2.39.1
Re: [PATCH RESEND RFC 08/10] migration: Introduce cpu-responsive-throttle parameter
Posted by Yong Huang 2 months, 2 weeks ago
In order to reduce the maintenance work of QMP.

Given that the focus of this patchset is huge VM migration, is
it possible to enable or disable these two features with a single
parameter, such as "cpu-aggressive-throttle"?

Yong

On Mon, Sep 9, 2024 at 10:26 PM Hyman Huang <yong.huang@smartx.com> wrote:

> To enable the responsive throttle that will be implemented
> in the next commit, introduce the cpu-responsive-throttle
> parameter.
>
> Signed-off-by: Hyman Huang <yong.huang@smartx.com>
> ---
>  migration/migration-hmp-cmds.c |  8 ++++++++
>  migration/options.c            | 20 ++++++++++++++++++++
>  migration/options.h            |  1 +
>  qapi/migration.json            | 16 +++++++++++++++-
>  4 files changed, 44 insertions(+), 1 deletion(-)
>
> diff --git a/migration/migration-hmp-cmds.c
> b/migration/migration-hmp-cmds.c
> index f7b8e06bb4..a3d4d3f62f 100644
> --- a/migration/migration-hmp-cmds.c
> +++ b/migration/migration-hmp-cmds.c
> @@ -273,6 +273,10 @@ void hmp_info_migrate_parameters(Monitor *mon, const
> QDict *qdict)
>              MigrationParameter_str(
>                  MIGRATION_PARAMETER_CPU_PERIODIC_THROTTLE_INTERVAL),
>              params->cpu_periodic_throttle_interval);
> +        assert(params->has_cpu_responsive_throttle);
> +        monitor_printf(mon, "%s: %s\n",
> +
> MigrationParameter_str(MIGRATION_PARAMETER_CPU_RESPONSIVE_THROTTLE),
> +            params->cpu_responsive_throttle ? "on" : "off");
>          assert(params->has_max_cpu_throttle);
>          monitor_printf(mon, "%s: %u\n",
>              MigrationParameter_str(MIGRATION_PARAMETER_MAX_CPU_THROTTLE),
> @@ -529,6 +533,10 @@ void hmp_migrate_set_parameter(Monitor *mon, const
> QDict *qdict)
>          p->has_cpu_periodic_throttle_interval = true;
>          visit_type_uint8(v, param, &p->cpu_periodic_throttle_interval,
> &err);
>          break;
> +    case MIGRATION_PARAMETER_CPU_RESPONSIVE_THROTTLE:
> +        p->has_cpu_responsive_throttle = true;
> +        visit_type_bool(v, param, &p->cpu_responsive_throttle, &err);
> +        break;
>      case MIGRATION_PARAMETER_MAX_CPU_THROTTLE:
>          p->has_max_cpu_throttle = true;
>          visit_type_uint8(v, param, &p->max_cpu_throttle, &err);
> diff --git a/migration/options.c b/migration/options.c
> index 2dbe275ba0..aa233684ee 100644
> --- a/migration/options.c
> +++ b/migration/options.c
> @@ -110,6 +110,8 @@ Property migration_properties[] = {
>      DEFINE_PROP_UINT8("x-cpu-periodic-throttle-interval", MigrationState,
>                        parameters.cpu_periodic_throttle_interval,
>                        DEFAULT_MIGRATE_CPU_PERIODIC_THROTTLE_INTERVAL),
> +    DEFINE_PROP_BOOL("x-cpu-responsive-throttle", MigrationState,
> +                      parameters.cpu_responsive_throttle, false),
>      DEFINE_PROP_SIZE("x-max-bandwidth", MigrationState,
>                        parameters.max_bandwidth, MAX_THROTTLE),
>      DEFINE_PROP_SIZE("avail-switchover-bandwidth", MigrationState,
> @@ -715,6 +717,13 @@ bool migrate_periodic_throttle(void)
>      return s->parameters.cpu_periodic_throttle;
>  }
>
> +bool migrate_responsive_throttle(void)
> +{
> +    MigrationState *s = migrate_get_current();
> +
> +    return s->parameters.cpu_responsive_throttle;
> +}
> +
>  bool migrate_cpu_throttle_tailslow(void)
>  {
>      MigrationState *s = migrate_get_current();
> @@ -899,6 +908,8 @@ MigrationParameters
> *qmp_query_migrate_parameters(Error **errp)
>      params->has_cpu_periodic_throttle_interval = true;
>      params->cpu_periodic_throttle_interval =
>          s->parameters.cpu_periodic_throttle_interval;
> +    params->has_cpu_responsive_throttle = true;
> +    params->cpu_responsive_throttle =
> s->parameters.cpu_responsive_throttle;
>      params->tls_creds = g_strdup(s->parameters.tls_creds);
>      params->tls_hostname = g_strdup(s->parameters.tls_hostname);
>      params->tls_authz = g_strdup(s->parameters.tls_authz ?
> @@ -967,6 +978,7 @@ void migrate_params_init(MigrationParameters *params)
>      params->has_cpu_throttle_tailslow = true;
>      params->has_cpu_periodic_throttle = true;
>      params->has_cpu_periodic_throttle_interval = true;
> +    params->has_cpu_responsive_throttle = true;
>      params->has_max_bandwidth = true;
>      params->has_downtime_limit = true;
>      params->has_x_checkpoint_delay = true;
> @@ -1208,6 +1220,10 @@ static void
> migrate_params_test_apply(MigrateSetParameters *params,
>              params->cpu_periodic_throttle_interval;
>      }
>
> +    if (params->has_cpu_responsive_throttle) {
> +        dest->cpu_responsive_throttle = params->cpu_responsive_throttle;
> +    }
> +
>      if (params->tls_creds) {
>          assert(params->tls_creds->type == QTYPE_QSTRING);
>          dest->tls_creds = params->tls_creds->u.s;
> @@ -1325,6 +1341,10 @@ static void
> migrate_params_apply(MigrateSetParameters *params, Error **errp)
>              params->cpu_periodic_throttle_interval;
>      }
>
> +    if (params->has_cpu_responsive_throttle) {
> +        s->parameters.cpu_responsive_throttle =
> params->cpu_responsive_throttle;
> +    }
> +
>      if (params->tls_creds) {
>          g_free(s->parameters.tls_creds);
>          assert(params->tls_creds->type == QTYPE_QSTRING);
> diff --git a/migration/options.h b/migration/options.h
> index efeac01470..613d675003 100644
> --- a/migration/options.h
> +++ b/migration/options.h
> @@ -70,6 +70,7 @@ uint8_t migrate_cpu_throttle_increment(void);
>  uint8_t migrate_cpu_throttle_initial(void);
>  uint8_t migrate_periodic_throttle_interval(void);
>  bool migrate_periodic_throttle(void);
> +bool migrate_responsive_throttle(void);
>  bool migrate_cpu_throttle_tailslow(void);
>  bool migrate_direct_io(void);
>  uint64_t migrate_downtime_limit(void);
> diff --git a/qapi/migration.json b/qapi/migration.json
> index 6d8358c202..9f52ed1899 100644
> --- a/qapi/migration.json
> +++ b/qapi/migration.json
> @@ -734,6 +734,10 @@
>  # @cpu-periodic-throttle-interval: Interval of the periodic CPU
> throttling.
>  #     (Since 9.1)
>  #
> +# @cpu-responsive-throttle: Make CPU throttling more responsively by
> +#                           introduce an extra detection metric of
> +#                           migration convergence. (Since 9.1)
> +#
>  # @tls-creds: ID of the 'tls-creds' object that provides credentials
>  #     for establishing a TLS connection over the migration data
>  #     channel.  On the outgoing side of the migration, the credentials
> @@ -855,7 +859,7 @@
>             'throttle-trigger-threshold',
>             'cpu-throttle-initial', 'cpu-throttle-increment',
>             'cpu-throttle-tailslow', 'cpu-periodic-throttle',
> -           'cpu-periodic-throttle-interval',
> +           'cpu-periodic-throttle-interval', 'cpu-responsive-throttle',
>             'tls-creds', 'tls-hostname', 'tls-authz', 'max-bandwidth',
>             'avail-switchover-bandwidth', 'downtime-limit',
>             { 'name': 'x-checkpoint-delay', 'features': [ 'unstable' ] },
> @@ -916,6 +920,10 @@
>  # @cpu-periodic-throttle-interval: Interval of the periodic CPU
> throttling.
>  #     (Since 9.1)
>  #
> +# @cpu-responsive-throttle: Make CPU throttling more responsively by
> +#                           introduce an extra detection metric of
> +#                           migration convergence. (Since 9.1)
> +#
>  # @tls-creds: ID of the 'tls-creds' object that provides credentials
>  #     for establishing a TLS connection over the migration data
>  #     channel.  On the outgoing side of the migration, the credentials
> @@ -1045,6 +1053,7 @@
>              '*cpu-throttle-tailslow': 'bool',
>              '*cpu-periodic-throttle': 'bool',
>              '*cpu-periodic-throttle-interval': 'uint8',
> +            '*cpu-responsive-throttle': 'bool',
>              '*tls-creds': 'StrOrNull',
>              '*tls-hostname': 'StrOrNull',
>              '*tls-authz': 'StrOrNull',
> @@ -1132,6 +1141,10 @@
>  # @cpu-periodic-throttle-interval: Interval of the periodic CPU
> throttling.
>  #     (Since 9.1)
>  #
> +# @cpu-responsive-throttle: Make CPU throttling more responsively by
> +#                           introduce an extra detection metric of
> +#                           migration convergence. (Since 9.1)
> +#
>  # @tls-creds: ID of the 'tls-creds' object that provides credentials
>  #     for establishing a TLS connection over the migration data
>  #     channel.  On the outgoing side of the migration, the credentials
> @@ -1254,6 +1267,7 @@
>              '*cpu-throttle-tailslow': 'bool',
>              '*cpu-periodic-throttle': 'bool',
>              '*cpu-periodic-throttle-interval': 'uint8',
> +            '*cpu-responsive-throttle': 'bool',
>              '*tls-creds': 'str',
>              '*tls-hostname': 'str',
>              '*tls-authz': 'str',
> --
> 2.39.1
>
>

-- 
Best regards