14.12.1 InnoDB 磁盘 I/O

InnoDB在可能的情况下使用异步磁盘 I/O,方法是创建多个线程来处理 I/O 操作,同时允许其他数据库操作在 I/O 仍在进行时 continue 进行。在 Linux 和 Windows 平台上,InnoDB使用可用的 OS 和库函数来执行“本机”异步 I/O。在其他平台上,InnoDB仍使用 I/O 线程,但是这些线程实际上可能会 awaitI/O 请求完成。该技术称为“模拟”异步 I/O。

Read-Ahead

如果InnoDB可以确定很快有可能需要数据,则它执行预读操作以将该数据带入缓冲池,以便在内存中可用。对连续数据发出一些大的读取请求可能比发出几个较小的散布请求更为有效。 InnoDB中有两种预读启发式:

  • 在 Sequences 预读中,如果InnoDB注意到对 table 空间中某个段的访问模式是 Sequences 的,则它会提前将一批数据库页的读操作发布到 I/O 系统。

  • 在随机预读中,如果InnoDB注意到 table 空间中的某些区域似乎正在被完全读入缓冲池,则它将剩余的读操作发布到 I/O 系统。

有关配置预读启发式方法的信息,请参阅第 14.8.3.4 节“配置 InnoDB 缓冲池预取(预读)”

Doublewrite Buffer

InnoDB使用一种新颖的文件刷新技术,该技术涉及名为doublewrite buffer的结构,该结构在大多数情况下(innodb_doublewrite=ON)默认为启用。它增加了崩溃或断电后的恢复安全性,并通过减少对fsync()的操作来提高大多数 Unix 版本的性能。

在将页面写到数据文件之前,InnoDB首先将它们写到称为 doublewrite 缓冲区的连续 table 空间区域中。只有在完成对双写缓冲区的写入和刷新之后,InnoDB才将页面写入数据文件中的相应位置。如果在页面写入过程中出现 os,存储子系统或mysqld进程崩溃(导致torn page条件),则InnoDB稍后可以在恢复期间从 doublewrite 缓冲区中找到该页面的良好副本。

如果系统 table 空间文件(“ ibdata 文件”)位于支持原子写的 Fusion-io 设备上,则会自动禁用双写缓冲,并且将 Fusion-io 原子写用于所有数据文件。由于 doublewrite 缓冲区设置是全局的,因此,对于非 Fusion-io 硬件上驻留的数据文件,也禁用 doublewrite 缓冲。此功能仅在 Fusion-io 硬件上受支持,并且仅在 Linux 上的 Fusion-io NVMFS 中启用。要充分利用此功能,建议将innodb_flush_method设置为O_DIRECT