MySQL---脏页机制

flush和脏页

InnoDB在处理更新语句的时候,磁盘操作仅写了redo log日志,同时并更新内存,之后当系统空闲时会把操作记录更新到磁盘里,MySQL把内存里的数据写入磁盘的过程我们称为flush

当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容一致,称为“干净页”。

flush触发条件

  1. InnoDB redo log日志写满。此时系统会停止所有更新操作,把checkpoint往前推进,为redo log留出空间。 MySQL日志—redo log和binlog
  2. 系统内存不足。当需要新的内存页,而内存不够用的时候,就要淘汰一些数据页,空出内存给别的数据页使用。如果淘汰的是“脏页”,就要先将脏页写到磁盘。
  3. MySQL空闲
  4. MySQL正常关闭。MySQL正常关闭前会把内存的脏页都flush到磁盘上,这样下次MySQL启动的时候,就可以直接从磁盘上读数据,启动速度会很快。

第一种情况InnoDB要尽量避免,因为出现这种情况整个系统就不能再接受更新了,所有的更新都必须堵住,这时候的更新数会跌为0。

第二种是“内存不够用了,要先将脏页写到磁盘”,这种情况很常见。但是出现以下这两种情况,都是会明显影响性能的:

  1. 一个查询要淘汰的脏页个数太多,会导致查询的响应时间明显变长。
  2. 日志写满,更新全部堵住,写性能跌为0,对于某些业务无法接受。

InnoDB刷脏页的控制策略

首先需要正确地告诉InnoDB所在主机的IO能力,这样InnoDB才能知道需要全力刷脏页的时候可以刷多快。

MySQL5.5版本里,innodb_io_capacity参数可以动态调整刷新脏页的数量,innodb_io_capacity参数默认是200,单位是页。该参数设置的大小取决于硬盘的IOPS,即每秒的输入输出量(或读写次数)。

刷脏页的速度该如何设置呢?

InnoDB的刷盘速度需要参考两个因素:一个是脏页比例,另一个是redo log写盘速度。InnoDB会根据这两个因素先单独算出两个数字。

参数innodb_max_dirty_pages_pct是脏页比例上限,默认值是75%。InnoDB会根据当前的脏页比例(假设为M),算出一个范围在0到100之间的数字,这个计算公式可以记为F1(M)。

InnoDB每次写入的日志都有一个序号,当前写入的序号跟checkpoint对应的序号之间的差值,我们假设为N。InnoDB会根据这个N算出一个范围在0到100之间的数字,这个计算公式可以记为F2(N)(N越大,算出来的值越大)。

取F1(M)和F2(N)最大值R,按照R%的速度刷脏页。

猜你喜欢

转载自blog.csdn.net/MAKEJAVAMAN/article/details/118580112