原文地址:https://mysqlserverteam.com/contention-aware-transaction-scheduling-arriving-in-innodb-to-boost-performance/
原文作者: Sunny Bains, Jiamin Huang (University of Michigan)
译者:沈刚

什么是事务调度?

目前大多数的数据库系统都是通过锁的方式来控制并发的情况。但是对于很多数据库厂商来说,都会有一个问题:

当有多个事务同时需要获取同一把锁,那么哪个事务应该最先获得这把锁?

包括之前版本的MySQL在内,几乎所有的数据库都是通过FIFO机制来解决这个问题。简单来说,FIFO机制就是将锁分配给最先请求该锁的事务(即该事务在等待队列的最前面,除非它们与当前锁赋予的锁不兼容)。因为这种机制是实现起来简单,所以很多的数据库厂商都是通过FIFO的策略进行事务调度,没有考虑其他的调度策略。

最近一个密歇根大学的研究组织提出,这个问题背后隐藏着巨大的性能提升空间。Mozafari教授和他的学生证明了不同的锁分配策略以及事务调度策略对于数据库性能有着很大的影响。他们提出了一种称之为Contention-Aware Transaction Scheduling(CATS)的算法,使用这种算法进行事务调度相较于之前的FIFO策略,显著地减少了数据库延迟,提高了吞吐量。

Oracle MySQL官方团队和Mozafari教授以及他的学生们紧密合作,使得MySQL是第一个采用这种新技术的数据库。在MySQL 8.0.3版本之后,CATS策略作为InnoDB的默认调度算法,也就是说MySQL的使用者可以感觉到显著的性能提升,尤其是在持续高压力负载的情况下。

CATS机制原理

CATS算法是基于很简单的一个观点:不是所有的事务都是平等的,不是所有的对象都是平等的。当一个事务已经持有了多个对象的锁,当该事务请求一个新的锁的时候,该事务应该被优先分配。从另一个方面讲,解锁这样的事务有助于解锁更多的事务。因为该事务优先被分配锁能更快的结束事务,释放另外已经获取到的对象的锁。通过这种方式可以使数据库获得更高的吞吐和更低的延迟。

有一个比喻的例子:如果有一个出租车司机和一个公交车司机都在等咖啡,那么先给公交车司机做咖啡(即使公交车司机比出租车司机迟来)可能会让更多的人尽早到达他们的目的地。因为公交车上的乘客比出租车上的乘客多。这看起来似乎对出租车司机不公平,但是这种策略可以使得整个系统运行的更快,这对于系统内的每个人都是有利的。

当然,我们现在是在解决锁的问题而不是交通司机的问题。让我们通过一个简单的例子来阐述一下CATS机制在数据库中是如何工作的。我们知道在不同的事务隔离级别下,事务在读取或者更新数据的时候,需要先获取对应数据的锁。当一个事务所需要的锁已经被其他事务所持有了,那么这个事务会一直等待直到其他事务释放这个锁。当事务已经持有一部分对象锁的时候,可能会在获取其他对象的锁的时候一直被阻塞住,这个时候就需要死锁检测机制来检测当前数据库中没有锁等待循环,防止死锁。来看下面这张图:

Transaction contention
在这种场景下,FIFO策略很简单,只需要考虑那个事务先请求O1对象的锁。但是CATS算法会更加智能地处理这个情况:CATS算法会计算每个事务直接阻塞和间接阻塞的事务数量,然后将O1对象的锁分配给阻塞了更多事务的事务。在这个场景下,t1事务阻塞了4个事务,t2事务阻塞了3个事务。所以根据CATS算法会将O1对象的锁分配给t1事务。这样可以将更多的事务释放出来,这样有利于提高系统整体的性能。

对于共享锁(S锁),CATS算法会尽可能多的分配共享锁。在这方面FIFO和CATS算法有不同的地方。FIFO按照队列的先后顺序分配共享锁,当遇到分配的对象上已经有排他锁(X锁)了,则停止分配。而在CATS中,按照事务阻塞的事务数进行倒序排序,然后按照这个顺序进行锁分配。

CATS机制带来的性能提升

Oracle的Dimitri Kravtchuk通过Sysbench 的OLTP脚本测试这种新的算法。通过结果显示,在并发情况下,CATS算法比FIFO算法在TPS,平均延迟,95%延迟等指标方面都有显著的性能提升。有趣的是,即使在没有并发的情况下,CATS算法的性能和FIFO算法性能是一样的。那是因为在没有并发的时候,没有事务需要进行调度,所以也就没有性能的差异。换而言之,使用CATS算法替换FIFO算法,没有任何损失,反而在数据库繁忙的时候,有很大的性能提升。

CATS vs. FIFO in TPS, mean latency and 95th percentile (up to 5.05x improvement)

结论

MySQL是全球第一个使用这种最先进的CATS事务调度算法的数据库。这个算法解决了数据库在遇到高压力情况下性能急剧下降的问题,这个也是MySQL 8.0主要想要达到的目标。
CATS算法是针对当事务并发超过32的情况,这个数值没有参数配置,是通过经验设置的。

MySQL 8.0 —— CATS事务调度算法的性能提升的更多相关文章

  1. Mysql 自定义HASH索引带来的巨大性能提升----[挖坑篇]

    有这样一个业务场景,需要在2个表里比较存在于A表,不存在于B表的数据.表结构如下: T_SETTINGS_BACKUP | CREATE TABLE `T_SETTINGS_BACKUP` ( `FI ...

  2. Mysql 自定义HASH索引带来的巨大性能提升

    有这样一个业务场景,需要在2个表里比较存在于A表,不存在于B表的数据.表结构如下: T_SETTINGS_BACKUP | CREATE TABLE `T_SETTINGS_BACKUP` ( `FI ...

  3. Mysql 自定义HASH索引带来的巨大性能提升----[真相篇]

    推倒重来 俗话说no zuo no die why you try,这时候我又忍不住zuo了,吭哧吭哧的把解决过程发上博客,向全世界宣布,哥又搞定个难题. 剧情的发展往往是看起来主角完全掌握了局势的情 ...

  4. MySQL 8.0有什么新功能

    https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/ 我们自豪地宣布MySQL 8.0的一般可用性. 现在下载 ...

  5. MySQL 8.0 技术详解

    MySQL 8.0 简介 MySQL 5.7 到 8.0,Oracle 官方跳跃了 Major Version 版本号,随之而来的就是在 MySQL 8.0 上做了许多重大更新,在往企业级数据库的路上 ...

  6. 安装Mysql 8.0的艰难体验

    背景: Mysql 8.0 以后版本,在性能等方面有了很大提升,而且在自动编号.Timestamp等字段的设置上有了很方便的进步,因此在一年前即开始将原有的基于5.5版本的服务器逐渐向8.0转移.但转 ...

  7. PHP从PHP5.0到PHP7.1的性能全评测

    本文是最初是来自国外的这篇:PHP Performance Evolution 2016, 感谢高可用架构公众号翻译成了中文版, 此处是转载的高可用架构翻译后的文章从PHP 5到PHP 7性能全评测( ...

  8. PHP的性能演进(从PHP5.0到PHP7.1的性能全评测)

    本文是最初是来自国外的这篇:PHP Performance Evolution 2016, 感谢高可用架构公众号翻译成了中文版, 此处是转载的高可用架构翻译后的文章从PHP 5到PHP 7性能全评测( ...

  9. 从PHP5.0到PHP7.1的性能全评测

    本文是最初是来自国外的这篇:PHP Performance Evolution 2016, 感谢高可用架构公众号翻译成了中文版, 此处是转载的高可用架构翻译后的文章从PHP 5到PHP 7性能全评测( ...

随机推荐

  1. dart之旅(二)- 内建类型

    目录 number 类型 字符串 布尔类型 像大多数语言一样,dart 也提供了 number,string,boolean 等类型,包括以下几种: numbers strings booleans ...

  2. 全网最详细的Eclipse里如何正确新建普通的Java web项目并发布到Tomcat上运行成功【博主强烈推荐】(图文详解)

    不多说,直接上干货! 首先,大家要明确,IDEA.Eclipse和MyEclipse等编辑器之间的新建和运行手法是不一样的. 如果是在Myeclipse里,则是File -> new -> ...

  3. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十八):注册中心(Spring Cloud Consul)

    什么是 Consul Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与 ...

  4. NetMQ 发布订阅模式 Publisher-Subscriber

    第一部分引用于:点击打开 1:简单介绍 PUB-SUB模式一般处理的都不是系统的关键数据.发布者不关注订阅者是否收到发布的消息,订阅者也不知道自己是否收到了发布者发出的所有消息.你也不知道订阅者何时开 ...

  5. php防止刷流量攻击

    <?php //查询禁止IP $ip =$_SERVER['REMOTE_ADDR']; $fileht=".htaccess2"; if(!file_exists($fil ...

  6. Django 学习笔记(五) --- Ajax 传输数据

    人生苦短 ~ Tips:仅适用于 Python 3+(反正差别不大,py2 改改也能用).因为据 Python 之父 Guido van Rossum 说会在 2020 年停止对 Python 2 的 ...

  7. python元祖操作和内置方法

    1 元祖:元祖可以理解为一个不可变的列表 2 用途:用于存放多个值,当存放的多个值只有读的需求而没有改的需求时用元祖最合适 3 定义:在()内用逗号分隔开多个任意类型的值.注意:当只有一个元素的时候, ...

  8. 关于Unsupported major.minor version 52.0解决办法(再次回顾)

    对于web项目的配置问题,在很大程度上,tomcat的版本问题起到很大的决定性因素,例如以上问题:Unsupported major.minor version 52.0 表示stanford par ...

  9. blfs(systemd版本)学习笔记-前几章节的脚本配置

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 记录blfs书籍前几个章节的配置内容. bash shell启动文件章节 1.切换root用户 su 2.创建/etc/prof ...

  10. 【pygame游戏编程】第四篇-----打字测速游戏

    下面我们一起用pygame编写一个打字测速游戏 这是一个很实用的有趣的小游戏: 开始之前先来学习几个小函数: 1. ord(ch) python内置函数,传入一个字符,返回字符的ascii码 2.ch ...