数据库刷脏页
1.什么是脏页、干净页
当内存中和的数据页和磁盘中的不一致时,称为脏页;当内存中的数据页和磁盘中的一致时,称为干净页;
2.什么时候刷脏页
内存中的脏页进行写磁盘的过程称之为刷脏页,刷脏页的时候需要暂停所有业务更新,所以系统会产生卡顿的现象;
- 当binlog写满的时候,需要暂停更新,刷脏页;
- 当内存不足,内存页放不下的时候,需要刷脏页;、
- 当系统空闲的时候会定期刷脏页;
- 当mysql正常关闭的时候需要刷脏页;
3.刷脏页对性能的影响
上面第三种和第四种情况是在空闲的时候进行的,所以不会对业务产生影响;
当binlog文件写满的时候,这种情况是需要避免的,更新全部被堵住,写性跌为0,
当内存不足的时候,会淘汰脏页 ,这是常态的,这个时候数据库响应的时间会变长;
4.刷脏页的性能控制
- 系统的io能力
- 脏页比例
- binlog的写盘速度
先要提升刷脏页的速度,首先是提高刷脏页的速度,这个速度和系统的io能力有关,
这是innodb刷脏页的能力show global VARIABLES like "innodb_io_capacity";
这个参数需要根据当前系统的io能进行设置,如果设置不当可能造成刷新很慢;
这个值建议设置成磁盘的 IOPS。磁盘的 IOPS 可以通过 fio 这个工具来测试,下面的语句是我用来测试磁盘随机读写的命令:
检测系统的io能力:fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest;
虽然上述参数设置合适后可以使系统具有全力刷脏页的能力,但是系统不能全部用来刷脏页,需要定义刷脏页的速度,
刷脏页的速度影响因素有以下两个:
- 脏页比例
- binlogde 写盘速度
脏页比例的计算M:show VARIABLES like "innodb_max_dirty_pages_pct"; 这是系统设置的脏页比例上限,默认是75%,系统会根据当前脏页比例(Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total)M算出一个0~100的数值F1(M)
1 2 3 4 5 6 7 | M伪代码 F1(M) { if M>=innodb_max_dirty_pages_pct then return 100; return 100*M /innodb_max_dirty_pages_pct ; } |
binlog的写盘速度计算N:binlog每次写入日志都会对应一个序号,当前写入的序号和checkpoint序号之间的差值就是N,根据这个N算出一个0~100之间的数值F2(N)。
然后取F1(M)和F2(N)之间的最大值作为R ,算出刷脏页的速度是innodb_io_capacity*R%;
5.刷脏页的策略
在系统需要把一个脏页刷掉的时候往往会把相邻的脏页一起刷掉,如此连续可能一次就会刷一大片的脏页,这个策略由show VARIABLES like "innodb_flush_neighbors"这个参数控制,如果为1 则表示连带刷,如果为0 表示个刷个的。
找“邻居”这个优化在机械硬盘时代是很有意义的,可以减少很多随机 IO。机械硬盘的随机 IOPS 一般只有几百,相同的逻辑操作减少随机 IO 就意味着系统性能的大幅度提升。而如果使用的是 SSD 这类 IOPS 比较高的设备的话,我就建议你把 innodb_flush_neighbors 的值设置成 0。因为这时候 IOPS 往往不是瓶颈,而“只刷自己”,就能更快地执行完必要的刷脏页操作,减少 SQL 语句响应时间。
6.后台线程定期刷脏页
从LRU列表中冷数据(old block)定期刷脏页 每次扫描的数量可以由这个参数控制 innodb_lru_scan_depth (默认1024),这种方式称为 BUF_FLUSH_LRU
定时从flush 列表中刷新脏页,这种方式称为 BUF_FLUSH_LIST
有时候后台线程刷新脏页的进度比较慢,导致用户线程在准备加载一个磁盘页到Buffer Pool时没有可用的缓存页,这时就会尝试看看LRU链表尾部有没有可以直接释放掉的未修改页面,如果没有的话会不得不将LRU链表尾部的一个脏页同步刷新到磁盘(和磁盘交互是很慢的,这会降低处理用户请求的速度)。这种刷新单个页面到磁盘中的刷新方式被称之为BUF_FLUSH_SINGLE_PAGE。当然,有时候系统特别繁忙时,也可能出现用户线程批量的从flush链表中刷新脏页的情况,很显然在处理用户请求过程中去刷新脏页是一种严重降低处理速度的行为,这属于一种迫不得已的情况。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
2020-06-10 linux系统设置中文字体