MDEV-24537 innodb_max_dirty_pages_pct_lwm=0 lost its special meaning
In commit 3a9a3be1c64b14c05648e87ebe0f1dd96457de41 (MDEV-23855) some previous logic was replaced with the condition dirty_pct < srv_max_dirty_pages_pct_lwm, which caused the default value of the parameter innodb_max_dirty_pages_pct_lwm=0 to lose its special meaning: 'refer to innodb_max_dirty_pages_pct instead'. This implicit special meaning was visible in the function af_get_pct_for_dirty(), which was removed in commit f0c295e2de8c074c2ca72e19ff06e1d0e3ee6d2b (MDEV-24369). page_cleaner_flush_pages_recommendation(): Restore the special meaning that was removed in MDEV-24369. buf_flush_page_cleaner(): If srv_max_dirty_pages_pct_lwm==0.0, refer to srv_max_buf_pool_modified_pct. This fixes the observed performance regression due to excessive page flushing. buf_pool_t::page_cleaner_wakeup(): Revise the wakeup condition. innodb_init(): Do initialize srv_max_io_capacity in Mariabackup. It was previously constantly 0, which caused mariadb-backup --prepare to hang in buf_flush_sync(), making no progress.
This commit is contained in:
parent
02e7bff882
commit
a993310593
@ -4,7 +4,7 @@ MariaBackup: hot backup tool for InnoDB
|
||||
Originally Created 3/3/2009 Yasufumi Kinoshita
|
||||
Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko,
|
||||
Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz.
|
||||
(c) 2017, 2020, MariaDB Corporation.
|
||||
(c) 2017, 2021, MariaDB Corporation.
|
||||
Portions written by Marko Mäkelä.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
@ -2183,6 +2183,14 @@ error:
|
||||
static bool innodb_init()
|
||||
{
|
||||
bool create_new_db = false;
|
||||
|
||||
if (srv_io_capacity >= SRV_MAX_IO_CAPACITY_LIMIT / 2) {
|
||||
/* Avoid overflow. */
|
||||
srv_max_io_capacity = SRV_MAX_IO_CAPACITY_LIMIT;
|
||||
} else {
|
||||
srv_max_io_capacity = std::max(2 * srv_io_capacity, 2000UL);
|
||||
}
|
||||
|
||||
/* Check if the data files exist or not. */
|
||||
dberr_t err = srv_sys_space.check_file_spec(&create_new_db, 5U << 20);
|
||||
|
||||
|
@ -1322,7 +1322,7 @@ SESSION_VALUE NULL
|
||||
DEFAULT_VALUE 0.000000
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
VARIABLE_TYPE DOUBLE
|
||||
VARIABLE_COMMENT Percentage of dirty pages at which flushing kicks in.
|
||||
VARIABLE_COMMENT Percentage of dirty pages at which flushing kicks in. The value 0 (default) means 'refer to innodb_max_dirty_pages_pct'.
|
||||
NUMERIC_MIN_VALUE 0
|
||||
NUMERIC_MAX_VALUE 99.999
|
||||
NUMERIC_BLOCK_SIZE NULL
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2013, 2020, MariaDB Corporation.
|
||||
Copyright (c) 2013, 2021, MariaDB Corporation.
|
||||
Copyright (c) 2013, 2014, Fusion-io
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
@ -129,11 +129,13 @@ static void buf_flush_validate_skip()
|
||||
/** Wake up the page cleaner if needed */
|
||||
inline void buf_pool_t::page_cleaner_wakeup()
|
||||
{
|
||||
if (page_cleaner_idle() &&
|
||||
(srv_max_dirty_pages_pct_lwm == 0.0 ||
|
||||
srv_max_dirty_pages_pct_lwm <=
|
||||
double(UT_LIST_GET_LEN(buf_pool.flush_list)) * 100.0 /
|
||||
double(UT_LIST_GET_LEN(buf_pool.LRU) + UT_LIST_GET_LEN(buf_pool.free))))
|
||||
if (!page_cleaner_idle())
|
||||
return;
|
||||
double dirty_pct= double(UT_LIST_GET_LEN(buf_pool.flush_list)) * 100.0 /
|
||||
double(UT_LIST_GET_LEN(buf_pool.LRU) + UT_LIST_GET_LEN(buf_pool.free));
|
||||
double pct_lwm= srv_max_dirty_pages_pct_lwm;
|
||||
if ((pct_lwm != 0.0 && pct_lwm <= dirty_pct) ||
|
||||
srv_max_buf_pool_modified_pct <= dirty_pct)
|
||||
{
|
||||
page_cleaner_is_idle= false;
|
||||
mysql_cond_signal(&do_flush_list);
|
||||
@ -1989,7 +1991,9 @@ static ulint page_cleaner_flush_pages_recommendation(ulint last_pages_in,
|
||||
sum_pages = 0;
|
||||
}
|
||||
|
||||
const ulint pct_for_dirty = static_cast<ulint>
|
||||
const ulint pct_for_dirty = srv_max_dirty_pages_pct_lwm == 0
|
||||
? (dirty_pct >= max_pct ? 100 : 0)
|
||||
: static_cast<ulint>
|
||||
(max_pct > 0.0 ? dirty_pct / max_pct : dirty_pct);
|
||||
ulint pct_total = std::max(pct_for_dirty, pct_for_lsn);
|
||||
|
||||
@ -2129,7 +2133,11 @@ unemployed:
|
||||
const double dirty_pct= double(dirty_blocks) * 100.0 /
|
||||
double(UT_LIST_GET_LEN(buf_pool.LRU) + UT_LIST_GET_LEN(buf_pool.free));
|
||||
|
||||
if (dirty_pct < srv_max_dirty_pages_pct_lwm && !lsn_limit)
|
||||
if (lsn_limit);
|
||||
else if (dirty_pct < srv_max_buf_pool_modified_pct)
|
||||
goto unemployed;
|
||||
else if (srv_max_dirty_pages_pct_lwm == 0.0 ||
|
||||
dirty_pct < srv_max_dirty_pages_pct_lwm)
|
||||
goto unemployed;
|
||||
|
||||
const lsn_t oldest_lsn= buf_pool.get_oldest_modified()
|
||||
|
@ -19032,7 +19032,8 @@ static MYSQL_SYSVAR_DOUBLE(max_dirty_pages_pct, srv_max_buf_pool_modified_pct,
|
||||
static MYSQL_SYSVAR_DOUBLE(max_dirty_pages_pct_lwm,
|
||||
srv_max_dirty_pages_pct_lwm,
|
||||
PLUGIN_VAR_RQCMDARG,
|
||||
"Percentage of dirty pages at which flushing kicks in.",
|
||||
"Percentage of dirty pages at which flushing kicks in. "
|
||||
"The value 0 (default) means 'refer to innodb_max_dirty_pages_pct'.",
|
||||
NULL, innodb_max_dirty_pages_pct_lwm_update, 0, 0, 99.999, 0);
|
||||
|
||||
static MYSQL_SYSVAR_DOUBLE(adaptive_flushing_lwm,
|
||||
|
@ -3,7 +3,7 @@
|
||||
Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 2008, 2009, Google Inc.
|
||||
Copyright (c) 2009, Percona Inc.
|
||||
Copyright (c) 2013, 2020, MariaDB Corporation.
|
||||
Copyright (c) 2013, 2021, MariaDB Corporation.
|
||||
|
||||
Portions of this file contain modifications contributed and copyrighted by
|
||||
Google, Inc. Those modifications are gratefully acknowledged and are described
|
||||
@ -373,7 +373,7 @@ extern ulong srv_innodb_stats_method;
|
||||
|
||||
extern ulint srv_max_n_open_files;
|
||||
|
||||
extern double srv_max_dirty_pages_pct;
|
||||
extern double srv_max_buf_pool_modified_pct;
|
||||
extern double srv_max_dirty_pages_pct_lwm;
|
||||
|
||||
extern double srv_adaptive_flushing_lwm;
|
||||
@ -400,10 +400,8 @@ extern my_bool srv_stats_sample_traditional;
|
||||
extern my_bool srv_use_doublewrite_buf;
|
||||
extern ulong srv_checksum_algorithm;
|
||||
|
||||
extern double srv_max_buf_pool_modified_pct;
|
||||
extern my_bool srv_force_primary_key;
|
||||
|
||||
extern double srv_max_buf_pool_modified_pct;
|
||||
extern ulong srv_max_purge_lag;
|
||||
extern ulong srv_max_purge_lag_delay;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user