mysql latch_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 FutexMutex

TTASFutexMutex BlockFutexMutex

TTASMutex SpinMutex

TTASMutex BlockSpinMutex

OSTrackMutex SysMutex

OSTrackMutex BlockSysMutex

TTASEventMutex SyncArrayMutex

TTASEventMutex 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类做进一步的判断

set_level_shifter strategy_name -domain domain_name [-elements port_pin_list] [-exclude_elements exclude_list] [-applies_to inputs | outputs | both] [-applies_to_boundary upper | lower | both] [-threshold float] [-rule low_to_high | high_to_low | both] [-location self | parent | fanout | automatic] [-no_shift] [-force_shift] [-name_prefix prefix_string] [-name_suffix suffix_string] [-update] set_level_shifter –domain domain_name –elements ... [–applies_to ...] set_level_shifter –domain domain_name –applies_to [inputs | outputs] set_level_shifter –domain domain_name map_level_shifter_cell strategy_name -domain power_domain_name -lib_cells list use_interface_cell interface_implementation_name -domain domain_name -lib_cells lib_cell_list -strategy list_of_one_level_shifter_and_or_one_isolation set_isolation isolation_strategy_name -domain power_domain [-elements objects] [-exclude_elements exclude_list] [-applies_to inputs | outputs | both] [-applies_to_boundary upper | lower | both] [-clamp_value 0 | 1 | latch] [-isolation_power_net isolation_power_net] [-isolation_ground_net isolation_ground_net] [-isolation_supply isolation_supply_set] [-source source_supply_set_name] [-sink sink_supply_set_name] [-diff_supply_only true | false] [-no_isolation] [-force_isolation] [-name_prefix prefix_string] set_isolation_control isolation_strategy_name -domain power_domain -isolation_signal isolation_signal load_upf upf_file_name [-supplemental supf_file_name] [-scope string] [-noecho] save_upf upf_file_name [-supplemental supf_file_name] [-include_supply_exceptions] [-full_upf] 解释每一句命令什么意思
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值