脏页和干净页
当内存数据页跟磁盘数据页内容不一致的时候,称这个内存页为 脏页。
当内存数据写入到磁盘后,内存和磁盘上的数据页内容就一致了,称为干净页。
类似孔乙己记账的粉板。掌柜记账的账本是数据文件,记账用的粉板是日志文件,掌柜的记忆就是内存。
MySQL 抖的瞬间,可能在刷脏页。
什么情况引发 flush?
- innoDb redo log 写满,所有写操作暂停,checkpoint 向前推进,redo log 留出空间继续写。
- 系统内存不足。当需要新的内存页,而内存不够用的时候,就要淘汰一些数据页,空出内存给别的数据页使用。
- 系统空闲,刷脏页。
- MySQL 正常关闭,会把内存脏页都 flush 到磁盘上。这样下次启动直接读磁盘,启动速度快。
四种场景对性能的影响
- 系统不接受更新,更新熟跌 0.
- innoDb 用缓冲池(buffer pool)管理内存,缓冲池的内存页有三种状态:
- 还没有使用的
- 使用了并且是干净页
- 使用了并且是脏页
刷脏页影响性能的情况:
- 一个查询要淘汰的脏页个数太多,会导致查询的响应时间明显变长、
- 日志写满,更新全部堵住,写性能跌为 0,敏感业务不可接受。
通过控制脏页比例机制来避免以上两种情况:innodb_max_dirty_pages_pct
内存脏页问题
脏页会被后台线程自动 flush,也会由于数据页淘汰触发 flush,而刷脏页的过程由于会占用资源,可能会让你的更新和查询语句的响应时间长一些。