转载自: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 事务调度新算发的更多相关文章

  1. 使用docker-compose 大杀器来部署服务 上

    使用docker-compose 大杀器来部署服务 上 我们都听过或者用过 docker,然而使用方式却是仅仅用手动的方式,这样去操作 docker 还是很原始. 好吧,可能在小白的眼中噼里啪啦的对着 ...

  2. 使用docker-compose 大杀器来部署服务 上(转)

    使用docker-compose 大杀器来部署服务 上 我们都听过或者用过 docker,然而使用方式却是仅仅用手动的方式,这样去操作 docker 还是很原始. 好吧,可能在小白的眼中噼里啪啦的对着 ...

  3. [转]使用docker-compose 大杀器来部署服务 上

    本文转自:https://www.cnblogs.com/neptunemoon/p/6512121.html 使用docker-compose 大杀器来部署服务 上 我们都听过或者用过 docker ...

  4. 使用docker-compose 大杀器来部署服务

    使用docker-compose 大杀器来部署服务 上 我们都听过或者用过 docker,然而使用方式却是仅仅用手动的方式,这样去操作 docker 还是很原始. 好吧,可能在小白的眼中噼里啪啦的对着 ...

  5. [NewLife.XCode]反向工程(自动建表建库大杀器)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...

  6. Postgresql-模糊匹配大杀器

    # Postgresql-模糊匹配大杀器 ## 问题背景 随着pg越来越强大,abase目前已经升级到5.0(postgresql10.4),目前abase5.0继承了全文检索插件(zhparser) ...

  7. 一文读懂机器学习大杀器XGBoost原理

    http://blog.itpub.net/31542119/viewspace-2199549/ XGBoost是boosting算法的其中一种.Boosting算法的思想是将许多弱分类器集成在一起 ...

  8. DSP已经英雄迟暮了吗?FPGA才是未来的大杀器?

          DSP技术,在某些人看来,或者已经面临着英雄迟暮的感觉,就我们当前所知道的.Freesacle.ADI.NXP早就停掉了新技术发展,而当前从大的方面说只剩下TI一家扛着Digital Si ...

  9. postgres模糊匹配大杀器

    ArteryBase-模糊匹配大杀器 问题背景 随着pg越来越强大,abase目前已经升级到5.0(postgresql10.4),目前abase5.0继承了全文检索插件(zhparser),使用全文 ...

随机推荐

  1. Scrapy各部分运行机制?Xpath为None?多层Response如何编写?搞定Scrapy的坑

    前言 Scrapy那么多模块都是怎么结合的啊?明明在chrome上的xpath helper插件写好了xpath,为什么到程序就读取的是None?Scrapy可以直接写多层response么?难道必须 ...

  2. 模块 os 和 sys

    目录 os 模块 sys 模块 os 模块 os 模块是与操作系统交互的一个接口 方法 详解 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir(&quo ...

  3. 1192: 零起点学算法99——The sum problem(C)

    一.题目 http://acm.wust.edu.cn/problem.php?id=1192&soj=0 二.分析 要求从序列1,2,3,,,N,中截取一部分使他们的和为M 输入多组数据 输 ...

  4. STM32的I2C特性及架构

    软件模拟协议:使用CPU直接控制通讯引脚(GPIO)的电平,产生出符合通讯协议标准的逻辑. 硬件实现协议:由STM32的I2C片上外设专门负责实现I2C通讯协议,只要配置好该外设,它就会自动根据协议要 ...

  5. Maven配置、使用

    一:什么是Maven Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件. Maven提供了开发人员构建一个完整的生命周期框架,开发人员可以自动完成 ...

  6. vuex 理解

    为什么要用vuex?页面由多个视图组成,用户操作会引视图的状态变化. 多个视图依赖于同一状态(例如:菜单导航) 来自不同视图的行为需要变更同一状态(例如:评论弹幕) vuex 的作用 为vue.js开 ...

  7. APK反编译教程

    在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...

  8. 轻松搭建CAS 5.x系列(8)-在CAS Server增加双因素认证(DUO版)

    概述说明 为了让系统更加安全,很多登录会加入双因素认证.何为双因素,如果把登陆作为开一扇门的话,那就是在原来的锁上再加一把锁,第二锁用新的钥匙,这样安全系数就更加高了. CAS是通过账号名和密码来认证 ...

  9. (十二)Hibernate中的多表操作(2):单向多对一

    由“多”方可知“一”方的信息,比如多个员工使用同一栋公寓,员工可以知道公寓的信息,而公寓无法知道员工的信息. 案例一:使用xml配置 pojo类 Group.java package bean; // ...

  10. EventBus使用教程

    如图准备工作: 父子(子父)组件触发 EventBus.$emit('sub') EventBus.$on('sub',()=>{ console.log(1111222232211122) } ...