17.8.6 在 Linux 上使用异步 I/O
InnoDB
在 Linux 系统上使用异步 I/O 子系统(native AIO)来执行读取前置和写入请求以便数据文件页。这个行为由innodb_use_native_aio
配置选项控制,该选项只适用于 Linux 系统,并且默认启用。在其他 Unix-like 系统上,InnoDB
只使用同步 I/O。历史上,InnoDB
只在 Windows 系统上使用异步 I/O。使用 Linux 上的异步 I/O 子系统需要 libaio 库。
在同步I/O中,查询线程队列I/O请求,并且InnoDB
背景线程逐个处理队列中的请求,每个请求都发出一个同步I/O调用。当I/O请求完成并返回时,处理该请求的InnoDB
背景线程将调用I/O完成routine,然后继续处理下一个请求。可以并行处理的请求数量为n
n
是InnoDB
背景线程的数量。InnoDB
背景线程的数量由innodb_read_io_threads
和innodb_write_io_threads
控制。请参阅第17.8.5节,“配置背景InnoDB I/O线程数量”。
在native AIO中,查询线程直接将I/O请求分派给操作系统,从而移除了背景线程数量的限制。InnoDB
背景线程等待I/O事件信号完成请求。当请求完成时,背景线程调用I/O完成routine,然后继续等待I/O事件。
native AIO的优点是,对于通常在SHOW ENGINE INNODB STATUS
输出中显示许多pending reads和writes的高度I/O绑定的系统,能够实现更好的可扩展性。使用native AIO时,增加了并行处理的能力,这意味着I/O调度器类型或磁盘阵列控制器属性对I/O性能的影响更加明显。
对于高度I/O绑定的系统,native AIO 的一个潜在缺点是无法控制同时将I/O写请求发送给操作系统的数量。太多的I/O写请求被并发处理可能会导致I/O读饥饿,取决于I/O活动量和系统能力。
如果操作系统中的异步I/O子系统出现问题,使得InnoDB
无法启动,可以使用innodb_use_native_aio=0
来启动服务器。这选项也可能在启动时被自动禁用,如果InnoDB
检测到潜在问题,例如tmpdir位置、tmpfs文件系统和Linux内核不支持异步I/O的组合。