12 | 为什么我的MySQL会“抖”一下?

Page content

12 | 为什么我的MySQL会“抖”一下?

SQL 语句为什么变“慢”了?

和数据相关的三个部分:数据文件、日志文件、内存

脏页:内存数据页和磁盘数据页内存不一致,这个内存页称为“脏页”

干净页:内存数据写入磁盘后,内存和磁盘上的数据页就一致了,我们称为“干净页”

平时执行很快的更新操作,其实就是在写内存和日志;偶尔变得很慢,很可能是在刷“脏页”(flush)

哪些场景下会刷脏页?

  • redo log 满了
  • 系统内存不足
  • 系统空闲的时候,主动刷脏
  • Mysql正常关闭前

刷脏是常态,但是要避免两种情况

  • 一个查询要淘汰的脏页个数过多,会导致查询的响应时间明显变长
  • 日志写满,更新全部堵住,写性能跌为0

InnoDB 刷脏页的控制策略

  • 正确告诉 InnoDB 所在主机的IO能力,使其能够确定全力刷脏页的时候能刷多快;相关参数:innodb_io_capacity
  • 避免刷脏页的时候顺带刷旁边的脏页;相关参数:innodb_flush_neighbors

问题讨论

一个内存配置为 128GB、innodb_io_capacity 设置为 20000 的大规格实例,正常会建议你将 redo log 设置成 4 个 1GB 的文件。

但如果你在配置的时候不慎将 redo log 设置成了 1 个 100M 的文件,会发生什么情况呢?又为什么会出现这样的情况呢?

答案 磁盘压力很小,但是数据库出现间歇性的性能下跌。