在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
。请参见“配置后台InnoDB I / O线程数”。
使用本机AIO,查询线程将I / O请求直接分派到操作系统,从而消除了后台线程数量所带来的限制。InnoDB
后台线程等待I / O事件以信号通知已完成的请求。请求完成后,后台线程将调用I / O完成例程,并继续等待I / O事件。
本地AIO的优点是对I / O密集型系统的可伸缩性,这些系统通常在SHOW ENGINE INNODB STATUS\G
输出中显示许多挂起的读/写操作。使用本机AIO时并行处理的增加意味着I / O调度程序的类型或磁盘阵列控制器的属性对I / O性能的影响更大。
对于A / O密集型系统而言,本机AIO的潜在缺点是无法立即控制分配给操作系统的I / O写请求的数量。在某些情况下,根据I / O活动和系统功能的数量,调度到操作系统进行并行处理的I / O写入请求太多,可能会导致I / O读取不足。
如果操作系统中的异步I / O子系统出现问题而无法InnoDB
启动,则可以使用启动服务器innodb_use_native_aio=0
。如果InnoDB
检测到潜在问题(例如,tmpdir
位置,tmpfs
文件系统和不支持on上的异步I / O的Linux内核的组合),则在启动期间也可以自动禁用此选项tmpfs
。