中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL中Innodb page clean線程基礎知識有哪些

發布時間:2021-11-10 13:49:38 來源:億速云 閱讀:278 作者:iii 欄目:MySQL數據庫

這篇文章主要介紹“MySQL中Innodb page clean線程基礎知識有哪些”,在日常操作中,相信很多人在MySQL中Innodb page clean線程基礎知識有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL中Innodb page clean線程基礎知識有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、page clean線程概念

Innodb中page clean線程將臟數據寫入到磁盤,臟數據寫盤后相應的redo就可以覆蓋,然后達到redo循環使用的目的。在5.7中參數可以開啟多個page clean線程服務于多個innodb buffer實例如下:

The innodb_page_cleaners default value was
changed from 1 to 4 in MySQL 5.7. If the number of page cleaner threads exceeds the numberof buffer pool instances, innodb_page_cleaners is automatically set to the same value asinnodb_buffer_pool_instances.

實際上在內部實現中如果page clean線程為4個那么包含一個協調工作線程和三個工作線程,這個協調工作線程也要完成一部分工作。在MySQL中我們可以通過語句查看到這些工作線程:

|     17 |        57982 | innodb/page_cleaner_thread      |    NULL | BACKGROUND | NULL   | NULL         ||     18 |        57983 | innodb/page_cleaner_thread      |    NULL | BACKGROUND | NULL   | NULL         ||     19 |        57984 | innodb/page_cleaner_thread      |    NULL | BACKGROUND | NULL   | NULL         ||     20 |        57985 | innodb/page_cleaner_thread      |    NULL | BACKGROUND | NULL   | NULL         |

實際上在我淺析分析中發現,所有的工作線程都是不斷輪序每一個和buffer instance對應的槽(slot),直到所有的buffer instance都已經進行了刷臟工作為止,并沒有固定那個工作線程服務于那個buffer instance實例。

二、刷新方式

總的來說page clean線程刷新的方式分為三種如下:

1、 活躍刷新

一般來講我們線上的數據庫一般都處于活躍狀態,只要有DML/DDL等用到語句都會處于活躍狀態,但是SELECT不包含在活躍狀態下。這種狀態下刷新會開啟一個協調工作線程和多個工作線程同時工作,這種狀態其刷新的塊數算法為(page_cleaner_flush_pages_recommendation函數):

  • (根據參數計算出來的頁數量 +以往每秒刷新頁的數量+根據target lsn 計算出來的一個需要刷新的塊數)/3

實際上這里需要關注的就是(根據參數計算出來的頁數量),算法大概如下(af_get_pct_for_dirty函數):

如果innodb_max_dirty_pages_pct_lwm沒有開:
       如果臟數據比率大于等于innodb_max_dirty_pages_pct的設置:
                則返回100%
如果innodb_max_dirty_pages_pct_lwm開啟:
        如果臟數據比率大于等于innodb_max_dirty_pages_pct_lwm:
                  則返回(臟數據比率*100)/(innodb_max_dirty_pages_pct+1)這樣一個百分比

我們計上面的百分比為A,除了百分比A還和innodb_adaptive_flushing、innodb_adaptive_flushing_lwm計算出來的百分比有關,我們記做B(af_get_pct_for_lsn函數計算),但是由于參數innodb_cleaner_lsn_age_factor默認設置為high_checkpoint,所以這個百分比比較小,具體算法見后文,其最后取值

  • 根據參數計算出來的頁數量 = MAX(A,B)*innodb_io_capacity

2、空閑刷新

一般情況下除了活躍刷新就是空閑刷新,空閑的情況下因為服務器IO應該比較空閑,所以Innodb使用協調工作線程本身進行刷新,刷新的塊數計算比較簡單就是innodb_io_capacity設置的值。

3、 同步刷新

同步刷新則是堵塞刷新,所有需要寫臟數據庫的用戶線程都會堵塞,這是很嚴重的情況。在checkpoint的時候
會檢查或者DML語句執行過程中都會檢查redo是否處于一個安全的位置,這是調用log_free_check函數進行,如果認為臟的塊數太多,redo已經處于不安全的位置(log_checkpoint_margin),那么同步刷新會被喚醒。

關于這部分在源碼部分還會提到。

三、關于一個警告

警告如下:

page_cleaner: 1000ms  intended loop took **ms. The settings might not be optimal.((flushed="**" , during the time.)

實際上這個警告來自于兩次刷新時間的檢測:

  • 本次刷新時間 - 上次刷新時間 > 1秒(睡眠時間)+3秒 則報警告

這個警告一般是IO能力不足,或者參數不夠優化的結果,有了上面的基礎我們知道這里應該做如下操作:

  • innodb_io_capacity 應該降低

  • innodb_max_dirty_pages_pct 應該降低

  • innodb_max_dirty_pages_pct_lwm 如果設置了應該考慮降低


    • innodb_io_capacity_max 考慮降低涉及到上面說的百分比B的計算(af_get_pct_for_lsn函數)

降低的目的在于減少每次刷新的量,讓每次刷新塊數更加平均。從而避免page clean 線程爆發性的刷新臟數據庫,從而堵塞IO通道。如果慢慢調整后還是不行則考慮IO確實扛不住了。

到此,關于“MySQL中Innodb page clean線程基礎知識有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昆明市| 临潭县| 万荣县| 通榆县| 临城县| 乌苏市| 东乡县| 台安县| 突泉县| 曲周县| 建瓯市| 金昌市| 峡江县| 黄大仙区| 卓尼县| 调兵山市| 电白县| 阆中市| 新竹市| 五指山市| 抚顺市| 敖汉旗| 阿巴嘎旗| 竹山县| 通江县| 保德县| 大方县| 宜宾市| 栾川县| 康保县| 昌都县| 枣阳市| 玛沁县| 博罗县| 佛学| 平乐县| 天台县| 新绛县| 石林| 安福县| 隆昌县|