首页
登录 | 注册

MySQL学习分享--trx_sys事务锁之争

基于《MySQL学习分享--MySQL 5.7性能改进》文中提到的事务锁的优化,MySQL5.6之前,trx_sys事务锁一直是影响性能的主要因素。在应用中也会经常发现系统资源利用不起来,追查的结果往往是trx_sys事务锁的原因。根据以上线索,继续探索MySQL的事务的改进之路和性能之争。

4、《trx descriptors: MySQL performance improvements in Percona Server 5.5.30-30.2

Percona5.5.30版本中,对MySQL事务锁性能低的原因进行了详细描述,具体如下。大体意思是说,innodb在每个事务中,需要扫描当前已经打开的事务列表trx_list,并拷贝没有提交的事务ID。在扫描事务列表trx_list时,会使用kernel_mutex加锁,这也是性能的最大瓶颈之处。

Whenever a connection wants to create a consistent read, it has to make a snapshot of the transaction states to determine which transactions are seen in 
the view later. To this end, InnoDB scans trx_list (i.e. the list of currently open transactions) and copies IDs of transactions that have not yet been committed at 
the current point in time, and thus should not be visible in the consistent read. For the REPEATABLE_READ isolation level, the snapshot is created on the first 
SELECT for each transaction. For lower isolation levels it is created for each SELECT, even within the same transaction.

   基于以上发现,对扫描事务列表进行了优化,减少了扫描和拷贝,提高MySQL的性能。并且文中指出,MySQL 5.6虽然在trx_sys事务锁方面进行了大量的改进和优化,但只是在只读事务场景下,并且需要业务在启动只读事务时,调用START TRANSACTION READ ONLY命令,这样在SELECT查询时,才会不被加锁。

接下来的测试,也表明Percona 5.5.30版本进行的优化,在QPS方面优于官方版本,但低于MySQL 5.6.2版本;在TPS方面也优于官方版本甚至MySQL 5.6.2版本。

5、《MySQL Performance: Analyzing Benchmarks, part 4: TRX list

该文是上一篇文章的回击,主要针对上一篇文章的测试结果进行进一步的验证,文中指出MySQL 5.6Percona 5.5.30版本相比,性能优势明显。由于Percona 5.5.30版本基于MySQL 5.5trx_sys事务锁仍然存在,并且随着线程数的增加,事务锁会不断增加,并没有根治trx_sys问题。但是MySQL 5.6自身仍然存在很大的性能问题,在CPU cores增大时,trx_sys仍然会迅速增加,但是性能仍然优于Percona 5.5.30。测试同时引入了MariaDB 5.5进行了测试,测试结果远远低于MySQL 5.5Percona 5.5.30

通过测试结果,最终的结论是MySQL 5.6远远高于Percona 5.5.30,并没有上一篇文章测试结果中Percona 5.5.30的性能优势。

6、《More on MySQL transaction descriptors optimization

根据上文的质疑,文章5的作者进行了进一步的验证,统一硬件和数据集的问题,验证两个版本的性能差异。测试包括两个部分:首先使用NUMA,排除HT超线程的影响;通过硬件CPU core的不同,进行性能测试。最终测试结论是:Percona 5.5.30优于MySQL 5.6.10。其中一个细节,测试中的内存管理方式都是使用jemalloc,而不是glibcmalloc内存管理方式。关于内存管理方式的性能测试,可以参考之前对jemalloc的测试。

此外,文中指出,MySQL 5.6性能优势只能在完全的RO只读事务场景下,此时的trx_list为空。但是场景过于理想,并不满足应用环境。于是进行了读写事务9:1混合模式下的测试,测试结果表明,MySQL 5.6在读写混合模式下,性能远远低于Percona 5.5.30

7、《MySQL Performance: Analyzing Benchmarks, part 5: TRX list again

针对上一篇文章的回击,本文进行了进一步的验证测试,测试内容从两个角度进行:不同的CPU coreHT超线程的性能情况;相同条件下,数据库的性能比较;在SELECT事务场景下不同并发条件的测试;读写模式下的性能测试。

Percona 5.5.30MySQL 5.6CPU16 HT情况下,性能达到最优,在CPU core32以及32 HT情况下,性能反而更差。从这个角度来说,努力提高硬件的性能,不一定能够获得更高的MySQL数据库性能,这个在机器选型测试时,还是要进行周密的考虑。

16 HT性能最优的场景下,Percona 5.5.30仍然会有较多的trx_sys事务锁影响,并且测试的性能来看,Percona 5.5.30仍然有大量的kernel_mutex锁,并且性能上仍然远远低于MySQL 5.6

SELECT事务场景下,MySQL 5.6的性能影响较大,远远不如Percona 5.5.30。但是Percona 5.5.30测试中也暴露了kernel_mutex锁影响较大,而在MySQL 5.6中已经移除。

在读写混合模式下,测试中引入了Percona 5.6,测试结果表明,Percona 5.6基于MySQL 5.6进行改进,性能优势明显。从而验证MySQL 5.6trx_sys优化方式的有效性,却没有对Percona版本进行采用,原因是没有完全解决trx_sys问题。并透露,在MySQL 5.7中,会优化trx_sys,提高在RW读写场景下,MySQL数据库的性能。

结论

通过以上MySQLtrx_sys事务锁之争,总结如下:

1、MySQL 5.6RO场景下,通过start transaction read only声明为只读事务,性能提高较大。而在事务模式下,性能无明显优势。

2、Percona 5.5.30trx_sys上的改进,不仅提高了RO只读环境下MySQL的性能,而且提高了RW读写混合场景下的性能。

3、Percona 5.6基于MySQL 5.6的改进,适合RW场景,性能优势明显,是目前最佳的方案。

4、CPU core16 HT下,Percona5.5.30MySQL 5.6的性能达到最佳,提示我们努力提高硬件的性能,不一定能够获得更高的MySQL数据库性能。在机型选择时,需要进行测试和验证。

5、MySQL 5.7trx_sys上的巨大改进,适应RW读写场景,降低事务锁,值得期待。

参考

1、《trx descriptors: MySQL performance improvements in Percona Server 5.5.30-30.2》:http://www.mysqlperformanceblog.com/2013/04/12/trx-descriptors-mysql-performance-improvements-in-percona-server-5-5-30-30-2/

2、《MySQL Performance: Analyzing Benchmarks, part 4: TRX list》:http://dimitrik.free.fr/blog/archives/2013/04/mysql-performance-analyzing-benchmarks-part-4-trx-list.html

3、《More on MySQL transaction descriptors optimization》:http://www.mysqlperformanceblog.com/2013/04/26/more-on-mysql-transaction-descriptors-optimization/

4、《MySQL Performance: Analyzing Benchmarks, part 5: TRX list again》:http://dimitrik.free.fr/blog/archives/2013/07/mysql-performance-analyzing-benchmarks-part-5-trx-list-again.html

5、《MySQL性能测试--jemalloc内存管理》:http://blog.chinaunix.net/uid-26896862-id-3865087.html

 



相关文章

  • 紧随<MySQL学习分享 --机型选择和配置>,虽然没有什么太多的反应和关注,但前进的步伐没有停止.小插曲:电脑被儿子摔坏了,突然感觉失去了方向.忍不住到网吧来看技术文章,似乎有些格格不入,粗鲁嘈杂的声音,并没有影响我的专注和文 ...
  • MySQL学习分享--Thread pool
    刚刚经历了淘宝的双11,真实感受到了紧张的氛围.尽管DB淡定的度过,但是历程中的波折,可谓惊心动魄.其中MySQL在大量连接(万级)的场景下,表现出性能远远低于预期,并且出现明显的波动,成为一个非常重要的问题.问题虽然解决,但是后续的思考和 ...
  • 深入理解 MySQL ——锁、事务与并发控制
    目录 2.MySQL 锁 4.隔离级别 6.MySQL 死锁问题 1.MySQL 服务器逻辑架构 每个连接都会在 MySQL 服务端产生一个线程(内部通过线程池管理线程),比如一个 select 语句进入,MySQL 首先会在查询缓存中查找 ...
  • 分享个JAVA学习路线[新手可以参考看下]觉得不好的,大家可以提出来我补充. 第一阶段 技术名称 技术内容 J2SE (java基础部分) java开发前奏 计算机基本原理,Java语言发展简史以及开发环境的搭建,体验Java程序的开发,环 ...
  • MYSQL企业常用架构与调优经验分享
    一.选择Percona Server.MariaDB还是MYSQL 1.Mysql三种存储引擎 MySQL提供了两种存储引擎:MyISAM和 InnoDB,MySQL4和5使用默认的MyISAM存储引擎.从MYSQL5.5开始,MySQL已 ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.013 s.
京ICP备10005923号