1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-03-28 02:50:41 +03:00

writecache: support settings metadata_only and pause_writeback

Two new settings for tuning dm-writecache.
This commit is contained in:
David Teigland 2022-12-08 16:42:04 -06:00
parent 9ce55a43d0
commit fa7fe5cbbe
7 changed files with 84 additions and 1 deletions

View File

@ -982,7 +982,9 @@ struct writecache_settings {
uint32_t fua;
uint32_t nofua;
uint32_t cleaner;
uint32_t max_age;
uint32_t max_age; /* in milliseconds */
uint32_t metadata_only;
uint32_t pause_writeback; /* in milliseconds */
/*
* Allow an unrecognized key and its val to be passed to the kernel for
@ -1004,6 +1006,8 @@ struct writecache_settings {
unsigned nofua_set:1;
unsigned cleaner_set:1;
unsigned max_age_set:1;
unsigned metadata_only_set:1;
unsigned pause_writeback_set:1;
};
int dm_tree_node_add_writecache_target(struct dm_tree_node *node,

View File

@ -2679,6 +2679,10 @@ static int _writecache_emit_segment_line(struct dm_task *dmt,
count += 1;
if (seg->writecache_settings.max_age_set)
count += 2;
if (seg->writecache_settings.metadata_only_set)
count += 1;
if (seg->writecache_settings.pause_writeback_set)
count += 2;
if (seg->writecache_settings.new_key)
count += 2;
@ -2730,6 +2734,14 @@ static int _writecache_emit_segment_line(struct dm_task *dmt,
EMIT_PARAMS(pos, " max_age %u", seg->writecache_settings.max_age);
}
if (seg->writecache_settings.metadata_only_set) {
EMIT_PARAMS(pos, " metadata_only");
}
if (seg->writecache_settings.pause_writeback_set) {
EMIT_PARAMS(pos, " pause_writeback %u", seg->writecache_settings.pause_writeback);
}
if (seg->writecache_settings.new_key) {
EMIT_PARAMS(pos, " %s %s",
seg->writecache_settings.new_key,

View File

@ -518,6 +518,14 @@ int writecache_settings_to_str_list(struct writecache_settings *settings, struct
if (!_writecache_setting_str_list_add("max_age", (uint64_t)settings->max_age, NULL, result, mem))
errors++;
if (settings->metadata_only_set)
if (!_writecache_setting_str_list_add("metadata_only", (uint64_t)settings->metadata_only, NULL, result, mem))
errors++;
if (settings->pause_writeback_set)
if (!_writecache_setting_str_list_add("pause_writeback", (uint64_t)settings->pause_writeback, NULL, result, mem))
errors++;
if (settings->new_key && settings->new_val)
if (!_writecache_setting_str_list_add(settings->new_key, 0, settings->new_val, result, mem))
errors++;

View File

@ -135,6 +135,18 @@ static int _writecache_text_import(struct lv_segment *seg,
seg->writecache_settings.max_age_set = 1;
}
if (dm_config_has_node(sn, "metadata_only")) {
if (!dm_config_get_uint32(sn, "metadata_only", &seg->writecache_settings.metadata_only))
return SEG_LOG_ERROR("Unknown writecache_setting in");
seg->writecache_settings.metadata_only_set = 1;
}
if (dm_config_has_node(sn, "pause_writeback")) {
if (!dm_config_get_uint32(sn, "pause_writeback", &seg->writecache_settings.pause_writeback))
return SEG_LOG_ERROR("Unknown writecache_setting in");
seg->writecache_settings.pause_writeback_set = 1;
}
if (dm_config_has_node(sn, "writecache_setting_key")) {
const char *key;
const char *val;
@ -207,6 +219,14 @@ static int _writecache_text_export(const struct lv_segment *seg,
outf(f, "max_age = %u", seg->writecache_settings.max_age);
}
if (seg->writecache_settings.metadata_only_set) {
outf(f, "metadata_only = %u", seg->writecache_settings.metadata_only);
}
if (seg->writecache_settings.pause_writeback_set) {
outf(f, "pause_writeback = %u", seg->writecache_settings.pause_writeback);
}
if (seg->writecache_settings.new_key && seg->writecache_settings.new_val) {
outf(f, "writecache_setting_key = \"%s\"",
seg->writecache_settings.new_key);

View File

@ -340,6 +340,21 @@ perform. If not done beforehand, the splitcache command enables the
cleaner mode and waits for flushing to complete before detaching the
writecache. Adding cleaner=0 to the splitcache command will skip the
cleaner mode, and any required flushing is performed in device suspend.
.
.TP
max_age = <milliseconds>
Specifies the maximum age of a block in milliseconds. If a block is stored in
the cache for too long, it will be written to the underlying device and cleaned up.
.
.TP
metadata_only = 0|1
Only metadata is promoted to the cache. This option improves performance for
heavier REQ_META workloads.
.
.TP
pause_writeback = <milliseconds>
Pause writeback if there was some write I/O redirected to the origin volume in
the last number of milliseconds.
.SS dm-writecache using metadata profiles
.

View File

@ -665,6 +665,16 @@ static int _lvchange_writecache(struct cmd_context *cmd,
seg->writecache_settings.max_age = settings.max_age;
set_count++;
}
if (settings.metadata_only_set) {
seg->writecache_settings.metadata_only_set = settings.metadata_only_set;
seg->writecache_settings.metadata_only = settings.metadata_only;
set_count++;
}
if (settings.pause_writeback_set) {
seg->writecache_settings.pause_writeback_set = settings.pause_writeback_set;
seg->writecache_settings.pause_writeback = settings.pause_writeback;
set_count++;
}
if (settings.new_key && settings.new_val) {
seg->writecache_settings.new_key = settings.new_key;
seg->writecache_settings.new_val = settings.new_val;

View File

@ -1473,6 +1473,20 @@ static int _get_one_writecache_setting(struct cmd_context *cmd, struct writecach
return 1;
}
if (!strncmp(key, "metadata_only", strlen("metadata_only"))) {
if (sscanf(val, "%u", &settings->metadata_only) != 1)
goto_bad;
settings->metadata_only_set = 1;
return 1;
}
if (!strncmp(key, "pause_writeback", strlen("pause_writeback"))) {
if (sscanf(val, "%u", &settings->pause_writeback) != 1)
goto_bad;
settings->pause_writeback_set = 1;
return 1;
}
if (settings->new_key) {
log_error("Setting %s is not recognized. Only one unrecognized setting is allowed.", key);
return 0;