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刷脏页速度策略:
测试磁盘随机读写的命令: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状态图:
更新和flush过程:
共有 0 条评论