12 mysql性能抖动
12 mysql性能抖动
sql语句为什么变”慢”了
在介绍WAL机制时,innodb在处理更新语句的时候,只做了写日志这一个磁盘操作,就是redo log,在更新内存写完redo log之后,就返回客户端成功。
当内存数据页和磁盘数据页内容不一致的时候,称这个内存页为”脏页”,内存数据写入磁盘后,内存和磁盘上的数据页的内容一致,称为”干净页”。
平时执行很快的更新操作,其实就是在写日志和内存,而mysql偶尔”抖”一下的那个瞬间,可能就是在刷脏页(flush)。
触发数据库的flush
--1 innodb的redo log写满了,这时候系统会停止所有更新操作,把checkpoint往前推进,redo log留出空间可以继续写。
--2 系统内存不足,当需要新的内存页,而内存不够用的时候,就要淘汰一些数据页,空出内存给别的数据页使用。如果淘汰的是脏页,就要先将脏页写盘
--3 mysql认为系统”空闲”的时候,也要找时间,只要有机会就刷一点”脏页”
--4 mysql正常关闭的时候,mysql会把所有内存的脏页都flush到磁盘上。
每个数据页有两种状态
--一种是在内存里,内存里有肯定是正确的结果,直接返回。
--另一种是内存里没有数据,就可以肯定数据文件上是正确的结果,读入内存后返回。
第一种”redo log写满了,要flush脏页”,这种情况innodb要尽量避免,如果出现这种情况,整个系统就不能再接受更新了,所有的更新就必须堵住,从监控上看,更新数为0.
第二种”内存不够用了,要先将脏页写到磁盘”,这种情况其实是常态,innodb用缓冲池(buffer pool)管理内存,缓冲池的内存页有三种状态
--1 还没有使用的
--2 使用了并且是干净页
--3 使用了并且是脏页
Innodb是如何区分一个页是脏页还是干净页呢?在每个数据页的头部有LSN,8个字节,每次修改都会变大,对比这个lsn跟checkipoint的lsn,比checkpoint小的一定是干净页。
Innodb的策略是尽量使用内存,因此对于一个长时间运行的库来说,未被使用的页会很少。
当要读入的数据不在内存时就必须要缓冲池中申请一个数据页,这时候只能把最久不使用的数据页从内存中淘汰掉,如果要淘汰的是一个干净页,就直接释放出来复用,如果是脏页就必须将脏页刷到磁盘,变成干净页后才能复用。
但是出现下面的情况会明显影响性能
--1 一个查询要淘汰的脏页个数太多,会导致查询的响应时间明显变长
--2 日志写满,更新全部堵住,写性能为0,对敏感业务来说,是明显不能接受的。
所以,innodb需要有控制脏页比例的结构来避免这样的情况
Innodb刷脏页的控制策略
要正确的告诉innodb主机的io能力,这样innodb才能知道需要全力刷脏页的时候,可以多块,参数innodb_io_capacity,这个值建议设置磁盘的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的刷盘速度需要参考这两个因素:一个是脏页比例,一个是redo log写盘速度。
参数innodb_max_dirty_pages_pct是脏页比例上限,默认75%,innodbUI根据当前的脏页比例,算出一个范围在0~100直接的数字
Innodb每次写日志有一个序号,当前写入的需要跟checkpoint对应的序号之间的差值,假设为N,innodb会根据这个N算出一个范围在0~100之间的数字,这个N约大,算出的值就越大。
要尽量避免业务端感受到mysql”抖”一下,就要合理的设置innodb_io_capacity的值,并且平时要多关注脏页比例,不要经常接近75%。
脏页比例
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;
(system@127.0.0.1:3306) [information_schema]> select @a/@b;
+------------------------+
| @a/@b |
+------------------------+
| 0.00004577729852902281 |
+------------------------+
1 row in set (0.00 sec) (system@127.0.0.1:3306) [information_schema]> show global status like 'Innodb_buffer_pool_pages_dirty';
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| Innodb_buffer_pool_pages_dirty | 40 |
+--------------------------------+-------+
1 row in set (0.00 sec) (system@127.0.0.1:3306) [information_schema]> show global status like 'Innodb_buffer_pool_pages_total';
+--------------------------------+--------+
| Variable_name | Value |
+--------------------------------+--------+
| Innodb_buffer_pool_pages_total | 393208 |
+--------------------------------+--------+
1 row in set (0.00 sec) (system@127.0.0.1:3306) [information_schema]> show variables like 'innodb_io_capacity';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| innodb_io_capacity | 400 |
+--------------------+-------+
1 row in set (0.00 sec) (system@127.0.0.1:3306) [information_schema]> show variables like 'innodb_max_dirty_pages_pct';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| innodb_max_dirty_pages_pct | 60 |
在看一个策略
一旦一个查询请求需要在执行过程中先flush掉一个脏页时,这个查询就可能比平时慢了,而mysql中的一个机制可能让你的查询会更慢,
在准备刷一个脏页的时候,如果这个数据页旁边的数据刚好是脏页,就会把这个”邻居”也带着一起刷掉;而这个把邻居一起的逻辑还可以继续蔓延,也就是对于每个邻居数据页,如果跟它相邻的数据页也还是脏页的话,也会被放到一起刷
在innodb中,参数innodb_flush_neighbors用来控制这个行为,值为1的时候有上述刷邻的行为,为0的时候表示不找自己邻居,只刷自己。
这个找邻的优化在机械硬盘时代还是很有意义,可以减少很多随机的io,机械硬盘的iops一般只有几百,相同的逻辑操作减少随机io就意味着系统性能的大幅度提升,
而如果使用ssd这类iops较高的设备的话,建议把该参数设置为0,在mysql 8.0,参数innodb_flush_neighbors默认为0.
思考题
一个内存未128GB,innodb_io_capacity设置为20000的大规格实例,正常建议会将redo log设置为4个1GB文件,但是如果在配置的时候不慎将redo log设置成了1个100M的文件,会发生什么情况?又为什么会出现这样的情况呢?
12 mysql性能抖动的更多相关文章
- MySQL性能调优与架构设计——第12章 可扩展设计的基本原则
第12章 可扩展设计的基本原则 前言: 随着信息量的飞速增加,硬件设备的发展已经慢慢的无法跟上应用系统对处理能力的要求了.此时,我们如何来解决系统对性能的要求?只有一个办法,那就是通过改造系统的架构体 ...
- MySQL Disk--SSD磁盘性能抖动问题
============================================================= SSD性能 空盘性能:SSD出厂时磁盘没有任何数据情况下的性能 稳态性能:当 ...
- MySQL性能调优与架构设计——第10章 MySQL数据库Schema设计的性能优化
第10章 MySQL Server性能优化 前言: 本章主要通过针对MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化, ...
- [原] KVM 环境下MySQL性能对比
KVM 环境下MySQL性能对比 标签(空格分隔): Cloud2.0 [TOC] 测试目的 对比MySQL在物理机和KVM环境下性能情况 压测标准 压测遵循单一变量原则,所有的对比都是只改变一个变量 ...
- Mysql性能优化三(分表、增量备份、还原)
接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ...
- MYSQL性能优化的最佳20+条经验
MYSQL性能优化的最佳20+条经验 2009年11月27日 陈皓 评论 148 条评论 131,702 人阅读 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数 ...
- paip.mysql 性能跟iops的以及硬盘缓存的关系
paip.mysql 性能跟iops的以及硬盘缓存的关系 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.c ...
- 二十种实战调优MySQL性能优化的经验
二十种实战调优MySQL性能优化的经验 发布时间:2012 年 2 月 15 日 发布者: OurMySQL 来源:web大本营 才被阅读:3,354 次 消灭0评论 本文将为大家介 ...
- 数据库相关文章转载(1) MySQL性能优化之参数配置
1.目的: 通过根据服务器目前状况,修改Mysql的系统参数,达到合理利用服务器现有资源,最大合理的提高MySQL性能. 2.服务器参数: 32G内存.4个CPU,每个CPU 8核. 3.MySQL目 ...
随机推荐
- 第十五届四川省省赛 SCU - 4439 Vertex Cover
给你一个一般图 保证每条边的一端下标不大于30 问最小覆盖集的大小为多少 爆搜:枚举前30个点是否在覆盖集内 剪枝1:如果不在的话 那么他所连的下标大于30的点都必须选 剪纸2:最优解剪枝 #incl ...
- Internet层协议下IP协议
Internet层协议特征 运行于 OSI 网络层面向无连接的协议独立处理数据包分层编址尽力而为传输无数据恢复功能 Internet层主要包含IP.ICMP.ARP.RARP几个协议. 这一主要说IP ...
- Javaweb运行时出现Tomcat错误
运行web项目时出现如下错误如何解决 重新配置路径,具体可参考 https://www.cnblogs.com/xueqiuxiang/p/12087947.html 中提到的配置Tomca ...
- MariaDB使用enum和set
1.enum 单选字符串数据类型,适合存储表单界面中的“单选值”. 设定enum的时候,需要给定“固定的几个选项”:存储的时候就只存储其中的一个值. 设定enum的格式: enum("选项1 ...
- CodeForces 788A - Functions again [ DP ]
反着求一遍最大连续子序列(前项依赖) #include <bits/stdc++.h> using namespace std; #define LL long long ; int n; ...
- 第十一天 unittest参数化模块
unittest的工作原理:一下例子简单的描述了整个过程 def calc(a,b): return a//b import unittest,HTMLTestRunner import Beauti ...
- MVVM(使用Prism框架)开发WPF
[MVVM]目的是为了分离视图(View)和模型(Model)的耦合——解耦 1.View负责前端展示,与ViewModel进行数据和命令的交互.(双向的数据属性传递,单向的命令属性传递View→Vi ...
- Laravel Artisan Tinker: The optimize Command
Laravel Artisan Tinker: The optimize Command December 7, 2016 Laravel JOHN KOSTER The optimize comma ...
- 《剑指offer》算法题第十二天
今天是<剑指offer>算法题系列的最后一天了,但是这个系列并没有包括书上的所有题目,因为正如第一天所说,这些代码是在牛客网上写并且测试的,但是牛客网上并没有涵盖书上所有的题目. 今日题目 ...
- Java进阶知识01 Struts2下的 jquery+ajax+struts 技术实现异步刷新功能
1.效果图示 横线上方的部分不动(没有刷新),下方实现刷新(异步刷新) 2.实现步骤 jquery+ajax+struts技术实现异步刷新功能的步骤: 1.需要用到 jquery+ajax+st ...