MySQL中的latch(闩锁)详解——易产生的问题以及原因分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL中的latch(闩锁)详解——易产生的问题以及原因分析相关的知识,希望对你有一定的参考价值。

Latch

什么是latch:

  锁是数据库系统区别与文件系统的一个关键特性。锁机制用于管理对共享资源的并发访问。Innodb存储引擎在行级别上对表数据上锁,这固然不错。但是Innodb也会在多个地方使用锁,从而允许多种不同资源提供并发访问。例如,操作缓冲池汇总的LRU列表,删除、添加、移动LRU列表中的元素,为了保证一致性,必须有锁的介入,这就是latch锁。

latchlock的区别

  latch一般称为闩锁(轻量级别的锁),因为其要求锁定的时间必须非常短。若持续的时间长,则应用的性能会非常差。在Innodb存储引擎中,latch又可以分为mutex(互斥量)和RW-Lock(读写锁)。

lock对象是事务,用来锁定的是数据库中的对象,如表、行、页。并且一般lock的对象仅在事务commitrollback后进行释放(不同事务隔离级别释放的时间可能不同)。此外,lock,正如在大多数数据库中一样,是有死锁机制的。

技术分享

同过show engine innodb mutex 进行查看latch

 技术分享

name列显示的是latch的信息以及源码所在的位置(行数)。

latch的分类

分为:mutex:互斥量;有时候有些资源需要共享和并发,但是又不是分频繁,所以向操作系统申请一个mutexmutex都是排他的。

     RW-LATCH : 读写锁

latch的理解:

一个例子:

当我们在执行select 时,数据是缓存在buffer pool中的,多个线程并发访问或者修改这个数据必然需要一个并发控制机制,这个就是latch

数据库要访问的数据必须先存在缓存中,而缓存一般比磁盘空间要小,数据缓冲使用hash表来记录数据页是否在内存中。在mysql中对应的RW-Latcherrlog中说的很清楚,该RW-Latch是在buf0sea.cc658行创建的RW-Latch

 

errorlog 的压测示例:

 技术分享

根据日志我们可以分析到线程140140355766016要对记录加一个x锁,但是等待线程0x4c407b8线程的RW-Latch的释放。

 技术分享

latch争用过程

1a x访问链表

2b 排队等待x解锁  占了cpu,但是cpu发现你在等待,所以cpub踢出

3)锁链的时间,就是找数据的时间。

4b知道很a快所以,b不去排队,这是后去spin 也就是空转cpu,然后再去看一下内存数据结构,a是否已解锁

5b转了一圈后,在bspin的时间段的时间中,c进来了,连续多次的spin后, 产生了os waits

6)操作系统将bcpu中踢出

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上来要修改链中的两个块的内容,一看是rrw是互斥的,不能够同时进行,要么

1、主动要求退出cpu

2、空占着cpu资源(执行一段空代码,loop,隔一段时间看看ab有没有使用完(spin),但是在这个过程中因为c没有排队等待,所以可能在等待的过程中又有其他的线程上来霸占链,如果执行多次仍这样,可能就sleep,退出cpu了)为什么空占(害怕操作系统看她闲的把他强行拖走),等(因为他知道ab占用了资源时间比较短,就是遍历一条链的时间非常短)。

latch争用的现象:

1latch争用会表现为cpu繁忙

2latch争用没有排队,等一段随机的时间再回来看一看

监控指标

----------

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、内存访问太频繁(不停地找)

2list链太长(链上挂10000个快,被持有的几率太大)

所以有时候会增加instance的数量,把大pool切成小的pool,让list链变的短一些

如何降低latch争用:

如果出现latch争用比较严重

1.优化sql,降低对内存读的数量——效果比较明显

2.增加instances的数量

如何准确发现解决latch

1.show engine Innodb mutex

2.查看什么类型的latch

3.定位sql

以上是关于MySQL中的latch(闩锁)详解——易产生的问题以及原因分析的主要内容,如果未能解决你的问题,请参考以下文章

mysql的锁

Mysql 锁基础

MySQL中lock与latch的区分

MySQL 有关锁的简单介绍

latch bar lock 三者有啥区别啊?

锁&lock与latch