Commit f24b7383 authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-24313 (2 of 2): Silently ignored innodb_use_native_aio=1

In commit 5e62b6a5 (MDEV-16264)
the logic of os_aio_init() was changed so that it will never fail,
but instead automatically disable innodb_use_native_aio (which is
enabled by default) if the io_setup() system call would fail due
to resource limits being exceeded. This is questionable, especially
because falling back to simulated AIO may lead to significantly
reduced performance.

srv_n_file_io_threads, srv_n_read_io_threads, srv_n_write_io_threads:
Change the data type from ulong to uint.

os_aio_init(): Remove the parameters, and actually return an error code.

thread_pool::configure_aio(): Do not silently fall back to simulated AIO.

Reviewed by: Vladislav Vaintroub
parent 17d3f856
...@@ -2128,9 +2128,9 @@ static bool innodb_init_param() ...@@ -2128,9 +2128,9 @@ static bool innodb_init_param()
srv_buf_pool_size = (ulint) xtrabackup_use_memory; srv_buf_pool_size = (ulint) xtrabackup_use_memory;
srv_buf_pool_chunk_unit = (ulong)srv_buf_pool_size; srv_buf_pool_chunk_unit = (ulong)srv_buf_pool_size;
srv_n_file_io_threads = (ulint) innobase_file_io_threads; srv_n_file_io_threads = (uint) innobase_file_io_threads;
srv_n_read_io_threads = innobase_read_io_threads; srv_n_read_io_threads = (uint) innobase_read_io_threads;
srv_n_write_io_threads = innobase_write_io_threads; srv_n_write_io_threads = (uint) innobase_write_io_threads;
srv_max_n_open_files = ULINT_UNDEFINED - 5; srv_max_n_open_files = ULINT_UNDEFINED - 5;
...@@ -4273,8 +4273,10 @@ static bool xtrabackup_backup_func() ...@@ -4273,8 +4273,10 @@ static bool xtrabackup_backup_func()
xb_fil_io_init(); xb_fil_io_init();
srv_n_file_io_threads = srv_n_read_io_threads; srv_n_file_io_threads = srv_n_read_io_threads;
os_aio_init(srv_n_read_io_threads, srv_n_write_io_threads, if (os_aio_init()) {
SRV_MAX_N_PENDING_SYNC_IOS); msg("Error: cannot initialize AIO subsystem");
goto fail;
}
log_sys.create(); log_sys.create();
log_sys.log.create(); log_sys.log.create();
......
...@@ -371,15 +371,6 @@ ...@@ -371,15 +371,6 @@
VARIABLE_COMMENT Number of pages that must be accessed sequentially for InnoDB to trigger a readahead. VARIABLE_COMMENT Number of pages that must be accessed sequentially for InnoDB to trigger a readahead.
NUMERIC_MIN_VALUE 0 NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 64 NUMERIC_MAX_VALUE 64
@@ -1609,7 +1609,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 4
VARIABLE_SCOPE GLOBAL
-VARIABLE_TYPE BIGINT UNSIGNED
+VARIABLE_TYPE INT UNSIGNED
VARIABLE_COMMENT Number of background read I/O threads in InnoDB.
NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 64
@@ -1705,7 +1705,7 @@ @@ -1705,7 +1705,7 @@
SESSION_VALUE NULL SESSION_VALUE NULL
DEFAULT_VALUE 1048576 DEFAULT_VALUE 1048576
...@@ -429,12 +420,3 @@ ...@@ -429,12 +420,3 @@
VARIABLE_COMMENT Number of undo tablespaces to use. VARIABLE_COMMENT Number of undo tablespaces to use.
NUMERIC_MIN_VALUE 0 NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 127 NUMERIC_MAX_VALUE 127
@@ -2053,7 +2053,7 @@
SESSION_VALUE NULL
DEFAULT_VALUE 4
VARIABLE_SCOPE GLOBAL
-VARIABLE_TYPE BIGINT UNSIGNED
+VARIABLE_TYPE INT UNSIGNED
VARIABLE_COMMENT Number of background write I/O threads in InnoDB.
NUMERIC_MIN_VALUE 2
NUMERIC_MAX_VALUE 64
...@@ -1621,7 +1621,7 @@ VARIABLE_NAME INNODB_READ_IO_THREADS ...@@ -1621,7 +1621,7 @@ VARIABLE_NAME INNODB_READ_IO_THREADS
SESSION_VALUE NULL SESSION_VALUE NULL
DEFAULT_VALUE 4 DEFAULT_VALUE 4
VARIABLE_SCOPE GLOBAL VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_TYPE INT UNSIGNED
VARIABLE_COMMENT Number of background read I/O threads in InnoDB. VARIABLE_COMMENT Number of background read I/O threads in InnoDB.
NUMERIC_MIN_VALUE 1 NUMERIC_MIN_VALUE 1
NUMERIC_MAX_VALUE 64 NUMERIC_MAX_VALUE 64
...@@ -2065,7 +2065,7 @@ VARIABLE_NAME INNODB_WRITE_IO_THREADS ...@@ -2065,7 +2065,7 @@ VARIABLE_NAME INNODB_WRITE_IO_THREADS
SESSION_VALUE NULL SESSION_VALUE NULL
DEFAULT_VALUE 4 DEFAULT_VALUE 4
VARIABLE_SCOPE GLOBAL VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_TYPE INT UNSIGNED
VARIABLE_COMMENT Number of background write I/O threads in InnoDB. VARIABLE_COMMENT Number of background write I/O threads in InnoDB.
NUMERIC_MIN_VALUE 2 NUMERIC_MIN_VALUE 2
NUMERIC_MAX_VALUE 64 NUMERIC_MAX_VALUE 64
......
...@@ -3756,9 +3756,6 @@ static int innodb_init_params() ...@@ -3756,9 +3756,6 @@ static int innodb_init_params()
} }
#ifdef LINUX_NATIVE_AIO #ifdef LINUX_NATIVE_AIO
if (srv_use_native_aio) {
ib::info() << "Using Linux native AIO";
}
#elif !defined _WIN32 #elif !defined _WIN32
/* Currently native AIO is supported only on windows and linux /* Currently native AIO is supported only on windows and linux
and that also when the support is compiled in. In all other and that also when the support is compiled in. In all other
...@@ -19431,12 +19428,12 @@ static MYSQL_SYSVAR_BOOL(optimize_fulltext_only, innodb_optimize_fulltext_only, ...@@ -19431,12 +19428,12 @@ static MYSQL_SYSVAR_BOOL(optimize_fulltext_only, innodb_optimize_fulltext_only,
"Only optimize the Fulltext index of the table", "Only optimize the Fulltext index of the table",
NULL, NULL, FALSE); NULL, NULL, FALSE);
static MYSQL_SYSVAR_ULONG(read_io_threads, srv_n_read_io_threads, static MYSQL_SYSVAR_UINT(read_io_threads, srv_n_read_io_threads,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
"Number of background read I/O threads in InnoDB.", "Number of background read I/O threads in InnoDB.",
NULL, NULL, 4, 1, 64, 0); NULL, NULL, 4, 1, 64, 0);
static MYSQL_SYSVAR_ULONG(write_io_threads, srv_n_write_io_threads, static MYSQL_SYSVAR_UINT(write_io_threads, srv_n_write_io_threads,
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
"Number of background write I/O threads in InnoDB.", "Number of background write I/O threads in InnoDB.",
NULL, NULL, 4, 2, 64, 0); NULL, NULL, 4, 2, 64, 0);
......
...@@ -1135,21 +1135,9 @@ void ...@@ -1135,21 +1135,9 @@ void
unit_test_os_file_get_parent_dir(); unit_test_os_file_get_parent_dir();
#endif /* UNIV_ENABLE_UNIT_TEST_GET_PARENT_DIR */ #endif /* UNIV_ENABLE_UNIT_TEST_GET_PARENT_DIR */
/** Initializes the asynchronous io system. Creates one array each for ibuf /**
and log i/o. Also creates one array each for read and write where each Initializes the asynchronous io system. */
array is divided logically into n_read_segs and n_write_segs int os_aio_init();
respectively. The caller must create an i/o handler thread for each
segment in these arrays. This function also creates the sync array.
No i/o handler thread needs to be created for that
@param[in] n_read_segs number of reader threads
@param[in] n_write_segs number of writer threads
@param[in] n_slots_sync number of slots in the sync aio array */
bool
os_aio_init(
ulint n_read_segs,
ulint n_write_segs,
ulint n_slots_sync);
/** /**
Frees the asynchronous io system. */ Frees the asynchronous io system. */
......
...@@ -337,11 +337,11 @@ extern ulong srv_buf_pool_load_pages_abort; ...@@ -337,11 +337,11 @@ extern ulong srv_buf_pool_load_pages_abort;
/** Lock table size in bytes */ /** Lock table size in bytes */
extern ulint srv_lock_table_size; extern ulint srv_lock_table_size;
extern ulint srv_n_file_io_threads; extern uint srv_n_file_io_threads;
extern my_bool srv_random_read_ahead; extern my_bool srv_random_read_ahead;
extern ulong srv_read_ahead_threshold; extern ulong srv_read_ahead_threshold;
extern ulong srv_n_read_io_threads; extern uint srv_n_read_io_threads;
extern ulong srv_n_write_io_threads; extern uint srv_n_write_io_threads;
/* Defragmentation, Origianlly facebook default value is 100, but it's too high */ /* Defragmentation, Origianlly facebook default value is 100, but it's too high */
#define SRV_DEFRAGMENT_FREQUENCY_DEFAULT 40 #define SRV_DEFRAGMENT_FREQUENCY_DEFAULT 40
......
...@@ -3887,7 +3887,6 @@ versions where native aio is supported it won't work on tmpfs. In such ...@@ -3887,7 +3887,6 @@ versions where native aio is supported it won't work on tmpfs. In such
cases we can't use native aio. cases we can't use native aio.
@return: true if supported, false otherwise. */ @return: true if supported, false otherwise. */
#include <libaio.h>
static bool is_linux_native_aio_supported() static bool is_linux_native_aio_supported()
{ {
File fd; File fd;
...@@ -4009,34 +4008,40 @@ static bool is_linux_native_aio_supported() ...@@ -4009,34 +4008,40 @@ static bool is_linux_native_aio_supported()
} }
#endif #endif
int os_aio_init()
bool os_aio_init(ulint n_reader_threads, ulint n_writer_threads, ulint)
{ {
int max_write_events= int(n_writer_threads * OS_AIO_N_PENDING_IOS_PER_THREAD); int max_write_events= int(srv_n_write_io_threads) *
int max_read_events= int(n_reader_threads * OS_AIO_N_PENDING_IOS_PER_THREAD); OS_AIO_N_PENDING_IOS_PER_THREAD;
int max_events = max_read_events + max_write_events; int max_read_events= int(srv_n_read_io_threads) *
int ret; OS_AIO_N_PENDING_IOS_PER_THREAD;
int max_events= max_read_events + max_write_events;
int ret;
#if LINUX_NATIVE_AIO #if LINUX_NATIVE_AIO
if (srv_use_native_aio && !is_linux_native_aio_supported()) if (srv_use_native_aio && !is_linux_native_aio_supported())
srv_use_native_aio = false; goto disable;
#endif #endif
ret = srv_thread_pool->configure_aio(srv_use_native_aio, max_events);
if(ret) { ret= srv_thread_pool->configure_aio(srv_use_native_aio, max_events);
ut_a(srv_use_native_aio);
srv_use_native_aio = false;
#ifdef LINUX_NATIVE_AIO #ifdef LINUX_NATIVE_AIO
ib::info() << "Linux native AIO disabled"; if (ret)
{
ut_ad(srv_use_native_aio);
disable:
ib::warn() << "Linux Native AIO disabled.";
ret= srv_thread_pool->configure_aio(srv_use_native_aio= false, max_events);
}
#endif #endif
ret = srv_thread_pool->configure_aio(srv_use_native_aio, max_events);
DBUG_ASSERT(!ret); if (!ret)
} {
read_slots = new io_slots(max_read_events, (uint)n_reader_threads); read_slots= new io_slots(max_read_events, srv_n_read_io_threads);
write_slots = new io_slots(max_write_events, (uint)n_writer_threads); write_slots= new io_slots(max_write_events, srv_n_write_io_threads);
return true; }
return ret;
} }
void os_aio_free() void os_aio_free()
{ {
srv_thread_pool->disable_aio(); srv_thread_pool->disable_aio();
...@@ -4154,8 +4159,8 @@ os_aio_print(FILE* file) ...@@ -4154,8 +4159,8 @@ os_aio_print(FILE* file)
time_t current_time; time_t current_time;
double time_elapsed; double time_elapsed;
for (ulint i = 0; i < srv_n_file_io_threads; ++i) { for (uint i = 0; i < srv_n_file_io_threads; ++i) {
fprintf(file, "I/O thread " ULINTPF " state: %s (%s)", fprintf(file, "I/O thread %u state: %s (%s)",
i, i,
srv_io_thread_op_info[i], srv_io_thread_op_info[i],
srv_io_thread_function[i]); srv_io_thread_function[i]);
......
...@@ -228,9 +228,9 @@ ulint srv_lock_table_size = ULINT_MAX; ...@@ -228,9 +228,9 @@ ulint srv_lock_table_size = ULINT_MAX;
ulong srv_idle_flush_pct; ulong srv_idle_flush_pct;
/** innodb_read_io_threads */ /** innodb_read_io_threads */
ulong srv_n_read_io_threads; uint srv_n_read_io_threads;
/** innodb_write_io_threads */ /** innodb_write_io_threads */
ulong srv_n_write_io_threads; uint srv_n_write_io_threads;
/** innodb_random_read_ahead */ /** innodb_random_read_ahead */
my_bool srv_random_read_ahead; my_bool srv_random_read_ahead;
......
...@@ -111,7 +111,7 @@ lsn_t srv_shutdown_lsn; ...@@ -111,7 +111,7 @@ lsn_t srv_shutdown_lsn;
ibool srv_start_raw_disk_in_use; ibool srv_start_raw_disk_in_use;
/** Number of IO threads to use */ /** Number of IO threads to use */
ulint srv_n_file_io_threads; uint srv_n_file_io_threads;
/** UNDO tablespaces starts with space id. */ /** UNDO tablespaces starts with space id. */
ulint srv_undo_space_id_start; ulint srv_undo_space_id_start;
...@@ -1192,9 +1192,7 @@ dberr_t srv_start(bool create_new_db) ...@@ -1192,9 +1192,7 @@ dberr_t srv_start(bool create_new_db)
return(srv_init_abort(err)); return(srv_init_abort(err));
} }
srv_n_file_io_threads = srv_n_read_io_threads; srv_n_file_io_threads = srv_n_read_io_threads + srv_n_write_io_threads;
srv_n_file_io_threads += srv_n_write_io_threads;
if (!srv_read_only_mode) { if (!srv_read_only_mode) {
/* Add the log and ibuf IO threads. */ /* Add the log and ibuf IO threads. */
...@@ -1206,15 +1204,18 @@ dberr_t srv_start(bool create_new_db) ...@@ -1206,15 +1204,18 @@ dberr_t srv_start(bool create_new_db)
ut_a(srv_n_file_io_threads <= SRV_MAX_N_IO_THREADS); ut_a(srv_n_file_io_threads <= SRV_MAX_N_IO_THREADS);
if (!os_aio_init(srv_n_read_io_threads, if (os_aio_init()) {
srv_n_write_io_threads,
SRV_MAX_N_PENDING_SYNC_IOS)) {
ib::error() << "Cannot initialize AIO sub-system"; ib::error() << "Cannot initialize AIO sub-system";
return(srv_init_abort(DB_ERROR)); return(srv_init_abort(DB_ERROR));
} }
#ifdef LINUX_NATIVE_AIO
if (srv_use_native_aio) {
ib::info() << "Using Linux native AIO";
}
#endif
fil_system.create(srv_file_per_table ? 50000 : 5000); fil_system.create(srv_file_per_table ? 50000 : 5000);
ib::info() << "Initializing buffer pool, total size = " ib::info() << "Initializing buffer pool, total size = "
......
...@@ -220,7 +220,7 @@ class thread_pool ...@@ -220,7 +220,7 @@ class thread_pool
{ {
if (use_native_aio) if (use_native_aio)
m_aio.reset(create_native_aio(max_io)); m_aio.reset(create_native_aio(max_io));
if (!m_aio) else
m_aio.reset(create_simulated_aio(this)); m_aio.reset(create_simulated_aio(this));
return !m_aio ? -1 : 0; return !m_aio ? -1 : 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment