02.13 Day 25 - InnoDB 脏页的控制策略

大家好,我是 Snow Hide,作为《MySQL 实战》这个专栏的学员之一,这是我打卡的第 25 天,也是我第 85 次进行这种操作。

今天我温习了该专栏里一篇叫《为什么我的MySQL会“抖”一下?》的文章。

关键词总结:你的 SQL 语句为什么变 “慢” 了(刷脏页 / flush 过程、缓冲池内存页三种状态、刷脏页时影响性能的原因)、InnoDB 刷脏页的控制策略(InnoDB 刷盘速度参考的两个因素、SSD 这类高 IOPS 设备的建议)。

所学总结:

你的 SQL 语句为什么变 “慢” 了

当内存数据页很磁盘数据页内容不一致的时候,我们称这个内存页为 “脏页”。内存数据写入到磁盘后,内存和磁盘上数据页的内容就不一致了,称为 “干净页”。

刷脏页 / flush 过程

  • 场景一:InnoDB 的 redo log 写满了。这时系统会停止所有更新操作,把 checkpoint 往前推进,redo log 留出空间可以继续写。其推进途中之间的日志对应的所有脏页都 flush 到磁盘上。接下来 write pos 到 checkpoint 移动到的目标位置之间就是可以再写入的 redo log 区域;
  • 场景二:系统内存不足。当需要新的内存页而发现不够用时,需要淘汰一些数据页,空出内存给给的数据页使用。如果淘汰的是 “脏页”,这要先将脏页写到磁盘;
  • 场景三:MySQL 认为系统 “空闲” 的时候会开始刷 “脏页”;
  • 场景四:MySQL 正常关闭的情况。其会把内存的脏页都 flush 到磁盘上,在下次启动时能直接从磁盘上读数据,启动速度会很快。

缓冲池内存页三种状态

  • 第一种:还没有使用;
  • 第二种:使用了并且是干净页;
  • 第三种:使用了并且是脏页。

刷脏页时影响性能的原因

  • 一个查询要淘汰的脏页个数太多,导致查询响应时间变长;
  • 日志写满,更新全部堵塞,写性能降至 0,对于敏感业务来说,这是不能接受的。
     

InnoDB 刷脏页的控制策略

  • innodb_io_capacity 参数会告诉 InnoDB 你的磁盘能力。这个值建议设置成磁盘的 IOPS。磁盘的 IOPS 可以通过 fio 来测试。

InnoDB 刷盘速度参考的两个因素

  • 脏页比例:innodb_max_dirty_pages_pct 是脏页比例上限,默认值为 70%;
  • redo log 写盘速度。

SSD 这类高 IOPS 设备的建议

  • 将 innodb_flush_neighbors 的值设置成 0。因为 SSD 环境下导致瓶颈产生的通常不是 IOPS,而 “只刷自己” 可以更快地执行完必要的刷脏页操作,减少 SQL 语句响应时间。MySQL 8.0 中的 innodb_flush_neighbors 参数值在默认情况下是 0。

末了

重新总结了一下文中提到的内容:WAL 概念、刷脏页操作和执行时机、随机写转换成顺序写以提升数据库性能、控制刷脏页的方法和对应的监控方式。

发布了151 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/stevenchen1989/article/details/104290129