Java教程

数据库刷脏页

本文主要是介绍数据库刷脏页,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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 语句响应时间。

 

这篇关于数据库刷脏页的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!