关于MySQL latch争用深入分析与判断
1、latch锁是什么锁?
7、如何降低latch争用?
一、latch锁是什么锁
1、定义
latch锁是内存锁,是一个小型的在内存中保护list的内存锁结构。
2、特点
1、不排队
2、spin,一个线程想获得一个锁,但是该锁已被另一线程持有,进行spin(空转随机时间)占用cpu间接性的等待锁的释放,然后获取去进行相关操作。
3、os waits:sleep,spin多次仍然spin
4、cpu繁忙,latch争用
Q:什么是锁?
A:
1、用来保护共享资源,支持并发
2、锁会影响并发
3、latch锁、lock锁
二、latch锁是如何保护list
1、“保护”过程分析
1、访问页先需要访问链
2、修改list不等于修改页
3、什么时候修改list
1、物理读,将数据页挂到list上
2、内存读、修改数据页,修改链
4、锁,其实就是一个内存空间,有结构有数据的内存数据块
s:R共享锁
x:W排它锁
5、锁的兼容性
1、但凡有x锁,排它,就不兼容。
2、latch锁排它就会造成latch争用。
注:mutex互斥锁:针对并发量不是很大的资源。
2、原理图分析

三、latch争用的现象和过程
1、latch争用现象
1、latch争用会表现为cpu繁忙
2、latch争用没有排队,等一段随机的时间再回来看一看
2、latch争用过程
1、链上有一个链的保护机制latch,小内存结构;
2、这时候有读的线程A上来要读取链,这个时候这个管理就变成r(读锁),当在链上找到数据页的时候(读),一找到就释放读锁;
3、B上来也要读取,这个时候一看是r,读锁是可以共享的,它也对链进行访问读取;
4、C上来要修改链中的两个块的内容,一看是r,r和w是互斥的,不能同时进行,要么
1、主动要求退出cpu;
2、空占着cpu资源(执行一段空代码,loop,隔一段时间看看A和B有没有使用完(spin),但是在这个过程中因为C没有排队等待,所以可能在等待的过程中又有其他的线程上来霸占链(不排队的坏处),如果执行多次仍这样,可能就sleep,退出cpu了,sleep,产生os waits)。
5、为什么空占(害怕os看它闲着把它强行拖出去)
6、等(因为它知道A和B占用资源时间比较短,就是遍历一条链的时间非常短)
四、latch什么时候会产生严重的争用
1、异常SQL:往往意味着latch争用
大量的物理读:修改链
大量的内存读:遇到修改链的冲突
2、内存访问频繁(不停找),其实也是异常SQL造成的。
3、list太长
链上挂10000个块,被持有的几率太大……
mysql> show variables like 'i%instances';
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| innodb_buffer_pool_instances | 1 |
+------------------------------+-------+
1 row in set (0.00 sec)
所以,有时候会增加instance的数量,把大pool切成小的pool,让list链变的短一些。
五、如何监控latch争用情况
1、对于MySQL 5.7
mysql> show engine innodb status\G
……
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 23
OS WAIT ARRAY INFO: signal count 14
RW-shared spins 0, rounds 73, OS waits 5
RW-excl spins 0, rounds 1114, OS waits 5
RW-sx spins 0, rounds 0, OS waits 0
Spin rounds per wait: 73.00 RW-shared, 1114.00 RW-excl, 0.00 RW-sx
rounds:表示spin一次空转多少圈,也就是返回来询问的次数
OS waits:表示sleep,当突然增长比较快时,说明latch争用比较严重
1、如果OS waits值比较高,说明出现latch争用,异常SQL
2、获取latch的代价:73.00 RW-shared, 1114.00 RW-excl
2、对于MySQL 5.6
mysql> show engine innodb status\G
……
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 29758
OS WAIT ARRAY INFO: signal count 29148
Mutex spin waits 1054508, rounds 427812, OS waits 2104
RW-shared spins 26703, rounds 800527, OS waits 26673
RW-excl spins 68, rounds 27115, OS waits 888
Spin rounds per wait: 0.41 mutex, 29.98 RW-shared, 398.75 RW-excl
Mutex spin waits:可以理解成misses,空转cpu
Mutex是互斥锁、RW-shared是共享锁、RW-excl是排它锁
六、确认latch争用类型
mysql> show engine innodb mutex;
+--------+-----------------------------+----------+
| Type | Name | Status |
+--------+-----------------------------+----------+
| InnoDB | rwlock: dict0dict.cc:2687 | waits=1 |
| InnoDB | rwlock: dict0dict.cc:1184 | waits=13 |
| InnoDB | rwlock: log0log.cc:844 | waits=35 |
| InnoDB | sum rwlock: buf0buf.cc:1457 | waits=4 |
+--------+-----------------------------+----------+
4 rows in set (0.16 sec)
利用show engine innodb mutex;来解决latch和mutex问题。
[root@localhost ~]# find / -name dict0dict.cc
/usr/src/debug/percona-xtrabackup-2.4./storage/innobase/dict/dict0dict.cc
/usr/local/src/mysql-5.7./storage/innobase/dict/dict0dict.cc
[root@localhost ~]# cat /usr/local/src/mysql-5.7./storage/innobase/dict/dict0dict.cc #查看源码信息,看其latch争用类型具体描述
七、如何降低latch争用
1、优化SQL,降低对内存读的数量,效果比较明显。
2、增加innodb_buffer_pool_instances的数量。对于具有大内存的64位系统,可以将缓冲池拆分成多个实例(默认8个),把需要缓冲的数据hash到不同的缓冲池中,这样可以并行的内存读写,以最大限度地减少并发操作中内存结构的争用。
关于MySQL latch争用深入分析与判断的更多相关文章
- 关于Latch争用
Latch是什么 Latch是SQL Server引擎保证内存中的结构的一致性的轻量同步机制.比如索引,数据页和内部结构(比如非叶级索引页).SQL Server使用Buffer Latch保 ...
- [转帖]MySQL latch小结
MySQL latch小结 https://www.cnblogs.com/liang545621/p/9439816.html 学习一下 一个是数据库内容 一个是内存内容 与oracle的读写锁 应 ...
- 转:Mysql float类型where 语句判断相等问题
原文地址:https://www.2cto.com/database/201111/111983.html 原文内容如下: Mysql where 语句中有float 类型数据判断相等时,检索不出记录 ...
- mysql--SQL编程(关于mysql中的日期,实例,判断生日是否为闰年) 学习笔记2.1
关于日期处理的实例: 从mysql给出的 example 这个是官方源码下载以及导入,http://dev.mysql.com/doc/employee/en/employees-installati ...
- mysql中的NULL的判断
mysql> delete from `zhangchao` where x='NULL'; rows affected (0.00 sec) mysql> delete from ` ...
- mysql中的ifnull()函数判断空值
我们知道,在不同的数据库引擎中,内置函数的实现.命名都是存在差异的,如果经常切换使用这几个数据库引擎的话,很容易会将这些函数弄混淆. 比如说判断空值的函数,在Oracle中是NVL()函数.NVL2( ...
- mysql在插入数据前判断是否存在数据
记录一次mysql插入数据的操作,要先判断表中是否存在对应的值. 以往我们的操作都是先select,再insert,今天给大家分享另一种操作,一条sql语句来实现: inset into user(u ...
- mysql 中 isnull 和 ifnull 判断字段是否为null
对于统计count(type)和avg(type) 都不起作用 SQL中有ISNULL方法,介绍如下: ISNULL使用指定的替换值替换 NULL. 语法ISNULL ( check_expressi ...
- MySQL定位锁争用比较严重的表
1:查看当前的事务 mysql> SELECT * FROM information_schema.innodb_trx \G 2:查看当前锁定的事务 mysql> SELECT * FR ...
随机推荐
- AngularJS高级程序设计读书笔记 -- 指令篇 之 内置指令
1. 内置指令(10-12 章) AngularJS 内置超过 50 个内置指令, 包括 数据绑定,表单验证,模板生成,时间处理 和 HTML 操作. 指令暴露了 AngularJS 的核心功能, 如 ...
- .htaccess伪静态(URL重写)绑定域名到子目录实现子站点
Apache主机一般支持.htaccess伪静态,即可以实现绑定域名到子目录.一个空间多个站点. 应用举例:绑定htaccess.800m.net到htaccess目录 根目录下.htaccess内容 ...
- dos命令窗口修改编码,CMD编码修改方法
dos命令窗口修改编码,CMD编码修改方法 第一步,打开命令窗口有两种方法第一种:可以点击左下角的开始按钮,在运行里面输入CMD,然后敲回车2第二种:组合键WIN+R键,组合键后就会弹出窗口,然后输入 ...
- [leetcode-535-Encode and Decode TinyURL]
TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/desi ...
- 开始JAVA编程的敲门砖——JAVA开发环境搭建
从头开始的java编程--JAVA开发环境搭建 一.什么是java的开发环境? 顾名思义java的开发环境是提供并保证整个java程序开发运行的必要的环境,搭建java开发环境是开始java编程的敲门 ...
- MySQL(二)--事务与视图
一.事务 1.提交 2.回滚 3.ACID特性 二.视图 1.创建视图 2.删除视图 3.更新视图 4.使用视图 三.子查询 1. 使用子查询 2. 标量子查询 3. 关联子查询 一.事务 在 RDB ...
- maven仓库--搭建局域网私服(windows版)
使用nexus搭建局域网私服 一. 认识maven仓库 1.1 maven仓库的作用 回想之前不用maven的时候,我们用eclipse原始的项目骨架构建项目时,在工程目录下往往有一个lib文件夹 ...
- 算法起步之kmp算法
[作者Idlear 博客:http://blog.csdn.net/idlear/article/details/19555905] 这估计是算法连载文章的最后几篇了,马上就要 ...
- 把编译安装的httpd 实现服务脚本,通过service和chkconfig 进行管理
把编译安装的httpd 实现服务脚本,通过service和chkconfig 进行管理 1 编译安装httpd 把httpd编译安装在/app/httpd/目录下. 2 在/etc/rc.d/init ...
- Watson Explorer Analytical Components 2
Content Analytics architecture 1. Crawlers: extract content from the various enterprise data sources ...