[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC/COLO: 3/3] COLO: Parameterise background RAM transfer
From: |
Dr. David Alan Gilbert (git) |
Subject: |
[Qemu-devel] [RFC/COLO: 3/3] COLO: Parameterise background RAM transfer limit |
Date: |
Tue, 4 Aug 2015 20:26:27 +0100 |
From: "Dr. David Alan Gilbert" <address@hidden>
COLO (experimentally) transfers RAM in the background when the amount
to transfer reaches a limit; allow this limit to be set via the
parameter mechanism.
Signed-off-by: Dr. David Alan Gilbert <address@hidden>
---
hmp.c | 8 ++++++++
migration/colo.c | 6 ++----
migration/migration.c | 19 +++++++++++++++++++
qapi-schema.json | 13 ++++++++++---
4 files changed, 39 insertions(+), 7 deletions(-)
diff --git a/hmp.c b/hmp.c
index 0e92d11..c177fbf 100644
--- a/hmp.c
+++ b/hmp.c
@@ -307,6 +307,9 @@ void hmp_info_migrate_parameters(Monitor *mon, const QDict
*qdict)
monitor_printf(mon, " %s: %" PRId64,
MigrationParameter_lookup[MIGRATION_PARAMETER_COLO_RELAX_TIME],
params->colo_relax_time);
+ monitor_printf(mon, " %s: %" PRId64,
+ MigrationParameter_lookup[MIGRATION_PARAMETER_COLO_RAM_LIVE],
+ params->colo_ram_live);
monitor_printf(mon, "\n");
}
@@ -1263,6 +1266,7 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict
*qdict)
bool has_colo_min_time = false;
bool has_colo_max_time = false;
bool has_colo_relax_time = false;
+ bool has_colo_ram_live = false;
int i;
@@ -1296,6 +1300,9 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict
*qdict)
case MIGRATION_PARAMETER_COLO_RELAX_TIME:
has_colo_relax_time = true;
break;
+ case MIGRATION_PARAMETER_COLO_RAM_LIVE:
+ has_colo_ram_live = true;
+ break;
}
qmp_migrate_set_parameters(has_compress_level, value,
has_compress_threads, value,
@@ -1306,6 +1313,7 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict
*qdict)
has_colo_min_time, value,
has_colo_max_time, value,
has_colo_relax_time, value,
+ has_colo_ram_live, value,
&err);
break;
}
diff --git a/migration/colo.c b/migration/colo.c
index 5c8096d..9db9de1 100644
--- a/migration/colo.c
+++ b/migration/colo.c
@@ -486,13 +486,11 @@ static bool checkpoint_choice(MigrationState *s)
}
}
-/* should be calculated by bandwidth and max downtime ? */
-#define THRESHOLD_PENDING_SIZE (10 * 1024 * 1024UL)
-
static int colo_need_live_migrate_ram(MigrationState *s)
{
uint64_t pending_size;
- int64_t max_size = THRESHOLD_PENDING_SIZE;
+ int64_t max_size = s->parameters[MIGRATION_PARAMETER_COLO_RAM_LIVE] *
+ 1024 * 1024;
pending_size = qemu_savevm_state_pending(s->file, max_size);
return (pending_size && pending_size >= max_size);
diff --git a/migration/migration.c b/migration/migration.c
index d41914c..d4214be 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -61,6 +61,8 @@
#define DEFAULT_MIGRATE_COLO_MAX_TIME 10000
/* Time after a miscompare before resuming comparison (ms) */
#define DEFAULT_MIGRATE_COLO_RELAX_TIME 100
+/* Amount of RAM changes to trigger background RAM transfer (MiB) */
+#define DEFAULT_MIGRATE_COLO_RAM_LIVE 10
static NotifierList migration_state_notifiers =
NOTIFIER_LIST_INITIALIZER(migration_state_notifiers);
@@ -97,6 +99,8 @@ MigrationState *migrate_get_current(void)
DEFAULT_MIGRATE_COLO_MAX_TIME,
.parameters[MIGRATION_PARAMETER_COLO_RELAX_TIME] =
DEFAULT_MIGRATE_COLO_RELAX_TIME,
+ .parameters[MIGRATION_PARAMETER_COLO_RAM_LIVE] =
+ DEFAULT_MIGRATE_COLO_RAM_LIVE,
.checkpoint_state.max_downtime = 0,
.checkpoint_state.min_downtime = INT64_MAX
};
@@ -420,6 +424,7 @@ MigrationParameters *qmp_query_migrate_parameters(Error
**errp)
params->colo_min_time = s->parameters[MIGRATION_PARAMETER_COLO_MIN_TIME];
params->colo_max_time = s->parameters[MIGRATION_PARAMETER_COLO_MAX_TIME];
params->colo_relax_time =
s->parameters[MIGRATION_PARAMETER_COLO_RELAX_TIME];
+ params->colo_ram_live = s->parameters[MIGRATION_PARAMETER_COLO_RAM_LIVE];
return params;
}
@@ -583,6 +588,8 @@ void qmp_migrate_set_parameters(bool has_compress_level,
int64_t colo_max_time,
bool has_colo_relax_time,
int64_t colo_relax_time,
+ bool has_colo_ram_live,
+ int64_t colo_ram_live,
Error **errp)
{
MigrationState *s = migrate_get_current();
@@ -636,6 +643,11 @@ void qmp_migrate_set_parameters(bool has_compress_level,
"colo_relax_time",
"is invalid, it must be positive");
}
+ if (has_colo_ram_live && (colo_ram_live < 0)) {
+ error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
+ "colo_ram_live",
+ "is invalid, it must be positive");
+ }
if (has_compress_level) {
s->parameters[MIGRATION_PARAMETER_COMPRESS_LEVEL] = compress_level;
@@ -671,6 +683,10 @@ void qmp_migrate_set_parameters(bool has_compress_level,
s->parameters[MIGRATION_PARAMETER_COLO_RELAX_TIME] =
colo_relax_time;
}
+ if (has_colo_ram_live) {
+ s->parameters[MIGRATION_PARAMETER_COLO_RAM_LIVE] =
+ colo_ram_live;
+ }
}
/* shared migration helpers */
@@ -799,6 +815,8 @@ static MigrationState *migrate_init(const MigrationParams
*params)
MIGRATION_PARAMETER_COLO_MAX_TIME];
int64_t colo_relax_time = s->parameters[
MIGRATION_PARAMETER_COLO_RELAX_TIME];
+ int64_t colo_ram_live = s->parameters[
+ MIGRATION_PARAMETER_COLO_RAM_LIVE];
memcpy(enabled_capabilities, s->enabled_capabilities,
sizeof(enabled_capabilities));
@@ -821,6 +839,7 @@ static MigrationState *migrate_init(const MigrationParams
*params)
s->parameters[MIGRATION_PARAMETER_COLO_MIN_TIME] = colo_min_time;
s->parameters[MIGRATION_PARAMETER_COLO_MAX_TIME] = colo_max_time;
s->parameters[MIGRATION_PARAMETER_COLO_RELAX_TIME] = colo_relax_time;
+ s->parameters[MIGRATION_PARAMETER_COLO_RAM_LIVE] = colo_ram_live;
s->bandwidth_limit = bandwidth_limit;
migrate_set_state(&s->state, MIGRATION_STATUS_NONE,
MIGRATION_STATUS_SETUP);
diff --git a/qapi-schema.json b/qapi-schema.json
index 30113fc..bd264d0 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -636,13 +636,15 @@
# @colo-min-time: Minimum Time (in ms) for a COLO comparative checkpoint
# @colo-max-time: Maximum Time (in ms) for a COLO comparative checkpoint
# @colo-relax-time: Time (in ms) after a miscompare before starting a new COLO
checkpoint
+# @colo-ram-live: Amount of RAM changes to trigger background RAM transfer
(MiB)
#
# Since: 2.4
##
{ 'enum': 'MigrationParameter',
'data': ['compress-level', 'compress-threads', 'decompress-threads',
'colo-passive-count', 'colo-passive-limit', 'colo-passive-time',
- 'colo-min-time', 'colo-max-time', 'colo-relax-time' ] }
+ 'colo-min-time', 'colo-max-time', 'colo-relax-time',
+ 'colo-ram-live' ] }
#
# @migrate-set-parameters
@@ -661,6 +663,7 @@
# @colo-min-time: Minimum Time (in ms) for a COLO comparative checkpoint
# @colo-max-time: Maximum Time (in ms) for a COLO comparative checkpoint
# @colo-relax-time: Time (in ms) after a miscompare before starting a new COLO
checkpoint
+# @colo-ram-live: Amount of RAM changes to trigger background RAM transfer
(MiB)
#
# Since: 2.4
##
@@ -673,7 +676,8 @@
'*colo-passive-time': 'int',
'*colo-min-time': 'int',
'*colo-max-time': 'int',
- '*colo-relax-time': 'int'
+ '*colo-relax-time': 'int',
+ '*colo-ram-live': 'int'
} }
#
@@ -685,6 +689,8 @@
#
# @decompress-threads: decompression thread count
#
+# @colo-ram-live: Amount of RAM changes to trigger background RAM transfer
(MiB)
+#
# Since: 2.4
##
{ 'struct': 'MigrationParameters',
@@ -696,7 +702,8 @@
'colo-passive-time': 'int',
'colo-min-time': 'int',
'colo-max-time': 'int',
- 'colo-relax-time': 'int' } }
+ 'colo-relax-time': 'int',
+ 'colo-ram-live': 'int' } }
##
# @query-migrate-parameters
--
2.4.3