MySQL中的latch(闩锁)详解——易产生的问题以及原因分析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL中的latch(闩锁)详解——易产生的问题以及原因分析相关的知识,希望对你有一定的参考价值。
Latch
什么是latch:
锁是数据库系统区别与文件系统的一个关键特性。锁机制用于管理对共享资源的并发访问。Innodb存储引擎在行级别上对表数据上锁,这固然不错。但是Innodb也会在多个地方使用锁,从而允许多种不同资源提供并发访问。例如,操作缓冲池汇总的LRU列表,删除、添加、移动LRU列表中的元素,为了保证一致性,必须有锁的介入,这就是latch锁。
latch与lock的区别
latch一般称为闩锁(轻量级别的锁),因为其要求锁定的时间必须非常短。若持续的时间长,则应用的性能会非常差。在Innodb存储引擎中,latch又可以分为mutex(互斥量)和RW-Lock(读写锁)。
而lock对象是事务,用来锁定的是数据库中的对象,如表、行、页。并且一般lock的对象仅在事务commit或rollback后进行释放(不同事务隔离级别释放的时间可能不同)。此外,lock,正如在大多数数据库中一样,是有死锁机制的。
同过show engine innodb mutex 进行查看latch
name列显示的是latch的信息以及源码所在的位置(行数)。
latch的分类
分为:mutex:互斥量;有时候有些资源需要共享和并发,但是又不是分频繁,所以向操作系统申请一个mutex,mutex都是排他的。
RW-LATCH : 读写锁
latch的理解:
一个例子:
当我们在执行select 时,数据是缓存在buffer pool中的,多个线程并发访问或者修改这个数据必然需要一个并发控制机制,这个就是latch
数据库要访问的数据必须先存在缓存中,而缓存一般比磁盘空间要小,数据缓冲使用hash表来记录数据页是否在内存中。在mysql中对应的RW-Latch在errlog中说的很清楚,该RW-Latch是在buf0sea.cc的658行创建的RW-Latch。
看errorlog 的压测示例:
根据日志我们可以分析到线程140140355766016要对记录加一个x锁,但是等待线程0x4c407b8线程的RW-Latch的释放。
latch争用过程
1)a 以x访问链表
2)b 排队等待x解锁 占了cpu,但是cpu发现你在等待,所以cpu将b踢出
3)锁链的时间,就是找数据的时间。
4)b知道很a快所以,b不去排队,这是后去spin 也就是空转cpu,然后再去看一下内存数据结构,a是否已解锁
5)b转了一圈后,在bspin的时间段的时间中,c进来了,连续多次的spin后, 产生了os waits
6)操作系统将b从cpu中踢出
latch锁特点:
- 1.不排队
- 2.spin
- 3.os waits
- 4.cpu繁忙
mutex:
内存结构 很小 数据库从操作系统申请到的,不占用buffer pool,完全排他
mutex锁的持有过程:
a线程持有想mutex内存数据结构中写一个1
b线程看到内存数据结构有数字, 那么就去spin
确认latch争用类型:
(这就是在源码中的173语句)由errorlog 得到的
latch争用的过程
链表上有一个链的保护机制latch,小内存结构,这时候有读的线程a上来要读取链,这个时候这个管理就变成r,读锁,当在链上找到数据的时候(读),一找到就释放读锁,b上来也要读取,这时候一看是r,读锁是可以共享的,她也是对链进行访问读取的,c上来要修改链中的两个块的内容,一看是r,r和w是互斥的,不能够同时进行,要么
1、主动要求退出cpu
2、空占着cpu资源(执行一段空代码,loop,隔一段时间看看a和b有没有使用完(spin),但是在这个过程中因为c没有排队等待,所以可能在等待的过程中又有其他的线程上来霸占链,如果执行多次仍这样,可能就sleep,退出cpu了)为什么空占(害怕操作系统看她闲的把他强行拖走),等(因为他知道a和b占用了资源时间比较短,就是遍历一条链的时间非常短)。
latch争用的现象:
1、latch争用会表现为cpu繁忙
2、latch争用没有排队,等一段随机的时间再回来看一看
监控指标
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 2
OS WAIT ARRAY INFO: signal count 2
RW-shared spins 0, rounds 4, OS waits 2
RW-excl spins 0, rounds 0, OS waits 0
RW-sx spins 0, rounds 0, OS waits 0
Spin rounds per wait: 4.00 RW-shared, 0.00 RW-excl, 0.00 RW-sx
rounds的意思是每次询问旋转的参数
os waits:表示sleep,当突然增长比较快的时候,说明latch争用比较严重
rw-shared spin 的次数
rw-excl spin的次数
latch争用发生的原因
1、内存访问太频繁(不停地找)
2、list链太长(链上挂10000个快,被持有的几率太大)
所以有时候会增加instance的数量,把大pool切成小的pool,让list链变的短一些
如何降低latch争用:
如果出现latch争用比较严重
1.优化sql,降低对内存读的数量——效果比较明显
2.增加instances的数量
如何准确发现解决latch
1.show engine Innodb mutex
2.查看什么类型的latch
3.定位sql
以上是关于MySQL中的latch(闩锁)详解——易产生的问题以及原因分析的主要内容,如果未能解决你的问题,请参考以下文章