Commit 4cbc9c7f authored by Li Qiang's avatar Li Qiang Committed by Juan Quintela
Browse files

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



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: default avatarLi Qiang <liq3ea@gmail.com>
Reviewed-by: default avatarJuan Quintela <quintela@redhat.com>
Reviewed-by: default avatarDr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: default avatarJuan Quintela <quintela@redhat.com>
parent 3eb21fe9
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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);
+22 −1
Original line number Diff line number Diff line
@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -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);
+3 −1
Original line number Diff line number Diff line
@@ -1391,13 +1391,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));
    }
}

+18 −3
Original line number Diff line number Diff line
@@ -522,6 +522,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',
@@ -530,7 +533,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:
@@ -602,6 +606,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
@@ -621,7 +629,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:
@@ -708,6 +717,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',
@@ -725,7 +739,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: