• MySQL并没有所谓的垃圾回收
  • 但是会发现数据库卡几秒,磁盘IO很高
  • 此时MySQL正在“刷脏页”

    MySQL脏页的产生

  • 更新数据时,只更新了内存中的数据叶,没有更新磁盘

  • 内存中数据页与磁盘中数据页不一致,称为脏页

image.png

什么是刷脏

  • 将内存中数据页保存至磁盘
  • 同时,删除与此页相关的redo log,推进check point

image.png

为什么要刷脏

  1. 内存页中的脏页太多,内存不足
  2. redo log文件写满,需要推进check point
  3. 系统空闲,提前刷脏,预防上述情况
  4. MySQL关闭前,保存数据
  5. 前两种会产生性能问题,导致MySQL卡住

    如何避免被迫刷脏

  6. 正确告诉InnoDB,服务器的硬盘性能

  7. 配置合理的脏页比例上限
  8. 控制“顺便刷脏”策略

    服务器IO配置

  • 配置项:innodb_io_capacity
  • 用来告知服务器的硬盘性能
  • 常见IOPS:

    • 7200 rpm SATA, 70 IOPS
    • 10000 rpm FC, 125 IOPS
    • SSD SATA, 3000 ~ 40000 IOPS
      1. fio \
      2. -filename=io_test \
      3. -direct=1 \
      4. -iodepth 1 \
      5. -thread \
      6. -rw=randrw \
      7. -ioengine=psync \
      8. -bs=16k \
      9. -size=500M \
      10. -numjobs=10 \
      11. -runtime=10 \
      12. -group_reporting \
      13. -name=mytest

      配置合理的脏页比例上限

  • 配置项:innodb_max_dirty_pages_pct

  • 当脏页比例接近此值,会加速刷脏页
  • 建议保持默认值75

控制“顺便刷脏”策略

  • 配置项:innodb_flush_neighbors
  • 传统的磁盘连续写性能最好,尽量刷连续的页
  • SSD建议设为0(8.0已经默认0)

总结

  • 刷脏可能会导致MySQL卡住
  • 通过告知服务器IO性能,可以控制合理刷脏IO
  • 合理的脏页比例上限