MDEV-28111 Redo log writes are being buffered on Linux for no good reason
In commit 685d958e38b825ad9829be311f26729cccf37c46 (MDEV-14425) we ended up not enabling O_DIRECT writes on the redo log by default, because back then, it was slightly slower on some systems. With commit a635c40648519fd6c3729c9657872a16a0a20821 (MDEV-27774) the situation changed. A new test on a NVMe device shows 9% improvement in throughput and over 15% reduction of latency when O_DIRECT writes are enabled. With this change, all the following settings will use O_DIRECT on InnoDB data and log files: innodb_flush_method=O_DIRECT innodb_flush_method=O_DIRECT_NO_FSYNC innodb_flush_method=O_DSYNC Before MDEV-14425, log writes were always buffered on Linux. Between MDEV-14425 and this change, unbuffered log writes were only enabled for innodb_flush_method=O_DSYNC.
This commit is contained in:
parent
86820837cb
commit
c4c8830709
@ -1290,13 +1290,13 @@ os_file_create_func(
|
||||
|
||||
#if (defined(UNIV_SOLARIS) && defined(DIRECTIO_ON)) || defined O_DIRECT
|
||||
if (type == OS_DATA_FILE) {
|
||||
# ifdef __linux__
|
||||
use_o_direct:
|
||||
# endif
|
||||
switch (srv_file_flush_method) {
|
||||
case SRV_O_DSYNC:
|
||||
case SRV_O_DIRECT:
|
||||
case SRV_O_DIRECT_NO_FSYNC:
|
||||
# ifdef __linux__
|
||||
use_o_direct:
|
||||
# endif
|
||||
os_file_set_nocache(file, name, mode_str);
|
||||
break;
|
||||
default:
|
||||
@ -1349,9 +1349,7 @@ use_o_direct:
|
||||
goto skip_o_direct;
|
||||
}
|
||||
log_sys.set_block_size(uint32_t(s));
|
||||
if (srv_file_flush_method == SRV_O_DSYNC) {
|
||||
goto use_o_direct;
|
||||
}
|
||||
goto use_o_direct;
|
||||
} else {
|
||||
skip_o_direct:
|
||||
log_sys.set_block_size(0);
|
||||
|
Loading…
x
Reference in New Issue
Block a user