innodb_flush_method - xiaoboluo768/qianjinliangfang GitHub Wiki

  • 控制着innodb数据文件及redo log的打开、刷写模式
    • 类unix系统下常用值有O_DIRECT、fsync、O_DSYNC,不常用的值有littlesync、nosync、O_DIRECT_NO_FSYNC(littlesync、nosync这两个值用于内部性能测试,如果使用个人承担风险,O_DIRECT_NO_FSYNC可以使用,但不适合XFS文件系统),默认为fsync。
      • fsync:默认为Null,为null时默认使用fsync(在MySQL 5.1.24之前,该参数默认选项为fdatasync,Innodb使用fsync()系统调用来刷新数据和日志文件。为了避免将该参数的fdatasync选项名称与fdatasync()系统调用混淆,在MySQL 5.1.24中,fdatasync选项名被更改为fsync,使之与实际调用的fsync()系统调用匹配),InnoDB使用fsync()系统调用刷新数据和日志文件(数据和日志文件在write这一步并不需要真正写到磁盘才算完成,可能写入到操作系统buffer中就会返回完成),真正完成是flush操作,buffer交给操作系统去flush,并且文件的元数据信息也都需要更新到磁盘。要注意:fsync会使用os cache(文件系统缓存)来刷新数据文件,增大了内存开销。
      • O_DSYNC:为O_DSYNC时,写日志操作是在write这步就算完成,而数据文件的写入是在flush这步通过fsync系统调用时完成(InnoDB使用O_SYNC打开和刷新日志文件,使用fsync()刷新数据文件。 InnoDB不直接使用O_DSYNC,因为它在Unix上出现了许多各种各样的问题)
      • O_DIRECT:innodb打开数据文件时使用O_DIRECT选项(open调用带上O_DIRECT选项),此时数据文件的写入操作是直接从mysql innodb buffer到磁盘的,并不用通过操作系统的缓冲,但对于innodb来说,数据文件的写入操作真正的完成也是在flush这步(需要在调用fsync系统函数完成之后),但是日志文件的写入还是要经过OS缓冲(此选项在某些GNU/Linux版本,FreeBSD和Solaris上可用)。要注意:O_DIRECT表示数据文件的读写直接跳过文件系统缓存。如果磁盘设备是本地闪存设备或者带CACHE的RAID卡,那么设置该参数可以减少buffer pool和os cache双倍内存开销。但如果不具备这个条件,可能导致数据库性能很差(O_DIRECT对大量随即读写有效率提升,顺序读写则会下降)
      • O_DIRECT_NO_FSYNC:InnoDB在刷新I/O期间使用O_DIRECT,但之后跳过fsync()系统调用。此设置只适用于某些类型的文件系统。例如,它不适合XFS。如果不确定您使用的文件系统是否需要fsync(因为O_DIRECT_NO_FSYNC会跳过fsync系统调用),但你又需要保留所有文件元数据时,请改用O_DIRECT
    • WIN系统中,5.6.x中常用的值有且只有一个async_unbuffered(也有normal和unbuffered两个值,但是在5.6.x版本中还是内部测试功能,使用需要个人承担风险),5.7.x版本中normal和unbuffered值的描述中把测试功能,个人承担风险的字眼去掉了,看样子是可以使用了。如果设置为NULL,则默认使用async_unbuffered选项
      • async_unbuffered:InnoDB使用Windows异步I/O和非缓冲I/O。 async_unbuffered是Windows系统上的默认设置
      • normal:InnoDB使用模拟异步I/O和缓冲I/O
      • unbuffered:InnoDB使用模拟异步I/O和非缓冲I/O
    • 全局变量,只读变量,string类型,unix版本默认值为null(null时默认使用fsync),win版本默认值为null(null时默认使用async_unbuffered)
    • PS:

上一篇:innodb_io_capacity | 下一篇:innodb_file_format