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