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)
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 语句响应时间。
原创文章,作者:506227337,如若转载,请注明出处:https://blog.ytso.com/267231.html