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_readio线程和InnoDB_writeio线程控制。
使用本机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。