什么是latch?latch与lock的区别

冬伟同学_6456

冬伟同学_6456

2017-06-20

9500人浏览

原创

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

MySQL8 CRM Schema Design Expert
MySQL8 CRM Schema Design Expert

面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。

下载

确认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

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

60

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

40

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

120

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

140

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

120

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

80

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

40

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

80

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

40

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 193人学习