MYSQL io_capacity 哥倆,你調了嗎?

  • 2020 年 3 月 10 日
  • 筆記

innodb_io_capacity and innodb_io_capacity_max,這兩個參數真的是innodb資料庫引擎需要的參數嗎?是innodb 需要他們,還是他們需要innodb 。這個問題到底是先有雞,還是先有蛋呢?

innodb_io_capacity變數定義了InnoDB後台任務每秒可用的I/O操作數(IOPS),比如刷新緩衝池中的頁面和合併更改緩衝區中的數據。

首先我們必須確認這個問題的重要性,io_capacity 到底要做點什麼,在InnoDB中更新一段數據時,更新是在記憶體中進行的,緩衝池中受影響的頁面(或多個頁面)被標記為髒的。當您寫入更多的數據時,臟頁的數量將會增加,並且在某個時候,它們需要被寫到磁碟上。這個過程在後台發生,稱為刷新。innodb_io_capacity定義了InnoDB刷新頁面的速度。

那麼到底調整這個值,會產生什麼影響,從哪裡看,如果有PMM可以從innodb i/o data write 指標來看或者是從 innodb_data_fsyncs 這個指標來看,當然需要進行一些處理。

innodb_io_capacity調整,將其參數逐步提高,並進行批量持續性的操作後,大致的結果如下,畫一個草圖。

從圖中可以看到,如果是同樣的數據量的情況下,數字越小,寫入系統需要的時間越長,以此類推,參數越大,相關寫入同樣數據的時間就越短。

而縮短數據的寫入的時間,對於整體系統來說是有好處的,例如一個繁忙的系統,寫操作等都是由 innodb_write_io_threads 數量來控制的,所以當較低的innodb_io_capacity 會引起刷新臟頁的執行緒與刷新數據量之間的矛盾,最終會導致,IO整體負載加大,關機緩慢,甚至導致系統性能問題,從系統中刷出的臟頁,MYSQL INNODB 會有DB WRITE REDO,undo, binlog 等操作,所以MYSQL I/O 系統是很繁忙的,降低由於刷臟頁造成的佔用 CPU 以及I/O 的時間對整體的系統都是有好處的。

所以調整innodb_io_capacity and innodb_io_capacity_max 以適合你當前的系統,就變得更重要的尤其是針對負載較重的系統。

但調整大了,超過I/O系統的負荷又會怎麼樣?那問題就大了,本身I/O 承受不了一次性的寫入,那整體I/O 就會陷入停頓,多個執行緒的寫入,整體I/O系統在高負載的情況下,就會整體陷入性能問題,所以調整innodb_io_capacity and innodb_io_capacity_max,量力而行,留有餘地。

一般調整需要知道當前系統的IOPS 是多少,根據innodb_io_capacity參數指標, innodb_io_capacity_max 大於 innodb_io_capacity。

這裡給一個參考,如果IOPS 沒有超過200 在高並發的MYSQL資料庫系統中很容易就會產生I/O性能瓶頸

15k rpm: 180-210 IOPS 10k rpm: 130-150 IOPS 7200 rpm: 80-100 IOPS 5400 rpm: 50-80 IOPS

下圖是下面那篇專業的文字中的截圖

具體的關於這方面專業的文字 的文檔,如果感興趣可以加下面的QQ群後自行下載。