【MySQL 讀書筆記】SQL 刷髒頁可能形成數據庫抖動

開始今天讀書筆記以前我以爲須要回顧一下當咱們在更新一條數據的時候作了什麼。segmentfault

由於 WAL 技術的存在,因此當咱們執行一條更新語句的時候是先寫日誌,後寫磁盤的。當咱們在內存中寫入了 redolog 以後,就返回已經更新成功了。後續經過其餘的手段將數據寫回到磁盤上。緩存

當內存數據也跟磁盤數據頁不一致的時候,咱們就稱這個內存頁爲「髒頁」。內存數據寫入到磁盤後,內存和磁盤上的數據頁的內容就一致了,稱爲「乾淨頁」。工具

有幾種場景會讓 MySQL 主動將 redo log 裏面的記錄刷到實際的數據更新上面。性能

1. ib_logfile0寫的記錄滿了。測試

2. 系統內存不足,讀取數據的時候內存不夠必需要空出內存給數據頁使用,因此須要將髒頁刷到磁盤上把空間釋放出來。優化

3. 系統空閒,每隔一段時間就刷一批髒頁。阿里雲

 

Innodb 使用 buffer pool 來管理內存,不少地方的優化都跟 buffer pool 有直接的關係。該參數默認設置是 128M 若是內存資源充足建議開到 4G 以上。這樣無論是提高緩存能力,仍是幫助數據排序都有很是大的幫助。spa

有幾個跟髒頁相關的系統參數,innodb_io_capacity 這個參數會告訴 InnoDB 磁盤讀寫能力,通常會設置成磁盤的 IOPS 默認是 200 innodb_io_capacity_max 是 2000。按照工具測試來看目前 aliyun 的雲盤能夠達到 4000 以上的 iops 。我看阿里雲本身的 rds 配置的也是 2000 最大 4000.這樣能夠充分發揮硬盤讀寫的威力。日誌

這裏筆者推薦了 fio 工具用來測試磁盤讀寫能力。code

 fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest 

 

另外 innodb_max_dirty_pages_pct 用於限制髒頁上限,默認是 75%.還有 innodb_flush_neighbors 8.0 以前是 on, 在刷髒頁的同時若是旁邊數據也也是髒頁會一併刷入。

其實排查 MySQL 抖動是比較難的一件事情,最好綜合慢查日誌分析相關參數和磁盤問題來定位,才能更好的解決此類問題。

 

 

Reference:

本讀書筆記皆來自發布在極客時間的 林曉斌(丁奇)的 MySQL 實戰45講:

極客時間版權全部: https://time.geekbang.org/ 版權全部: 

https://time.geekbang.org/column/article/71806

https://segmentfault.com/a/1190000003880571  使用fio測試磁盤I/O性能

相關文章
相關標籤/搜索