mysql之抖动

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql之抖动相关的知识,希望对你有一定的参考价值。

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

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过程:

MySQL存储写入性能严重抖动分析

案例描述:

  通过iostat发现存储的写性能长期维持在10MB左右,而且因为写性能差已经导致数据库性能变差;

  两个小时以后,iostat发现系统的写性能已经能够到100MB以上,数据库性能也恢复正常。

也就是说,在对系统、数据库监控中,出现了性能波谷,存储写入性能严重抖动,为什么?

一、原理过程

由上原理图,进行过程解析:

  1、事务提交,修改buffer_pool中的数据形成脏页,并且同时生成redo日志,将日志写入磁盘redo log中;

  2、事务提交成功;

假设,有三组redo log文件,

  3、继续事务提交,修改数据,写redo log,如果innodb_log_file_size的数值很小,但是产生的redo日志信息很大,这样第一组redo日志很快就会被写满,就要进行日志文件切换;

  4、如果三组redo log文件都被写满了,就需要进行日志覆盖;

  5、如果需要覆盖的redo log日志文件记录的脏页信息还没有写入到磁盘中,数据库就会主动加大写的力度将脏页信息刷到磁盘里;

  6、在将redo日志文件对应的脏页刷入磁盘的过程中,事务没有办法提交,影响业务。

 

二、原理分析

1、通过对redo log的修改时间查看日志文件切换时间

  通过shell> ls -l /mydata/ib_logfile*,查看开始修改的时间和最后修改的时间,计算logfile切换时间。

2、如果redo日志文件切换时间过短,也就是切换频繁,就很容易导致写抖动

  1、正常业务繁忙的会是10-20分钟;

  2、如果是比一般的时间短,说明文件小,切换频繁。

 

三、解决写抖动问题

1、增加redo日志文件数量

mysql> show global variables like \'innodb_log_files_in_group\';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| innodb_log_files_in_group | 2     |
+---------------------------+-------+
1 row in set (0.01 sec)

2、扩大日志文件容量

mysql> show global variables like \'innodb_log_file_size\';
+----------------------+----------+
| Variable_name        | Value    |
+----------------------+----------+
| innodb_log_file_size | 50331648 |
+----------------------+----------+
1 row in set (0.01 sec)

3、提高log file的写性能:将日志文件放到写性能优质的磁盘上

mysql> show global variables like \'innodb_log_group_home_dir\';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| innodb_log_group_home_dir | ./    |
+---------------------------+-------+
1 row in set (0.01 sec)

 注意:

  上面的这三个参数都非动态参数,需要在配置文件/etc/my.cnf中进行修改保存,再重新启动数据库实例才能生效。

@author:http://www.cnblogs.com/geaozhang/

以上是关于mysql之抖动的主要内容,如果未能解决你的问题,请参考以下文章

CSS3动画之按钮抖动

Python数据可视化之绘制抖动的带状图(图文并茂版!!!)

ios核心动画之图片抖动

Mysql实战篇之Mysql抖动现象--04

MySQL存储写入性能严重抖动分析

MySQL存储写入性能严重抖动分析