脏页和干净页

当内存数据页跟磁盘数据页内容不一致的时候,称这个内存页为 脏页。
当内存数据写入到磁盘后,内存和磁盘上的数据页内容就一致了,称为干净页。

类似孔乙己记账的粉板。掌柜记账的账本是数据文件,记账用的粉板是日志文件,掌柜的记忆就是内存。

image.png

MySQL 抖的瞬间,可能在刷脏页。

什么情况引发 flush?

  1. innoDb redo log 写满,所有写操作暂停,checkpoint 向前推进,redo log 留出空间继续写。

image.png

  1. 系统内存不足。当需要新的内存页,而内存不够用的时候,就要淘汰一些数据页,空出内存给别的数据页使用。
  2. 系统空闲,刷脏页。
  3. MySQL 正常关闭,会把内存脏页都 flush 到磁盘上。这样下次启动直接读磁盘,启动速度快。

四种场景对性能的影响

  1. 系统不接受更新,更新熟跌 0.
  2. innoDb 用缓冲池(buffer pool)管理内存,缓冲池的内存页有三种状态:
    1. 还没有使用的
    2. 使用了并且是干净页
    3. 使用了并且是脏页

刷脏页影响性能的情况:

  1. 一个查询要淘汰的脏页个数太多,会导致查询的响应时间明显变长、
  2. 日志写满,更新全部堵住,写性能跌为 0,敏感业务不可接受。

通过控制脏页比例机制来避免以上两种情况:innodb_max_dirty_pages_pct

内存脏页问题

脏页会被后台线程自动 flush,也会由于数据页淘汰触发 flush,而刷脏页的过程由于会占用资源,可能会让你的更新和查询语句的响应时间长一些。