这篇文章很短,但很有价值~
MySQL下InnoDB存储引擎有个innodb_flush_method只读参数,用户设置InnoDB的数据和redo日志文件flush行为。defines the method used to flush data toInnoDBdata files and log files, which can affect I/O throughput.
这是一个对性能和数据可靠性有较大影响的参数,在此拿出之前测试的一张性能对比图:
可以看到,该参数从fsync到O_DIRECT再到O_DIRECT_NO_FSYNC,性能分别有明显的提升。一般在Linux下,我们会将该参数设置为O_DIRECT,即数据文件IO走direct_io模式,redo日志文件走系统缓存(linux page cache)模式,在IO完成后均使用fsync()进行持久化。不过redo日志是否调用fsync()还依赖innodb_flush_log_at_trx_commit参数。O_DIRECTor4:InnoDBusesO_DIRECT(ordirectio()on Solaris) to open the data files, and usesfsync()to flush both the data and log files.
而O_DIRECT_NO_FSYNC选项的意思是,使用O_DIRECT完成IO后,不调用fsync()刷盘。
这里简单说下,为什么采用direct_io模式绕过page cache直接写磁盘文件,还需要调用fsync()刷盘,原因就是还存在文件系统元数据缓存,包括vfs中的inode cache和dentry cache等,以及具体文件系统元数据,如对于ext4还包括inode block bitma