mysql之抖动

flush: 就是把内存里的数据写入磁盘的过程。
脏页:当内存数据页跟磁盘数据页内容不一致的时候。
干净页:内存数据写入到磁盘后,内存和磁盘上的数据页的内容一致的时候。
脏页和干净页都是在内存中。

1、数据库的flush场景

  • 对应的redo log日志满了,系统会停止所有更新操作,把checkpoint往前推进,redo log日志留出空间继续写。
  • 对应的系统内存不足,当需要新的内存页,而内存不够用的时候,就要淘汰一些数据页,空出内存给别的数据页使用。如果淘汰的是脏页,就要先将脏页写到磁盘。InnoDB用缓冲池(buffer pool)管理内存,缓冲池中的内存页有3种状态:
    1、还没有使用的
    2、使用了并且是干净页
    3、使用了并且是脏页
  • mysql系统空闲的时候,刷一点脏页。
  • mysql正常关闭的时候,mysql会把内存的脏页都flush到磁盘上。

2、InnoDB刷脏页的控制策略

innodb_io_capacity <75%进行参数设置,可以设置InnoDB刷脏页的控制策略。
根据上述算得的 F1(M) 和 F2(N) 两个值,取其中较大的值记为 R,之后引擎就可以按照 innodb_io_capacity 定义的能力乘以 R% 来控制刷脏页的速度。
脏页比例:Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total
mysql> select VARIABLE_VALUE into @a from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_dirty'; select VARIABLE_VALUE into @b from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_total'; select @a/@b;

InnoDB刷脏页速度策略:

InnoDB刷脏页速度策略

测试磁盘随机读写的命令:fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest
redo log状态图:

redo log状态图

更新和flush过程:

image.png

版权声明:
作者:倾城
链接:https://www.techfm.club/p/48639.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>