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),使用全文 ...
随机推荐
- 笔记-6:mysql索引
1.索引概述 建立索引的目的:加快数据库检索的速度. mysql中索引主要分为: 普通索引:使用index或key关键字创建,其索引列值可以取空值或重复值. 唯一性索引:使用关键字UNIQUE创建,其 ...
- SAS学习笔记42 宏程序
Autocall Macro是由SAS提供的一些实现特定功能的Macro Program,可以在代码中直接使用 其中以Q开头的相比正常的多了隐藏特殊字符的功能(称之为Macro Quoting): K ...
- 游记-pkupc&cts2019
Day0 和boshi.Rayment组的队,昨天听学长说这次比赛可以加学分,他们信科的大部分人都会参加,估摸有两百多支队伍--然而奖品只有不到一百份 我要奖品呐! 上午十一点半到的北京,拉着行李提着 ...
- CMake入门-01-从HelloWorld开始
工作环境 系统:macOS Mojave 10.14.6 CMake: Version 3.15.0-rc4 从 Hello,World! 开始 (1) 新建 hello 目录,创建文件 CMakeL ...
- 线段树 面积并问题 hdu 1255 1542
重点整理面积并的思想 以及PushUp的及时更新 还有就是cover的实现 以及建树每个节点存的信息(每个节点存的是一个线段的信息) http://www.tuicool.com/articles/6 ...
- Windows 服务 安装后自启动
[RunInstaller(true)] public partial class ProjectInstaller : System.Configuration.Install.Installer ...
- Servlet实现图片读取显示
1.导入jar包:commons-io-1.4.jar 2.index.jsp: <%@ page language="java" import="java.uti ...
- 转载一篇有关于diff的文章,方便以后复习
本文章是转载的,为了方便以后复习,特地记录一下.他人请去原地址观看!!! 文章原地址:http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.h ...
- SpringCloud之Zuul网关原理及其配置
Zuul是spring cloud中的微服务网关.网关: 是一个网络整体系统中的前置门户入口.请求首先通过网关,进行路径的路由,定位到具体的服务节点上. Zuul是一个微服务网关,首先是一个微服务.也 ...
- MySQL数字类型int与tinyint、float与decimal如何选择
最近在准备给开发做一个mysql数据库开发规范方面培训,一步一步来,结合在生产环境发现的数据库方面的问题,从几个常用的数据类型说起. int.tinyint与bigint 它们都是(精确)整型数据类型 ...