MySQL抖動原因分析

數據庫抖動定義

  一條SQL語句,正常執行的時候特別快,但是有時也不知道怎麼回事,它就會變得特別慢,並且這樣的場景很難復現,它不只隨機,而且持續時間還很短,這樣的情況我們一般稱爲數據庫抖動。
  我們知道,與操作系統概念類似,當內存數據頁與磁盤數據頁內容不一致的時候,則將內存數據頁稱爲髒頁,將髒頁寫回磁盤的過程稱爲flush。在MySQL中,引發flush的情況主要有以下幾種:

  1. InnoDB的redo log寫滿了。這時候系統會停止所有更新操作,把checkpoint往前推進,redo log留出空間可以繼續寫。在推進checkpoint時,需要把兩點之間的日誌中對應的髒頁刷到磁盤中去。
  2. MySQL系統內存不足。當需要新的內存頁將磁盤數據載入內存時,就需要淘汰一些內存頁,這個過程可能涉及到flush
  3. MySQL認爲系統“空閒”的時候
  4. MySQL關閉之前

InnoDB刷髒頁控制策略

  首先,InnoDB的刷髒頁速度依賴於所在主機的IO能力,通過innodb_io_capacity來指定,這是刷髒頁的最快速度(當然不能全部IO能力都用來幹這個)
  其次,InnoDB的刷盤速度參考這兩個因素:一個是髒頁比例,一個是redo log寫盤速度。innodb_max_dirty_pages_pct是髒頁比例上限,默認值是75%,然後跟據當前的髒頁比例(假設爲M),算出一個範圍在0到100之間的數字作爲參考值F1,;InnoDB每次寫入的日誌都有一個序號,當前寫入的序號跟checkpoint對應的序號之間的差值,我們假設爲N。InnoDB會根據這個N算出一個範圍在0到100之間的數字作爲第二個因素的參考值F2.然後選取F1和F2中較大的值記爲R,之後引擎就可以按照innodb_io_capacity定義的能力乘以R%來控制刷髒頁的速度。
  最後,MySQL在flush髒頁的時候,還會觀察一下它周圍的頁是不是也是髒頁並一同刷回到磁盤,這個過程受到參數innodb_flush_neighbors控制,設置爲0代表不查找周圍的髒頁,SSD這類IOPS比較高的設備的話,建議把innodb_flush_neighbors的值設置成0(隨機存取速度快,無需連坐一同查找~)

參考文獻

MySQL實戰45講

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章