### 15.8.6 在 Linux 上使用异步 I/O

[](<>)[](<>)[](<>)[](<>)

`InnoDB`使用 Linux 上的异​​步 I/O 子系统（原生 AIO）来执行数据文件页面的预读和写请求。这种行为是由控制[`innodb_use_native_aio`](innodb-parameters.html#sysvar_innodb_use_native_aio)配置选项，仅适用于 Linux 系统，默认开启。在其他类 Unix 系统上，`InnoDB`仅使用同步 I/O。从历史上看，`InnoDB`仅在 Windows 系统上使用异步 I/O。在 Linux 上使用异步 I/O 子系统需要`libaio`图书馆。

使用同步 I/O，查询线程对 I/O 请求进行排队，并且`InnoDB`后台线程一次检索一个排队的请求，为每个请求发出一个同步 I/O 调用。当一个 I/O 请求完成并且 I/O 调用返回时，`InnoDB`处理请求的后台线程调用 I/O 完成例程并返回以处理下一个请求。可以并行处理的请求数为*`n`*， 在哪里*`n`*是数量`InnoDB`后台线程。的数量`InnoDB`后台线程由[`innodb_read_io_threads`](innodb-parameters.html#sysvar_innodb_read_io_threads)和[`innodb_write_io_threads`](innodb-parameters.html#sysvar_innodb_write_io_threads).看[第 15.8.5 节，“配置后台 InnoDB I/O 线程的数量”](innodb-performance-multiple_io_threads.html).

使用本机 AIO，查询线程将 I/O 请求直接分派给操作系统，从而消除了后台线程数量的限制。`InnoDB`后台线程等待 I/O 事件以发出完成请求的信号。当请求完成时，后台线程调用 I/O 完成例程并继续等待 I/O 事件。

本机 AIO 的优势是可扩展性强的 I/O 密集型系统，这些系统通常显示许多挂起的读/写`显示引擎 INNODB 状态\G`输出。使用本机 AIO 时并行处理的增加意味着 I/O 调度程序的类型或磁盘阵列控制器的属性对 I/O 性能的影响更大。

对于 I/O 密集型系统而言，本机 AIO 的一个潜在缺点是无法控制一次分派到操作系统的 I/O 写入请求的数量。在某些情况下，分派到操作系统进行并行处理的 I/O 写入请求过多可能会导致 I/O 读取不足，具体取决于 I/O 活动的数量和系统功能。

如果操作系统中的异步 I/O 子系统出现问题阻止`InnoDB`从开始，您可以启动服务器[`innodb_use_native_aio=0`](innodb-parameters.html#sysvar_innodb_use_native_aio).此选项也可能在启动期间自动禁用，如果`InnoDB`检测潜在问题，例如`临时目录`地点，`tmpfs`文件系统和不支持异步 I/O 的 Linux 内核`tmpfs`.
