目录

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很高

参考: https://juejin.cn/post/6844903841851260936

分类: mysql
标签: