当内存数据页跟磁盘数据页内容不一致的时,称这个内存页为“脏页”。内存数据写入磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。
平时执行很快的更新操作,就是在写内存和日志,而MySQL偶尔抖一下,可能是在刷脏页。
刷脏页的时机
- redo log 写满了,数据库停止所有更新操作,将 check point 往前推进
- 内存不够用,淘汰数据页时,如何数据页是脏页,需要将脏页写到磁盘
- 后台定时刷脏页
- MySQL 正常关闭时,将脏页写到磁盘
以下情况会影响性能:
- 第一种情况,日志写满,更新全部堵住,写性能跌为0
- 第二种情况,一个查询要淘汰的脏页个数太多,回导致查询时间变长
InnoDB 脏页控制策略
磁盘性能 innodb_io_capacit
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 根据脏页比例和 redo log 空闲比例计算出两个值,取其中最大值,结合磁盘性能控制刷脏页速度。
innodb_flush_neighbors 刷脏页的连坐机制(SSD磁盘建议关闭)