MySQL8.0 - InnoDB里的Latch定义

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS PostgreSQL,高可用版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介:

最近在看InnoDB关于mutex定义部分的代码,由于之前一直工作在MySQL5.6版本里,发现从5.7开始到8.0,这部分代码已经完全进行了重构,本文主要简单记录下新款latch的定义和使用方式。主要记录下涉及的函数和类,不做具体的深入

首先mutex的定义分为三个部分:

PolicyMutex:定义了mutex的接口,包括

enter();
exit();
try_lock();
init();
...

PolicyMutex私有成员m_impl,通过模板实例化为具体的实现方式:

TTASFutexMutex<GenericPolicy>   FutexMutex
TTASFutexMutex<BlockMutexPolicy>  BlockFutexMutex
TTASMutex<GenericPolicy>    SpinMutex
TTASMutex<BlockMutexPolicy>  BlockSpinMutex
OSTrackMutex<GenericPolicy>  SysMutex
OSTrackMutex<BlockMutexPolicy>  BlockSysMutex
TTASEventMutex<GenericPolicy>  SyncArrayMutex
TTASEventMutex<BlockMutexPolicy> BlockSyncArrayMutex

可以看到,这里定义了4种Mutex,两种policy,前者是Mutex的具体实现,后者用于跟踪mutex的counter信息

4种mutex包括:

TTASFutexMutex:

  • enter: 首先spin通过cas检查锁状态,如果无法通过原子操作获得锁,则调用wait()使用futex进入等待:
syscall(SYS_futex, &m_lock_word, FUTEX_WAIT_PRIVATE, MUTEX_STATE_WAITERS,
              0, 0, 0);
//原子检查m_Lock_word是否为MUTEX_STATE_WAITERS, 如果是,则休眠
  • exit:释放锁后,如果有等待的线程,同样通过syscall去唤醒
syscall(SYS_futex, &m_lock_word, FUTEX_WAKE_PRIVATE, 1, 0, 0, 0);

futex运行于用户态, 是fast usetablespace mutex的缩写, 对于冲突较小的互斥锁,运行于用户态可以减少内核层切换的开销,futex说明文档

TTASMutex:

  • 纯粹的spin loop循环,直到成功加锁(即成功通过原子操作修改lock_word为locked状态)
  • 适用于竞争很少的场景

TTASEventMutex

  • 传统的Innodb实现方式
  • 先spin一段时间,如果一直枷锁失败,则进入condition wait,等待被唤醒

OSTrackMutex:

  • 就是封装了pthread_mutex
  • 适用于冲突比较剧烈的锁场景

两种Policy

  • GenericPolicy:适用于只有一个对应的mutex,也就是一个Latch id只对应一个锁对象
  • BlockMutexPolicy:用于追踪block mutex,由于涉及到大量的block mutex,对这类锁的counter跟踪需要进行聚合
  • 每个latch有一个policy,每个policy维持一个counter(LatchCounter), 记录了latch spin_loop, spin_wait及调用的次数
  • Policy的成员m_counter会被注册到latch_meta::m_counter中

LatchMeta:

  • 为了管理和聚合counter信息,每类Latch对应一个Id, 通过id找到对应的latch_meta_t, 其中LatchMeta维护了锁的id, latch level等信息;
  • 存储在数组LatchMetaData中,下标为latch id

CreateTracker:

  • 所有的Latch对象被注册到这个类中

我们知道,在debug模式下,innodb还实现了一套机制,也就是通过sync level, 来判断是否违背了加锁顺序,如果有的话,在debug模式下会assert,提示有潜在的deadlock风险

这里涉及到三个类:

  • MutexDebug: 通过Policy类调用其成员函数
  • 在进入一个latch时, 生成一个context(MutexDebug的私有类)存储当前的所信息
  • context被传到函数sync_check_lock_validate中,通过LatchDebug类做进一步的判断
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
|
1月前
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.3-InnoDB中的锁
【MySQL技术内幕】6.3-InnoDB中的锁
160 57
|
8天前
|
存储 关系型数据库 MySQL
MySQL InnoDB存储引擎的优点有哪些?
上述提到的特性和优势使得InnoDB引擎非常适合那些要求高可靠性、高性能和事务支持的场景。在使用MySQL进行数据管理时,InnoDB通常是优先考虑的存储引擎选项。
13 0
|
1月前
|
存储 关系型数据库 MySQL
关系型数据库mysql的InnoDB
【6月更文挑战第17天】
21 3
|
1月前
|
存储 算法 关系型数据库
【MySQL技术内幕】5.7- InnoDB存储引擎中的哈希算法
【MySQL技术内幕】5.7- InnoDB存储引擎中的哈希算法
23 1
|
1月前
|
关系型数据库 MySQL 调度
深入理解MySQL InnoDB线程模型
深入理解MySQL InnoDB线程模型
|
1月前
|
存储 关系型数据库 MySQL
mysql的InnoDB引擎实现ACID特性的原理
mysql的InnoDB引擎实现ACID特性的原理
|
1月前
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.1-锁、lock和latch
【MySQL技术内幕】6.1-锁、lock和latch
29 0
|
2月前
|
存储 监控 关系型数据库
MySQL 参数innodb_read_io_threads
`innodb_read_io_threads` 是 MySQL 数据库中 InnoDB 存储引擎的一个配置参数,它用于指定后台线程池中用于处理读取 I/O 请求的线程数量。InnoDB 存储引擎负责管理数据库的物理存储和检索,是 MySQL 最常用的存储引擎之一。 ### 参数说明 - **名称**: `innodb_read_io_threads` - **默认值**: 4 - **范围**: 1 到 64 - **动态修改**: 不能动态修改(需要重启服务器) - **适用版本**: MySQL 5.6 及以上版本 ### 作用 `innodb_read_io_threads`
221 1
|
1月前
|
存储 算法 关系型数据库
【MySQL技术内幕】4.4-InnoDB数据页结构
【MySQL技术内幕】4.4-InnoDB数据页结构
40 1

相关产品

  • 云数据库 RDS MySQL 版