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_threads和innodb_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 内核的组合,此选项也可能在启动期间自动禁用。