什么是latch?latch与lock的区别
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
以上是什么是latch?latch与lock的区别的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

MySQL是一种开源的关系型数据库管理系统,主要用于快速、可靠地存储和检索数据。其工作原理包括客户端请求、查询解析、执行查询和返回结果。使用示例包括创建表、插入和查询数据,以及高级功能如JOIN操作。常见错误涉及SQL语法、数据类型和权限问题,优化建议包括使用索引、优化查询和分表分区。

MySQL在数据库和编程中的地位非常重要,它是一个开源的关系型数据库管理系统,广泛应用于各种应用场景。1)MySQL提供高效的数据存储、组织和检索功能,支持Web、移动和企业级系统。2)它使用客户端-服务器架构,支持多种存储引擎和索引优化。3)基本用法包括创建表和插入数据,高级用法涉及多表JOIN和复杂查询。4)常见问题如SQL语法错误和性能问题可以通过EXPLAIN命令和慢查询日志调试。5)性能优化方法包括合理使用索引、优化查询和使用缓存,最佳实践包括使用事务和PreparedStatemen

选择MySQL的原因是其性能、可靠性、易用性和社区支持。1.MySQL提供高效的数据存储和检索功能,支持多种数据类型和高级查询操作。2.采用客户端-服务器架构和多种存储引擎,支持事务和查询优化。3.易于使用,支持多种操作系统和编程语言。4.拥有强大的社区支持,提供丰富的资源和解决方案。

Apache 连接数据库需要以下步骤:安装数据库驱动程序。配置 web.xml 文件以创建连接池。创建 JDBC 数据源,指定连接设置。从 Java 代码中使用 JDBC API 访问数据库,包括获取连接、创建语句、绑定参数、执行查询或更新以及处理结果。

在 Docker 中启动 MySQL 的过程包含以下步骤:拉取 MySQL 镜像创建并启动容器,设置根用户密码并映射端口验证连接创建数据库和用户授予对数据库的所有权限

MySQL在Web应用中的主要作用是存储和管理数据。1.MySQL高效处理用户信息、产品目录和交易记录等数据。2.通过SQL查询,开发者能从数据库提取信息生成动态内容。3.MySQL基于客户端-服务器模型工作,确保查询速度可接受。

Laravel 是一款 PHP 框架,用于轻松构建 Web 应用程序。它提供一系列强大的功能,包括:安装: 使用 Composer 全局安装 Laravel CLI,并在项目目录中创建应用程序。路由: 在 routes/web.php 中定义 URL 和处理函数之间的关系。视图: 在 resources/views 中创建视图以呈现应用程序的界面。数据库集成: 提供与 MySQL 等数据库的开箱即用集成,并使用迁移来创建和修改表。模型和控制器: 模型表示数据库实体,控制器处理 HTTP 请求。

优雅安装 MySQL 的关键在于添加 MySQL 官方仓库。具体步骤如下:下载 MySQL 官方 GPG 密钥,防止钓鱼攻击。添加 MySQL 仓库文件:rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm更新 yum 仓库缓存:yum update安装 MySQL:yum install mysql-server启动 MySQL 服务:systemctl start mysqld设置开机自启动
