Mysql的“垃圾回收”
Mysql有时候会发生长时间的没有响应,是不是类似与Java、Golang在进行垃圾回收?其实不然Mysql是使用C语言进行编写,没有垃圾回收机制。极大的可能是在进行“刷脏”操作。
Mysql的脏页的产生
更新数据时,只更新了内存中的数据页,并将redo log进行落盘,没有将数据页更新到磁盘,。
内存中数据页与磁盘中的数据页不一致时,称为“脏页”。
什么是刷脏
将内存数据页保存至磁盘。
同时,删除与此页相关的redo log,推进check point。

为什么要刷脏
内存中的脏页太多,内存不足。
redo log文件写满,需要推进check point。
系统空闲,提前刷脏,预防上述情况。
Mysql关闭之前,保存数据。
前两种(被迫刷脏)会产生性能问题,导致Mysql卡住。
如何避免被迫刷脏
正确的告知InnoDB引擎,服务器的硬盘性能。
服务器IO配置
配置项:innodb_io_capacity。
用来告知服务器的硬盘性能。
可以通过fio命令进行测试。

常见硬盘的IOPS:
7200 rpm SATA(机械磁盘,7200转每分钟),70 IOPS(每秒70次IO)。
10000 rpm FC(机械磁盘,10000转每分钟),125 IOPS(每秒125次IO)。
SSD SATA(固态硬盘),3000~40000 IOPS(固态硬盘每秒的IO差距较大,所以跨度较大)。
配置合理的脏页比例上限。
配置项:innodb_max_dirty_pages_pct。
当脏页比例接近此值时,会加速刷脏页。
建议保持默认值75%。
控制“顺便”刷脏策略。
配置项:innodb_flush_neighbors。
传统磁盘连续写的性能最好,尽量刷连续的页。
SSD建议设置为0。(Mysql8.0已默认为0)
总结
刷脏可能会大致Mysql卡住,造成性能问题。
通过告知服务器IO性能,可以控制合理刷脏IO。
合理的脏页比例上限,建议保持默认。
“顺便刷脏”功能需要在SSD硬盘下关闭。
来源:https://coding.imooc.com/learn/list/515.html