转载自: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. oddo

    看了这张图,或许你对odoo有了一些兴趣. https://www.cnblogs.com/wterp/p/9093616.html 这次就是和大家一起交流开源ERP/CRM系统:odoo 对以下读者 ...

  2. php 获取某个月的周一

    今天有个朋友问了一个问题,最后解决了下,先整理记下来,后面用到了再说 function getMonday($month = ''){ if(empty($month)){ $month = date ...

  3. Interlocked

    Interlocked MSDN 描述:为多个线程共享的变量提供原子操作.主要函数如下: Interlocked.Increment 原子操作,递增指定变量的值并存储结果.Interlocked.De ...

  4. C#xml泛型序列化

    using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Web ...

  5. (四)Decorator设计模式解决GET/POST请求的乱码问题(转)

    一.Decorator设计模式 1.1.Decorator设计模式介绍 当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强: 编写子类,覆盖需增强的方法. 使用Decorator设计模 ...

  6. iis 虚拟目录 文件服务器

    需求 多节点站点部署时,上传文件地址统一 调整步骤如下 建立文件服务器 共享目录 设置账号密码 各服务器建账号 密码 需与文件服务器账号密码一致 调整 web.config 在<system.w ...

  7. php文件包含漏洞 file inclusion vulnerability

    0x00 何为文件包含漏洞 开发人员如果在写类似include "a.php"的代码时,如果将a.php写成了可变的值,那么就可以在上面做文章,举个理想的例子: <? inc ...

  8. stm32 usart 串口

    比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps).如每秒钟传送240个字符, 而每个字符格式包含10位(1个起始位.1个停止位.8个数据位),这时的比特率为: 10位 × 240个/秒 = ...

  9. Array + two points leetcode.18 - 4Sum

    题面 Given an array nums of n integers and an integer target, are there elements a, b, c, and d in num ...

  10. 4.Java集合-ArrayList实现原理及源码分析

    一.ArrayList概述: ArrayList 是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存 ArrayList不是线程安全的,只能用在单线程的情况 ...