腾讯云布道师:一次性能峰值提升10W的DB调优之旅
当事务执行时,凡是大于low_limit_id 的数据对于事务是不可见的,凡是事务小于 high_limit_id 的数据都是可见的,事务 ID 是 read_view 数组中的某一个时也是不可见的,Purge thread 在执行 Purge 操作时,凡是小于 low_limit_no 的数据,都是可以被 Purge 的,read view 是 MySQL MVCC 实现的基础. 为什么会有大量的线程阻塞事务创建时的步骤如下:
由于read_view 的创建和销毁都需要获取 trx_sys->mutex,当并发量很大的时候,事务链表会比较长,又由于遍历本身也是一个费时的工作,所以此处便成为了瓶颈,既然我们遇到了这个问题,那么社区应该也有类似的问题. read view 问题解决过程首先,我们看一下bug#49169(https://bugs.mysql.com/bug.php?id=49169),read_view_open_now is inefficient with many concurrent sessions,即当并发量很大时 read_view_open_now 效率低下的问题,问题的原因主要有以下几个:
该 bug 从 MySQL 5.1 的时候被 mrak 大神提出以来,一直到 MySQL 5.7 才被官方完整的解决,其中的解决过程也挺曲折的,另外 Percona 在 5.5 的时候就也推出了解决问题的办法,实现也相对简单好多,但没有 MySQL 5.7 方法的彻底,咱们分别看一下这两种解决方法以及 CDB 内核在这方面的改动. Percona read view 问题改进Percona 为了解决上述描述的问题,对trx_sys做了以下修改:
做了上面的调整后,事务在创建过程中则不需要遍历 trx_sys->trx_list(version 5.5),直接使用 memcpy 即可获得活跃事务的ID,并且缓存的使用也大大减少了内存的不必要分配; 更详细的信息及源码可以参考 Alexey (sysbench owner,MySQL 另一大神)提交的代码,commit message 详情如下: (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |