MySQL刷脏页
起因
起因:由于MySQL的WAL机制,会导致内存和磁盘中的数据不一致的情况,此时这个不一致的数据,即是我们标题中提到脏页。
刷脏页的几种场景
- InnoDB 的 redo log 写满了。这时候系统会停止所有更新操作,把 checkpoint 往前推进,redo log 留出空间可以继续写
- 系统内存不足。当需要新的内存页,而内存不够用的时候,就要淘汰一些数据页,空出内存给别的数据页使用。如果淘汰的是“脏页”,就要先将脏页写到磁盘
- MySQL 认为系统“空闲”的时候
- MySQL 正常关闭的情况。这时候,MySQL 会把内存的脏页都 flush 到磁盘上
此处需要考虑到性能的,主要是1,2两点
内存页的几种状态
- 第一种是,还没有使用的【作为一个长久运行的系统,这种情况几乎很少】
- 第二种是,使用了并且是干净页
- 第三种是,使用了并且是脏页
如何控制刷脏页影响数据库性能
告诉MySQL所在主机的IO能力 innodb_io_capacity,该值建议设置成磁盘的IOPS。
1
2测试性能
fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest控制脏页比例。innodb_max_dirty_pages_pct(默认75%)
InnoDB会根据脏页比例和磁盘写入速度来自动控制刷脏页速度因为现在都是SSD,所以刷脏页不需要连坐(即把身边的脏页也刷新)。innodb_flush_neighbors = 0【不刷新身边的脏页】
- Post title:MySQL刷脏页
- Post author:大黄
- Create time:2023-10-20 15:31:06
- Post link:https://huangbangjing.cn/2023/10/20/MySQL刷脏页/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.