MySQL 8.0.3性能大杀器 —— CATS 事务调度新算发
转载自:https://www.sohu.com/a/203933205_487483?sec=wd&spm=smpc.author.fd-d.2.1557386676880JSjtJwV
好多同学后台留言说姜老师最近技术文章写得少,主要原因是换了新工作之后正在熟悉相关业务,调整数据库架构,MGR调研、测试与上线等。此外还有神秘的金融云项目,目前雏形已完成,感觉市面上所有云都要哭晕在厕所啦~~~
最近一直在跟进MySQL 8.0,周末发现InnoDB团队老大Sunny Bains发文的Contention-Aware Transaction Scheduling Arriving in InnoDB to Boost Performance[1],倏地感觉眼前一亮,并水藤摸瓜地继续看了几篇论文[2],[3],很是有收获。
CATS
————
Contention-Aware Transaction Scheduling,基于竞争感知的事务调度(下简称CATS),是MySQL 8.0.3版本默认的事务调度算法。之前事务的调度算法可视为FCFS(first come first serve)。简单来说,就是先到的事务先获得锁,如果发生等待则根据FIFO算法进行排队。这个算法看似非常公平,且沿用非常之久。
然而,FCFS并不能算是公平的算法。因为FCFS公平的前提是假设每个事务持有的锁数量是一样的,实际上这是不可能的。一个系统中总有不同的业务和事务处理。在金融支付这块,设计的原则之一就是快慢分离,即快事务不要被慢事务挡住。这通常需要业务进行控制,因为数据库层无法感知事务的优先级。
CATS是一种通过排序事务阻塞其他事务的数量来判断当前事务重要性的算法,重要性高的事务需要提前获得锁。从感觉上看,还是比较合理的。当然论文中会有相关推到和论证。

上图中,事务t2虽然依赖了5个对象的锁,但仅有3个事务在等待。而事务t2持有的锁少,但却有4个事务在等待t1。因此,在CATS算法下,锁将会授予事务t1。论文[3]中指出MySQL 8.0.3中使用的算法是LDSF(Largest-Dependency-Set-First),他们新提出的算法bLDSF(batched LargestDependency-Set-First)还能有进一步的性能提升。
同时论文[3]也指出CATS和原有的FCFS算法的时间复杂度都是为O(N*N),因此在调度上并不会有性能损失。
性能
————
大家最关心的还是性能问题。论文[3]中的测试场景最为丰富,下面仅罗列TPC-C场景的结果:

可以看到在TPC-C大并发量场景下,原来的FIFO性能退化非常严重,然而bLDSF算法却依然能保持较高的性能水准。MySQL官方也做了相关测试,采用了sysbench OLTP pareto分布,性能也能有较大的提升,在512线程下性能有5倍的差距:

TPC-C、Sysbench都是现成的工具,感兴趣的小伙伴可以测试下,复现测试结果应该并不难。不过到最后的测试结果,我的疑问却停留在了如果使用线程池,那么高并发不就不会有性能下降了嘛?那这时CATS的提升或者帮助还能有多少呢?
源码
————
[4]是原作者在MySQL 5.7版本中添加CATS的分支,patch代码没有超过1000行,感觉还是可以理解的,主要逻辑集中在函数vats_grant。[5]是官方建的工作日志,对具体实现感兴趣的同学可以继续研究。
最后,我感觉这篇论文给我打开了很多新的思考空间,数据库内核层可以做的事情除了Paxos,其实还可以有很多。
MySQL 8.0.3性能大杀器 —— CATS 事务调度新算发的更多相关文章
- 使用docker-compose 大杀器来部署服务 上
使用docker-compose 大杀器来部署服务 上 我们都听过或者用过 docker,然而使用方式却是仅仅用手动的方式,这样去操作 docker 还是很原始. 好吧,可能在小白的眼中噼里啪啦的对着 ...
- 使用docker-compose 大杀器来部署服务 上(转)
使用docker-compose 大杀器来部署服务 上 我们都听过或者用过 docker,然而使用方式却是仅仅用手动的方式,这样去操作 docker 还是很原始. 好吧,可能在小白的眼中噼里啪啦的对着 ...
- [转]使用docker-compose 大杀器来部署服务 上
本文转自:https://www.cnblogs.com/neptunemoon/p/6512121.html 使用docker-compose 大杀器来部署服务 上 我们都听过或者用过 docker ...
- 使用docker-compose 大杀器来部署服务
使用docker-compose 大杀器来部署服务 上 我们都听过或者用过 docker,然而使用方式却是仅仅用手动的方式,这样去操作 docker 还是很原始. 好吧,可能在小白的眼中噼里啪啦的对着 ...
- [NewLife.XCode]反向工程(自动建表建库大杀器)
NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...
- Postgresql-模糊匹配大杀器
# Postgresql-模糊匹配大杀器 ## 问题背景 随着pg越来越强大,abase目前已经升级到5.0(postgresql10.4),目前abase5.0继承了全文检索插件(zhparser) ...
- 一文读懂机器学习大杀器XGBoost原理
http://blog.itpub.net/31542119/viewspace-2199549/ XGBoost是boosting算法的其中一种.Boosting算法的思想是将许多弱分类器集成在一起 ...
- DSP已经英雄迟暮了吗?FPGA才是未来的大杀器?
DSP技术,在某些人看来,或者已经面临着英雄迟暮的感觉,就我们当前所知道的.Freesacle.ADI.NXP早就停掉了新技术发展,而当前从大的方面说只剩下TI一家扛着Digital Si ...
- postgres模糊匹配大杀器
ArteryBase-模糊匹配大杀器 问题背景 随着pg越来越强大,abase目前已经升级到5.0(postgresql10.4),目前abase5.0继承了全文检索插件(zhparser),使用全文 ...
随机推荐
- (十五)struts2之注解
一.作用 以用来替换struts.xml配置文件 使用前提 :必须引入struts2-convention-plugin-2.3.14.jar 这个jar包 二.参数 @Action来代替<ac ...
- kafka之基本介绍
什么是kafka? Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理 ...
- .net core 依赖注入在特性中的应用
.net core 依赖注入在特性中的应用,不知道怎么用属性注入,那么在特性中的构造函数里,怎么用接口的方法呢? 来一个简单的例子: 主要思路是把ServiceProvider 静态全局化: publ ...
- Flutter笔记(一)
Android/iOS移动端开发 原生开发 Android原生应用通常指使用Java或Kotlin语言直接调用Android SDK开发的应用程序:而iOS原生应用通常指使用Objective-C或S ...
- php 环境搭建问题
项目过程中需要用到 PHP环境 https://www.cnblogs.com/cyrfr/p/6483529.html APACHE无法启动:THE REQUEST OPERATION HAS FA ...
- 最近公共祖先 LCA (Lowest Common Ancestors)-树上倍增
树上倍增是求解关于LCA问题的两个在线算法中的一个,在线算法即不需要开始全部读入查询,你给他什么查询,他都能返回它们的LCA. 树上倍增用到一个关键的数组F[i][j],这个表示第i个结点的向上2^j ...
- Python多个装饰器的顺序 转载
3.使用两个装饰器当一个装饰器不够用的话,我们就可以用两个装饰器,当然理解起来也就更复杂了,当使用两个装饰器的话,首先将函数与内层装饰器结合然后在与外层装饰器相结合,要理解@语法的时候到底执行了什么, ...
- SpringBoot mysql出现The server time zone value '�й���ʱ��' is unrecogni
MySql :8.0.18 引入的mysql驱动: SpringBoot整合Mybatis的框架,在访问Controller的时候 : ava.sql.SQLException: The server ...
- .Net给图片加水印,并解决“无法从带有索引像素格式的图像创建Graphics对象”问题
using (Image img = Image.FromFile(savePath)) { //如果原图片是索引像素格式之列的,则需要转换 if (img.PixelFormat!=null) { ...
- 三年总结出来的11个JPA和Hibernate查询配置小技巧
JPA和Hibernate提供了一系列暗示hints能够帮助你更好地定制你的查询语言,这些小暗示或暗语是一种附加信息,你可以利用这些暗语做很多事情,比如设置查询的timeout,使用实体图或定义查询缓 ...