脏页:更新数据时,只更新了内存中的数据页,没有更新磁盘
    内存中数据页与磁盘中数据页不一致,称为脏页
    刷脏:将内存中数据页保存至磁盘,同时,删除与此页相关的redo log,推进check point
    image.png
    为什么要刷脏
    1.内存中的脏页太多,内存不足
    2.redo log文件写满,需要推进check point
    3.系统空闲,提前刷脏,预防上述情况
    4.MySQL关闭前,保存数据
    5.前两种会产生性能问题,导致MySQL卡住

    如何避免被迫刷脏

    1.正确告知InnoDB,服务器的硬盘性能
    服务器IO配置
    配置项:innodb_io_capacity
    用来告知服务器的硬盘性能,
    硬盘性能测试命令:fio

    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

    常见IOPS:
    7200rpm SATA,70 IOPS 每秒70次IO
    10000rpm FC,125 IOPS
    SSD SATA 3000 ~ 40000 IOPS
    用来告知服务器的硬盘性能
    2.配置合理的脏页比例上限
    配置项:innodb_max_dirty_pages_pct
    当脏页比例接近此值,会加速刷脏页
    建议保持默认值75
    3.控制“顺便刷脏”策略
    配置项:innodb_flush_neighbors
    传统的磁盘连续写性能最好,尽量刷连续的页
    SSD建议设为0 (8.0已经默认O)