Using Asynchronous I/O on Linux 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  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 15.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/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 . 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 . The  InnoDB  master thread and other threads perform various tasks in the background, most of which are I/O related, such as flushing dirty pages from the buffer pool and writing changes from the change buffer to the appropriate secondary indexes.  InnoDB  attempts to perform these tasks in a way that does not adversely affect the normal working of the server. It tries to estimate the available I/O bandwidth and tune its activities to take advantage of available capacity. The  innodb_io_capacity  variable defines the overall I/O capacity available to  InnoDB . It should be set to approximately the number of I/O operations that the system can perform per second (IOPS). When innodb_io_capacity  is set,  InnoDB  estimates the I/O bandwidth available for background tasks based on the set value. You can set  innodb_io_capacity  to a value of 100 or greater. The default value is  200 . Typically, values around 100 are appropriate for consumer-level storage devices, such as hard drives up to 7200 RPMs. Faster hard drives, RAID configurations, and solid state drives (SSDs) benefit from higher values. Ideally, keep the setting as low as practical, but not so low that background activities fall behind. If the value is too high, data is removed from the buffer pool and change buffer too quickly for caching to provide 15.8.7 Configuring InnoDB I/O Capacity 3126