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
控制。参见 第 17.8.5 节,“配置后台 InnoDB I/O 线程数”。
使用原生 AIO,查询线程会直接将 I/O 请求分派到操作系统,从而消除了后台线程数量限制。InnoDB
后台线程会等待 I/O 事件以发出完成请求的信号。当请求完成时,后台线程会调用 I/O 完成例程并恢复等待 I/O 事件。
原生 AIO 的优势是,对于通常在 SHOW ENGINE INNODB STATUS
输出中显示许多待处理读和写的 I/O 密集型系统来说,可扩展性更高。使用原生 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
检测到潜在问题,例如 tmpdir
位置、tmpfs
文件系统以及不支持 tmpfs
上的异步 I/O 的 Linux 内核,也可能在启动时自动禁用此选项。