MySQL-脏页刷新策略
李羽秋
2023年02月10日 · 阅读 1,360
MySQL-脏页刷新策略
1.什么是脏页
内存页的数据页跟磁盘中的数据页不一致的时候,这些数据页就是脏页
2.何时会刷脏页
- InnoDB的redo log 写满了
- 系统内存不足
- 系统空闲时
- Mysql正常关闭过程
3.场景分析
3.1 InnoDB的redo log 写满了
这种情况要尽量避免,出现这种情况的时候,整个系统就不能再接受更新了,所有更新都将阻塞
3.2 系统内存不足
内存不足指的是InnoDB的buffer pool 的剩余内存不足
buffer pool 中的数据页有三种状态:
- 还未使用
- 使用后,仍然是干净页
- 使用后,变成脏页
数据页从磁盘读入内存时,需要向buffer pool 申请一个数据页,buffer pool 会根据LRU算法淘汰一个数据页,如果淘汰的是脏页,那么先将脏页数据刷新到磁盘中,然后才复用数据页。如果一个查询要淘汰掉的脏页太多咯,也会导致查询时间变长。
4. 设置脏页刷新策略
- 想要InnoDB以合理的速度去刷新脏页,首先需要告诉InnoDB,所在主机的磁盘IO能力,然后通过设置Innodb_io_capacity参数,指定InnoDB刷新脏页的速度上限
- InnoDB根据两个因素来判断刷洗脏页的速度
- buffer_pool中的脏页比例innodb_buffer_pool_pages_dirty/innodb_buffer_pool_pages_total
- redo log 的剩余空间
5. 邻居连坐机制
刷脏页的时候,如果发现旁边也是脏页,会连同一起刷掉,以此类推。
- 通过参数innodb_flush_neighbors控制该机制
- innodb_flush_neighbors =1 表示启用
- innodb_flush_neighbors =- 表示禁用
- 连坐机制对于机械硬盘是很有意义的,机械硬盘IOPS比较低,通过连坐机制可以减少大量随机IO
- 对于SSD设备,建议设置innodb_flush_neighbors =0,因为SSD的IOPS很高
分类:
mysql
标签:
无