MySQL 刷髒頁問題

2021-10-01 12:53:46 字數 1808 閱讀 3366

mysql的刷髒頁問題

平時的工作中,不知道你有沒有遇到過這樣的場景,一條 sql 語句,正常執行的時候特別快,但是有時也不知道怎麼回事,它就會變得特別慢,並且這樣的場景很難復現,它不只隨機,而且持續時間還很短。

當記憶體資料頁跟磁碟資料頁內容不一致的時候,我們稱這個記憶體頁為「髒頁」。記憶體資料寫入到磁碟後,記憶體和磁碟上的資料頁的內容就一致了,稱為「乾淨頁」。

平時執行很快的更新操作,其實就是在寫記憶體和日誌,而 mysql 偶爾「抖」一下的那個瞬間,可能就是在刷髒頁(flush)。

那麼,什麼情況會引發資料庫的 flush 過程呢?

第一種場景是innodb 的 redo log 寫滿了,這時候系統會停止所有更新操作,把 checkpoint 往前推進,redo log 留出空間可以繼續寫。

第二種場景對應的就是系統記憶體不足。當需要新的記憶體頁,而記憶體不夠用的時候,就要淘汰一些資料頁,空出記憶體給別的資料頁使用。如果淘汰的是「髒頁」,就要先將髒頁寫到磁碟。

第三種場景對應的就是 mysql 認為系統「空閒」的時候。當然,mysql忙起來可是會很快就能把redo log 記滿的,所以要合理地安排時間,即使是忙的時候,也要見縫插針地找時間,只要有機會就刷一點「髒頁」。

第四種場景對應的就是 mysql 正常關閉的情況。這時候,mysql 會把記憶體的髒頁都 flush 到磁碟上,這樣下次 mysql 啟動的時候,就可以直接從磁碟上讀資料,啟動速度會很快。

接下來,你可以分析一下上面四種場景對效能的影響。

其中,第三種情況是屬於 mysql 空閒時的操作,這時系統沒什麼壓力,而第四種場景是資料庫本來就要關閉了。這兩種情況下,你不會太關注「效能」問題。所以這裡,我們主要來分析一下前兩種場景下的效能問題。

第一種是「redo log 寫滿了,要 flush 髒頁」,這種情況是 innodb 要盡量避免的。因為出現這種情況的時候,整個系統就不能再接受更新了,所有的更新都必須堵住。如果你從監控上看,這時候更新數會跌為 0。

第二種是「記憶體不夠用了,要先將髒頁寫到磁碟」,這種情況其實是常態。innodb 用緩衝池(buffer pool)管理記憶體,緩衝池中的記憶體頁有三種狀態:

innodb 的策略是盡量使用記憶體,因此對於乙個長時間執行的庫來說,未被使用的頁面很少。

而當要讀入的資料頁沒有在記憶體的時候,就必須到緩衝池中申請乙個資料頁。這時候只能把最久不使用的資料頁從記憶體中淘汰掉:如果要淘汰的是乙個乾淨頁,就直接釋放出來復用;但如果是髒頁呢,就必須將髒頁先刷到磁碟,變成乾淨頁後才能復用。

所以,刷髒頁雖然是常態,但是出現以下這兩種情況,都是會明顯影響效能的:

乙個查詢要淘汰的髒頁個數太多,會導致查詢的響應時間明顯變長;

日誌寫滿,更新全部堵住,寫效能跌為 0,這種情況對敏感業務來說,是不能接受的。

所以,innodb 需要有控制髒頁比例的機制,來盡量避免上面的這兩種情況。

innodb 刷髒頁的控制策略

首先,你要正確地告訴 innodb 所在主機的 io 能力,這樣 innodb 才能知道需要全力刷髒頁的時候,可以刷多快。

這就要用到 innodb_io_capacity 這個引數了,它會告訴 innodb 你的磁碟能力。

現在你知道了,innodb 會在後台刷髒頁,而刷髒頁的過程是要將記憶體頁寫入磁碟。所以,無論是你的查詢語句在需要記憶體的時候可能要求淘汰乙個髒頁,還是由於刷髒頁的邏輯會占用 io 資源並可能影響到了你的更新語句,都可能是造成你從業務端感知到 mysql「抖」了一下的原因。

要盡量避免這種情況,你就要合理地設定 innodb_io_capacity 的值,並且平時要多關注髒頁比例(引數 innodb_max_dirty_pages_pct),不要讓它經常接近 75%。

mysql 檢視 髒頁 MySQL 刷髒頁

1.髒頁,乾淨頁 當記憶體資料頁和磁碟資料頁上的內容不一致時,我們稱這個記憶體頁為髒頁 記憶體資料寫入磁碟後,記憶體頁上的資料和磁碟頁上的資料就一致了,我們稱這個記憶體頁為乾淨頁。2.刷髒頁的時機 2.1 redo log redo log 是迴圈寫的,當redo log 寫滿了,即 write p...

Mysql的刷髒頁問題

平時的工作中,不知道你有沒有遇到過這樣的場景,一條 sql 語句,正常執行的時候特別快,但是有時也不知道怎麼回事,它就會變得特別慢,並且這樣的場景很難復現,它不只隨機,而且持續時間還很短。當記憶體資料頁跟磁碟資料頁內容不一致的時候,我們稱這個記憶體頁為 髒頁 記憶體資料寫入到磁碟後,記憶體和磁碟上的...

MySQL刷髒頁優化方案彙總

目錄 1.改善flu刷髒 1.1 增加併發 5.7.4 1.2 改善鍊錶遍歷方式 1.3 平衡刷髒權重 5.7.6 1.4 使用者執行緒在檢查redo 空間時不參與刷髒 5.7.6 1.5 為page cleaner執行緒設定更高的優先順序 5.7.6 2.改善lru刷髒 2.1 髒頁 to fre...