原理介绍
当MySQL中发生undo tablespace truncation,且目标undo tablespace已较大时,undo_spaces_lock这个读写锁会出现显著的竞争,如下所示。
undo_spaces_lock保护以下数据的并发访问。
- undo::spaces::m_spaces
- undo::space_id_bank
- undo truncation log
purge coordinator线程持undo_spaces_lock写锁期间,DML前台线程阻塞,体现为这段时间的系统吞吐量下降。
分析临界区代码发现,purge coordinator线程池持锁是为了保护undo:: space_id_bank和undo truncation log,并不会修改undo:: spaces::m_spaces;DML前台线程持锁是为了保证查询undo:: spaces::m_spaces时其不被修改,两类线程逻辑本身并无冲突。
本特性的优化思路是,在purge coordinator获得undo_spaces_lock写锁后,undo tablespaces生成快照;后续DML前台线程无需持有undo_spaces_lock读锁,直接查询undo tablespaces快照。purge coordinator线程和DML前台线程之间,通过粒度更小的原子操作进行同步。
图1 undo_spaces_lock优化前

图2 undo_spaces_lock优化后

父主题: undo_spaces_lock优化