### 15.8.6 Using Asynchronous I/O on Linux

[]()[]()[]()[]()

`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`](innodb-parameters.html#sysvar_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`](innodb-parameters.html#sysvar_innodb_read_io_threads) and [`innodb_write_io_threads`](innodb-parameters.html#sysvar_innodb_write_io_threads). See [Section 15.8.5, “Configuring the Number of Background InnoDB I/O Threads”](innodb-performance-multiple_io_threads.html).

 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/writes in `SHOW ENGINE INNODB STATUS\G` 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`](innodb-parameters.html#sysvar_innodb_use_native_aio). 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`.

