MySQL8.0 - InnoDB里的Latch定义-阿里云开发者社区

开发者社区> zhaiwx_yinfeng> 正文

MySQL8.0 - InnoDB里的Latch定义

简介:
+关注继续查看

最近在看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类做进一步的判断

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
每周问答精选:PolarDB for PostgreSQL 开源版和阿里云上的版本是同一版本吗?
为了方便各位小伙伴能够方便、快速的了解到 PolarDB 开源数据库的相关的使用问题,社区每周将精选群内高质量的问题通过该栏目予以统一答复,希望能够对大家有所帮助。
4 0
【Elastic Engineering】Elasticsearch:Runtime fields 入门, Elastic 的 schema on read 实现 - 7.11 发布
Elasticsearch:Runtime fields 入门, Elastic 的 schema on read 实现 - 7.11 发布
6 0
创业公司CTO谈创业公司技术选型
创业公司CTO谈创业公司技术选型
4 0
+关注
zhaiwx_yinfeng
MySQL内核开发者, 《高性能MySQL 第三版》译者之一,活跃于MySQL社区,BugList,etc...
224
文章
5
问答
来源圈子
更多
阿里云数据库:帮用户承担一切数据库风险,给您何止是安心!支持关系型数据库:MySQL、SQL Server、PostgreSQL、PPAS(完美兼容Oracle)、自研PB级数据存储的分布式数据库Petadata、自研金融级云数据库OceanBase支持NoSQL数据库:MongoDB、Redis、Memcache更有褚霸、丁奇、德哥、彭立勋、玄惭、叶翔等顶尖数据库专家服务。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载