InnoDB Asynchronous I/O

From MariaDB 10.5, InnoDB uses asynchronous I/O to read from and write to disk asynchronously. This forms part of the InnoDB Background Thread Pool.

Stages

Each asynchronous IO operation goes through multiple stages:

  1. SUBMITTED – The IO operation is initiated.

  • For asynchronous writes, this typically occurs in the buffer pool flushing code.

  • For asynchronous reads, this may happen during buffer pool loading at startup or in prefetching logic.

  1. COMPLETED_IN_OS – The operating system notifies InnoDB that the I/O operation is complete.

  • If using libaio or io_uring, a dedicated thread handles this notification.

  • The completed IO operation is then submitted to InnoDB’s internal thread pool (tpool).

  1. EXECUTING_COMPLETION_TASK – A tpool thread processes the completion task for the IO operation.

  2. COMPLETED – The IO operation is fully handled.

Resource Constraints and Queuing Mechanisms

Waiting for IO Slots

The total number of pending asynchronous IO operations is limited by:

total_count = number_of_IO_threads * 256

where number_of_IO_threads refers to either innodb_io_read_threads or innodb_io_write_threads.

Each IO operation is associated with an IO slot, which contains necessary metadata such as the file handle, operation type, offset, length, and any OS error codes. Initially, all total_count slots are free, but as pending IO requests accumulate, slots get occupied. If all slots are in use, additional IO requests must wait for a free slot.

Queuing Mechanism

The number of completion tasks (EXECUTING_COMPLETION_TASK stage) that can run in parallel is also limited by innodb_io_read_threads or innodb_io_write_threads. If too many IO operations complete simultaneously, they cannot all be processed in parallel and must be queued, respecting the thread limit.

Variables

From MariaDB 11.5, a number of status variables were added to give insight into the above operations:

Similar variables exist for write operations:

This page is licensed: CC BY-SA / Gnu FDL

Last updated

Was this helpful?