Innodb Double Write函数
在讲如何InnoDB存储引擎是如何解决这个问题以前先介绍如下double write的两个组成部分:性能
1. 一部分是InnoDB内存中的double write buffer,大小为2M;ui
2. 另外一部分是物理磁盘上ibdata系统表空间中大小为2MB,共128个连续的Page,既2个分区。其中120个用于批量写脏,另外8个用于Single Page Flush。作区分的缘由是批量刷脏是后台线程作的,不影响前台线程。而Single page flush是用户线程发起的,须要尽快的刷脏并替换出一个空闲页出来。spa
当一系列机制(main函数触发、checkpoint等)触发数据缓冲池中的脏页进行刷新到data file的时候,并不直接写磁盘,而是会经过memcpy函数将脏页先复制到内存中的double write buffer,以后经过double write buffer再分两次、每次1MB顺序写入共享表空间的物理磁盘上。而后立刻调用fsync函数,同步脏页进磁盘上。因为在这个过程当中,double write页的存储时连续的,所以写入磁盘为顺序写,性能很高;完成double write后,再将脏页写入实际的各个表空间文件,这时写入就是离散的了。各模块协做状况以下图(第一步应为脏页产生的redo记录log buffer,而后log buffer写入redo log file,为简化次要步骤直接连线表示):线程
根据上面所说的,能够简单的用如下的图归纳:3d