14.8.7 在 Linux 上使用异步 I/O

InnoDB使用 Linux 上的异步 I/O 子系统(本机 AIO)对数据文件页面执行预读和写请求。此行为由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_threadsinnodb_write_io_threads控制。参见第 14.8.6 节“配置后台 InnoDB I/O 线程数”

使用本机 AIO,查询线程将 I/O 请求直接分派到 os,从而消除了后台线程数量所带来的限制。 InnoDB后台线程 awaitI/O 事件发出已完成的请求 signal。请求完成后,后台线程将调用 I/O 完成例程,并 continueawaitI/O 事件。

本机 AIO 的优点是对 I/O 密集型系统的可伸缩性,这些系统通常在SHOW ENGINE INNODB STATUS\G输出中显示许多挂起的读/写操作。使用本机 AIO 时并行处理的增加意味着 I/O 调度程序的类型或磁盘阵列控制器的属性对 I/O 性能的影响更大。

对于 A/O 密集型系统而言,本机 AIO 的潜在缺点是无法立即控制分配给 os 的 I/O 写请求的数量。在某些情况下,根据 I/O 活动和系统功能的数量,调度到 os 进行并行处理的 I/O 写入请求太多,可能会导致 I/O 读取不足。

如果 os 中的异步 I/O 子系统出现问题而无法启动InnoDB,则可以使用innodb_use_native_aio=0启动服务器。如果InnoDB检测到潜在问题,例如tmpdir位置,tmpfs文件系统和不支持tmpfs上的异步 I/O 的 Linux 内核的组合,此选项也可能在启动期间自动禁用。