1,参数解释:innodb_flush_method这个参数控制着innodb数据文件及redo log的打开、刷写模式;
对于这个参数,文档上是这样描述的:有三个值:fdatasync(默认),O_DSYNC,O_DIRECT
2, 3种模式也数据工作方式:
3,结论:
(1) 在类unix操作系统中,文件的打开方式为O_DIRECT会最小化缓冲对io的影响,该文件的io是直接在用户空间的buffer上操作的,并且io操作是同步的,因此不管是read()系统调用还是write()系统调用,数据都保证是从磁盘上读取的;所以IO方面压力最小,对于CPU处理压力上也最小,对物理内存的占用也最小;但是由于没有操作系统缓冲的作用,对于数据写入磁盘的速度会降低明显(表现为写入响应时间的拉长),但不会明显造成整体SQL请求量的降低(这有赖于足够大的innodb_buffer_pool_size)。
(2) O_DSYNC方式表示以同步io的方式打开文件,任何写操作都将阻塞到数据写入物理磁盘后才返回。这就造成CPU等待加长,SQL请求吞吐能力降低,insert时间拉长。
(3) fsync(int filedes)函数只对由文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束,然后返回。fdatasync(int filedes)函数类似于fsync,但它只影响文件的数据部分。而除数据外,fsync还会同步更新文件的元信息到磁盘。
默认datasync模式,整体表现较好,因为充分利用了操作系统buffer和innodb_buffer_pool的处理性能,但带来的负面效果是free内存降低过快,最后导致页交换频繁,磁盘IO压力大,这会严重影响大并发量数据写入的稳定性。也就是说拥有了高性能,但不会有高稳定性。为了解决这个问题,可以有个折中的办法,定时的对操作系统进行echo 3 >/proc/sys/vm/drop_caches,清理一下OS缓存,可以及时回收一部分内存(回收顺间对性能会有所影响)。
O_DIRECT模式网上一些评论认为是性能最好的,但本次测试的结果来看,性能并不是很高,但是稳定性确实比较高,在大并发量读写操作中,能够较长时间运行,只是在第一次启动系统后测试,该模式一开始的响应时间确实比较长,到后面才恢复到较低
作者:严国华
链接:https://www.jianshu.com/p/0bc2d8f4bba1