mysql innodbmaxdirtypagespct_MySQL参数解析innodb_max_dirty_pages_pct
innodb_max_dirty_pages_pct 是 MySQL InnoDB 存儲引擎非常重要的一個參數,用來控制buffer pool中臟頁的百分比,當臟頁數量占比超過這個參數設置的值時,InnoDB會啟動刷臟頁的操作。該參數只控制臟頁百分比,并不會影響刷臟頁的速度。
innodb_max_dirty_pages_pct 參數可以動態調整,最小值為0, 最大值為99.99,默認值為 75。
innodb_max_dirty_pages_pct參數源碼解析
源碼版本:5.7.19
(1)保存臟頁百分比的變量
在InnoDB源碼中,innodb_max_dirty_pages_pct參數值保存在變量srv_max_buf_pool_modified_pct 里面,這是一個全局變量,初始值為 75.0,如下:
double??????srv_max_buf_pool_modified_pct?= 75.0;
(2)刷臟頁的線程
InnoDB刷臟頁主要通過兩類線程來實現,這兩類線程分別是:
buf_flush_page_cleaner_coordinator,協調線程
buf_flush_page_cleaner_worker,工作線程
協調線程中有一個while循環,每1秒執行一次臟頁百分比的檢查,當臟頁百分比超過閾值,觸發事件,喚醒工作線程,執行刷臟頁的操作。
os_event_set(page_cleaner->is_requested);
工作線程中有一個while循環,主要在等待刷臟頁的事件,如果事件被觸發,工作線程就會執行刷臟頁的操作,刷完臟頁之后,繼續等待事件,等待下一次被喚醒。
os_event_wait(page_cleaner->is_requested);
(3)函數調用關系
協調線程通過調用一系列的函數,來獲取臟頁百分比,判斷是否需要刷臟頁,函數調用關系如下:
buf_flush_page_cleaner_coordinator()
page_cleaner_flush_pages_recommendation()
af_get_pct_for_dirty()
(4)af_get_pct_for_dirty()函數的實現
af_get_pct_for_dirty() 函數調用buf_get_modified_ratio_pct()獲取已修改頁的百分比,然后與srv_max_dirty_pages_pct_lwm及srv_max_buf_pool_modified_pct變量進行比較,最終返回一個0~100的值,給上層調用函數,來決定是否需要刷臟頁。af_get_pct_for_dirty()函數具體實現如下:
static
ulint
af_get_pct_for_dirty()
/*==================*/
{
doubledirty_pct = buf_get_modified_ratio_pct();
if (dirty_pct == 0.0) {
/* No pages modified */
return(0);
}
ut_a(srv_max_dirty_pages_pct_lwm
<= srv_max_buf_pool_modified_pct);
if (srv_max_dirty_pages_pct_lwm == 0) {
/* The user has not set the option to preflush dirty
pages as we approach the high water mark. */
if (dirty_pct >= srv_max_buf_pool_modified_pct) {
/* We have crossed the high water mark of dirty
pages In this case we start flushing at 100% of
innodb_io_capacity. */
return(100);
}
} else if (dirty_pct >= srv_max_dirty_pages_pct_lwm) {
/* We should start flushing pages gradually. */
return(static_cast((dirty_pct * 100)
/ (srv_max_buf_pool_modified_pct + 1)));
}
return(0);
}
(5)其他觸發刷臟頁的場景
除了臟頁百分比達到閾值innodb_max_dirty_pages_pct觸發刷臟頁以外,還有很多條件,也會觸發刷臟頁,主要包括:
REDO日志快滿的時候。
為了保證MySQL中的空閑頁面的數量,會從LRU 鏈表尾部淘汰一部分頁面作為空閑頁。如果對應的頁面是臟頁的話,就需要先將頁面刷到磁盤。
MySQL實例正常關閉時候。
總結
以上是生活随笔為你收集整理的mysql innodbmaxdirtypagespct_MySQL参数解析innodb_max_dirty_pages_pct的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux mysql统计次数_MySQ
- 下一篇: 昨天北京啥电影节?