MySQL刷脏页
大黄 Lv4

起因

起因:由于MySQL的WAL机制,会导致内存和磁盘中的数据不一致的情况,此时这个不一致的数据,即是我们标题中提到脏页。

刷脏页的几种场景

  • InnoDB 的 redo log 写满了。这时候系统会停止所有更新操作,把 checkpoint 往前推进,redo log 留出空间可以继续写
  • 系统内存不足。当需要新的内存页,而内存不够用的时候,就要淘汰一些数据页,空出内存给别的数据页使用。如果淘汰的是“脏页”,就要先将脏页写到磁盘
  • MySQL 认为系统“空闲”的时候
  • MySQL 正常关闭的情况。这时候,MySQL 会把内存的脏页都 flush 到磁盘上

此处需要考虑到性能的,主要是1,2两点

内存页的几种状态

  • 第一种是,还没有使用的【作为一个长久运行的系统,这种情况几乎很少】
  • 第二种是,使用了并且是干净页
  • 第三种是,使用了并且是脏页

如何控制刷脏页影响数据库性能

  • 告诉MySQL所在主机的IO能力 innodb_io_capacity,该值建议设置成磁盘的IOPS。

    1
    2
    # 测试性能
    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会根据脏页比例和磁盘写入速度来自动控制刷脏页速度

  • 因为现在都是SSD,所以刷脏页不需要连坐(即把身边的脏页也刷新)。innodb_flush_neighbors = 0【不刷新身边的脏页】

  • Post title:MySQL刷脏页
  • Post author:大黄
  • Create time:2023-10-20 15:31:06
  • Post link:https://huangbangjing.cn/2023/10/20/MySQL刷脏页/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.