数据库
首页 > 数据库> > 数据库刷脏页

数据库刷脏页

作者:互联网

1.什么是脏页、干净页

  当内存中和的数据页和磁盘中的不一致时,称为脏页;当内存中的数据页和磁盘中的一致时,称为干净页;

 

2.什么时候刷脏页

  内存中的脏页进行写磁盘的过程称之为刷脏页,刷脏页的时候需要暂停所有业务更新,所以系统会产生卡顿的现象;

3.刷脏页对性能的影响

  上面第三种和第四种情况是在空闲的时候进行的,所以不会对业务产生影响;

  当binlog文件写满的时候,这种情况是需要避免的,更新全部被堵住,写性跌为0,

  当内存不足的时候,会淘汰脏页 ,这是常态的,这个时候数据库相应的时间会变长;

 

4.刷脏页的性能够控制

    先要提升刷脏页的速度,首先是提高刷脏页的速度,这个速度和系统的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;

 

  虽然上述参数设置合适后可以使系统具有全力刷脏页的能力,但是系统不能全部用来刷脏页,需要定义刷脏页的速度,

  刷脏页的速度影响因素有以下两个:

  脏页比例的计算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 语句响应时间。

 

标签:刷脏页,数据库,IOPS,innodb,io,脏页,pages
来源: https://www.cnblogs.com/xiatc/p/16363693.html