一.場景
場景很難複現,持續時間短。
産生原因:
- InnoDB處理更新語句時候,隻做寫日志這個磁盤操作。這個日志叫做redo log(重做日志)
- 在更新記憶體寫完redo log後,傳回給用戶端,本次更新成功
當記憶體寫滿,不得不同步至記憶體時候,就會比較緩慢
flush就是記憶體的資料寫入磁盤中
- 髒頁:當記憶體資料頁和磁盤資料頁不一緻的時候
- 幹淨頁:當記憶體 和磁盤上的資料頁的内容一緻
二.産生刷髒頁的場景
- redo log滿了,系統要停止所有更新操作,将checkpoint 往前推進,redo log 留出空間可以繼續寫。
- 系統記憶體不足,需要新的記憶體頁,記憶體不足時候需要淘汰資料頁,将髒頁寫到磁盤中
- MySQL 認為系統“空閑”的時
- MySQL 正常關閉時
前兩種情況分析:
- redo log寫滿了,要刷flush髒頁,這種情況InnoDB要盡量避免,系統不再接受更新,所有更新都必須堵住
- 記憶體不夠用了,将髒頁寫到磁盤,這種情況是常态
InnoDB用緩存池(buffer pool)管理記憶體,緩存池中的記憶體頁有三種狀态:
- 未使用
- 使用了都是幹淨頁
- 使用了但是都是髒頁
InnoDB政策時盡量使用記憶體,對于一個長時間運作的庫來說,未被使用 的頁面很少
- 要淘汰的髒頁太多,導緻查詢響應時間明顯變長
- 日志寫滿,更新全部堵住,寫性能跌為0
三.InnoDB刷髒頁的控制政策
- 值建議設定成磁盤的IOPS
- 磁盤的IOPS可以用fio工具測試