脏页:更新数据时,只更新了内存中的数据页,没有更新磁盘
内存中数据页与磁盘中数据页不一致,称为脏页
刷脏:将内存中数据页保存至磁盘,同时,删除与此页相关的redo log,推进check point
为什么要刷脏
1.内存中的脏页太多,内存不足
2.redo log文件写满,需要推进check point
3.系统空闲,提前刷脏,预防上述情况
4.MySQL关闭前,保存数据
5.前两种会产生性能问题,导致MySQL卡住
如何避免被迫刷脏
1.正确告知InnoDB,服务器的硬盘性能
服务器IO配置
配置项:innodb_io_capacity
用来告知服务器的硬盘性能,
硬盘性能测试命令:fio
fio \
-filename=io_test \
-direct=1 \
-iodepth 1 \
-thread \
-rw=randrw \
-ioengine=psync \
-bs=16k \
-size=500M \
-numjobs=10 \
-runtime=10 \
-group_reporting \
-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)