17.8.6 在 Linux 上使用异步 I/O
InnoDB
uses the asynchronous I/O subsystem (native AIO) on Linux to perform read-ahead and write requests for data file pages. This behavior is controlled by the innodb_use_native_aio
configuration option, which applies to Linux systems only and is enabled by default. On other Unix-like systems, InnoDB
uses synchronous I/O only. Historically, InnoDB
only used asynchronous I/O on Windows systems. Using the asynchronous I/O subsystem on Linux requires the libaio
library.
With synchronous I/O, query threads queue I/O requests, and InnoDB
background threads retrieve the queued requests one at a time, issuing a synchronous I/O call for each. When an I/O request is completed and the I/O call returns, the InnoDB
background thread that is handling the request calls an I/O completion routine and returns to process the next request. The number of requests that can be processed in parallel is n
, where n
is the number of InnoDB
background threads. The number of InnoDB
background threads is controlled by innodb_read_io_threads
and innodb_write_io_threads
. See Section 17.8.5, “Configuring the Number of Background InnoDB I/O Threads”.
With native AIO, query threads dispatch I/O requests directly to the operating system, thereby removing the limit imposed by the number of background threads. InnoDB
background threads wait for I/O events to signal completed requests. When a request is completed, a background thread calls an I/O completion routine and resumes waiting for I/O events.
The advantage of native AIO is scalability for heavily I/O-bound systems that typically show many pending reads and writes in SHOW ENGINE INNODB STATUS
output. The increase in parallel processing when using native AIO means that the type of I/O scheduler or properties of the disk array controller have a greater influence on I/O performance.
A potential disadvantage of native AIO for heavily I/O-bound systems is lack of control over the number of I/O write requests dispatched to the operating system at once. Too many I/O write requests dispatched to the operating system for parallel processing could, in some cases, result in I/O read starvation, depending on the amount of I/O activity and system capabilities.
If a problem with the asynchronous I/O subsystem in the OS prevents InnoDB
from starting, you can start the server with innodb_use_native_aio=0
. This option may also be disabled automatically during startup if InnoDB
detects a potential problem such as a combination of tmpdir
location, tmpfs
file system, and Linux kernel that does not support asynchronous I/O on tmpfs
.