本文我们将讨论如何在操作系统级别验证 innodb_flush_method
和 innodb_use_fdatasync
修改为默认值之外的其它值(特别是 O_DIRECT 是最常用的)后的效果。
介绍
首先,让我们定义该 innodb_flush_method
参数的作用。它规定了 InnoDB 如何管理数据刷新到磁盘的行为。文章不会详细说明每个有效值的作用,更多详细介绍请查看参数值文档。
有效值如下(仅限 Unix):
- fsync
- O_DSYNC
- littlesync
- nosync
- O_DIRECT
- O_DIRECT_NO_FSYNC
如前所述,我们将重点关注 O_DIRECT。作为最佳实践的一部分,我们建议选择 O_DIRECT 避免双缓冲,绕过操作系统缓存,从而提高写入数据时的性能。下面是从官方文档中摘录的 InnoDB 架构:
在支持 fdatasync()
的平台上执行系统调用(System calls,以下简称 Syscalls),MySQL 8.0.26 中引入的 innodb_use_fdatasync 变量允许使用 innodb_flush_method 选项来替代。除非后续数据检索需要,否则系统调用不会刷新对文件元数据的更改,从而提供潜在的性能优势。
要操作文件,MySQL 和任何其他软件都必须调用 Syscalls。每当进程需要系统资源时,它都会通过 Syscalls 向内核发送对该资源的请求。从较高层次来看,系统调用是内核向用户应用程序提供的“服务”。它们类似于库 API,被描述为具有名称、参数和返回值的函数调用。下图是此过程的高级说明: