橡皮擦擦

MySQL性能调优-脏页刷新

MySQL

原理

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

当要读入的数据页没有在内存的时候,就必须到缓冲池中申请一个数据页。这时候只能把最久不使用的数据页从内存中淘汰掉:如果要淘汰的是一个干净页,就直接释放出来复用;但如果是脏页呢,就必须将脏页先刷到磁盘,变成干净页后才能复用。

所以以下这两种情况,都是会明显影响性能的:

  1. 一个查询要淘汰的脏页个数太多,会导致查询的响应时间明显变长;
  2. 日志写满,更新全部堵住,写性能跌为 0,这种情况对敏感业务来说,是不能接受的。

所以,InnoDB 需要有控制脏页比例的机制,来尽量避免上面的这两种情况。

配置调优 - innodb_io_capacity

innodb_io_capacity默认是200,单位是页,该参数的设置大小取决于硬盘的IOPS,即每秒每秒的输入输出量(或读写次数)
它会告诉 InnoDB 磁盘能力,所以把这个值设置成磁盘的 IOPS。
磁盘的 IOPS 可以通过 fio 这个工具来测试,下面的语句用来测试磁盘随机读写的命令:

fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest 

配置调优 - innodb_flush_neighbors

InnoDB存储引擎还提供了Flush Neighbor Page(刷新邻接页)的特性。其工作原理为:当刷新一个脏页时,InnoDB存储引擎会检测该页所在区(extent)的所有页,如果是脏页,那么一起进行刷新。

InnoDB1.2.x版本开始提供了参数innodb_flush_neighbors,用来控制是否启用该特性。

对于传统机械硬盘建议启用该特性,而对于固态硬盘有着较高的IOPS性能的磁盘,则建议将该参数设置为0,即关闭该特性。


内容摘自《MySQL实战45讲》-https://time.geekbang.org/column/intro/139

点我评论
打赏本文
二维码


24

文章

6

分类