谈谈死锁之三 秒杀场景下开源MySQL性能压测对比

Posted ACMUG

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谈谈死锁之三 秒杀场景下开源MySQL性能压测对比相关的知识,希望对你有一定的参考价值。

3306现金有奖征稿说明:



作者简介:杨德华

微店高级技术专家  前阿里集团数据库技术团队数据库专家,花名应元,经过5年双十一数据库大考验。




前期回顾:

死锁一:

死锁二:



mysql的热点更新场景,对应到业务场景是秒杀系统,热点商品减库存。

MySQL5.7 2016年底发布了GA版本,但大部分公司线上用的还是5.6的版本。Facebook的MyRocks也是基于5.6进行开发,MyRocks未来也直接合并到8.0。

我们今天的分享是基于MySQL5.6.19和Percona5.6.25来进行讨论。

我们对这两个版本,进行了MySQL源码的修改,从Facebook 5.6开源版本里面抽取了关闭死锁检测的补丁,合并到了MySQL5.6.19和Percona5.6.25,并进行了性能压测。


性能压测主要是进行了四个配置的对比

A.MySQL5.6.19 原生版本

B.MySQL5.6.19 增加死锁检测关闭 (5.6.1.9+no deadlock check ndlc)

C.Percona5.6.25 原生版本 (percona+tp)

D.Percona5.6.25增加死锁检测关闭 (percona+tp+nldc)

对这四个版本进行了8,16,32,64,128,512,1024,2048,4096个并发线程的压测。


压测准备

压测工具:sysbench0.5

事务隔离级别均为READ-COMMITTED。 CPU 32cores. BP15G。数据放在SSD,日志放在SAS盘。

表结构和数据准备:由于秒杀和减库存重要的瓶颈之一是在update语句的效率,我们为了简单理解起见,用一个最核心的update语句来做事务。


Percona 线程池参数

set global thread_pool_size=16;

set global thread_pool_oversubscribe=1;

set global innodb_thread_concurrency=32;

CREATE TABLE `test_update` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`stock` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

insert into item.test_update (id,stock) value(1,500000);

更新语句

update test_update set stock =stock -1  where id = 1 and stock >3;



谈谈死锁之三 秒杀场景下开源MySQL性能压测对比

8个客户端下,原生版本的TPS比后面三个场景的TPS要高。但这么少的连接,业务很难会只给这么少连接


谈谈死锁之三 秒杀场景下开源MySQL性能压测对比
16个客户端连接下,原生版本TPS最高


谈谈死锁之三 秒杀场景下开源MySQL性能压测对比

 32个客户端连接下,原生版本TPS最高


谈谈死锁之三 秒杀场景下开源MySQL性能压测对比

64个客户端连接下,原生版本+关闭死锁检测 TPS最高


谈谈死锁之三 秒杀场景下开源MySQL性能压测对比

128个客户端连接下,原生版本+关闭死锁检测 TPS最高


谈谈死锁之三 秒杀场景下开源MySQL性能压测对比

256个客户端连接下,原生版本+关闭死锁检测 TPS最高,原生版本的TPS已经降低到2000+


谈谈死锁之三 秒杀场景下开源MySQL性能压测对比

512个客户端连接下,5.6.19TPS降低到600+



1024个客户端连接下,5.6.19TPS降低到30


版本 客户端连接 TPS
A 5.6.19 256 2271.91
B 5.6.19+ndlc 256 9198.25
C percona+tp 256 7925.89
D percona+tp+ndlc 256 8229.47



版本 客户端连接 TPS
A 5.6.19 512 646.53
B 5.6.19+ndlc 512 6225.06
C percona+tp 512 7587.56
D percona+tp+ndlc 512 7608.73



版本 客户端连接 TPS
A 5.6.19 1024 30
B 5.6.19+ndlc 1024 3924.82
C percona+tp 1024 6717.44
D percona+tp+ndlc 1024 6925.37


压测结论

  1. 关闭死锁检测后,5.6.19版本在1024个客户端并发连接情况下可以从30TPS提升到3924,应用程序无须更改代码,减库存性能提升120倍。

  2. Percona版本由于有线程池做了一层连接的并发控制,间接减少了数据库内部的线程上下文切换和锁竞争,在1024个客户端并发连接的情况下,TPS是5.6.19+关闭死锁检测的接近1倍。

  3. Percona版本+线程池调优+关闭死锁检测的情况下,在1024个客户端并发连接下,性能有小幅度提升。

  4. 5.6.19版本,谨慎考虑可以只增加关闭死锁检测的补丁代码,实现最小风险升级。但在微服务架构下,客户端对DB的链接越来越多,建议最终升级成Percona版本,利用线程池的优势来提升DB的稳定性。



注:ACMUG收录技术文章版权属于原作者本人所有。如有疑问,请联系作者。



以上是关于谈谈死锁之三 秒杀场景下开源MySQL性能压测对比的主要内容,如果未能解决你的问题,请参考以下文章

MySQL死锁检测和回滚

谈谈MySQL死锁 一

Locust性能测试入门案例及分布式压测

虚拟网卡性能压测

对比开源丨Prometheus 服务多场景存储压测全解析

谈谈MySQL死锁 一