MySQL:刷臟頁


1. 臟頁,干凈頁 

  當內存數據頁和磁盤數據頁上的內容不一致時,我們稱這個內存頁為臟頁

  內存數據寫入磁盤后,內存頁上的數據和磁盤頁上的數據就一致了,我們稱這個內存頁為干凈頁

2. 刷臟頁的時機

2.1 redo log

  redo  log 是循環寫的,當redo log 寫滿了,即 write pos 追上了  checkpoint 時,此時沒有空間記錄 redo log,就需要將 checkpoint 向前推進,推進的這部分日志對應的臟頁就需要刷入磁盤。

  此時所有的更新全部阻塞,此時寫性能跌為0,必須等待刷一部分臟頁后才能繼續更新,這種情況要盡量避免;

2.2 系統內存

  當系統內存不足時,就需要將一部分數據頁淘汰掉,如果淘汰的是臟頁,就需要先將臟頁刷入磁盤。

  當淘汰的臟頁過多時,會導致查詢的響應時間變長;

2.3 MySQL認為空閑的時間

  不存在性能問題;

2.4 MySQL正常關閉之前,會把內存中所有的臟頁刷入磁盤

  不存在性能問題;

3. 刷臟頁的控制策略

3.1 正確服務器的IO能力

  innodb_io_capacity參數表示機器的磁盤能力,根據機器能力合理設置該參數的值;

3.2 刷臟頁的速度

  InnoDB的刷盤速度主要參考兩個參數:臟頁比例和redo log 的寫盤速度;

  innodb_max_dirty_pages_pct是臟頁比例上限,默認值為75%;

  InnoDB根據當前的臟頁比例算出一個值M1;

  InnoDB每次寫入redo log 有一個序號,根據當前序號和checkpoint之間的差值算出一個值M2;

  之后引擎取M1和M2之間(M1和M2都是0-100之間的數)的較大值除以100乘以innodb_io_capacity,這就是刷臟頁的速度;

3.3 刷臟頁機制

  當一個查詢請求執行過程中需要先flush一個臟頁時,如果臟頁的旁邊也是臟頁,此時引擎會將相鄰的臟頁也刷掉,直到下一個數據頁不是臟頁為止;

  該機制通過參數 innodb_innodb_flush_neighbors 控制,值為0時表示只刷自己,值為1時則有連坐效果;

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM