泛读笔记:《Towards Optimal Transaction Scheduling》
文章发布时间:
最后更新时间:
文章总字数:
预计阅读时间:
页面浏览: 加载中...
最后更新时间:
文章总字数:
1.9k
预计阅读时间:
6 分钟
页面浏览: 加载中...
1. 摘要
最大化事务吞吐量是高性能数据库系统的关键,高性能数据库系统关注于最小化数据访问冲突以提高性能。然而,找到有效的时间表,减少冲突仍然是一个悬而未决的问题。为了提高效率,以前的调度技术只考虑可能的时间表的一个小子集。在这项工作中,我们建议系统地探索整个时间表空间,主动识别有效的时间表,并在执行过程中精确地执行它们,以提高吞吐量。我们引入了一个贪婪的调度策略,SMF,有效地找到快速的时间表,并优于最先进的搜索技术。为了实现这些时间表在实践中的好处,我们开发了一个时间表优先的并发控制协议,MVSchedO,执行细粒度的操作顺序。我们在我们的系统R-SMF(RocksDB的修改版本)中实现了这两个功能,在一系列基准测试和实际工作负载上实现了高达3.9倍的吞吐量增加和3.2倍的尾延迟减少。
2. 背景
- 寻找最优调度是NP难的
- 大多数现有并发控制协议(2PL、MVCC):
- 基于先入先服务的顺序
- 在冲突到达或在执行结束时处理冲突
- 最近的工作(确定性数据库):
- 通过利用关于访问集的完整信息调度事务,或者预测将要访问的键
- 仅考虑了调度空间的小子集
- 距离最优化差距较大
挑战1 如何高效通过部分信息找到快速调度方案
- 事务间冲突成本不同造成了调度之间执行时间的差异
- 寻找最优化调度方案是不现实的
- 大多数工作负载中存在的一小部分热键对执行时间有巨大的影响
因此,本文提出了一种贪心算法最短最大跨度优先(SMF):
- SMF通过追加导致执行时间增量最小的事务来迭代地构造调度
- SMF根据每个事务与调度中所有其他请求的冲突程度做出决策,而不是只考虑单个事务的特征
- SMF不依赖于完整读写访问集的先验知识
- SMF会使用应用程序中包含的元数据
- SMF开销小,实现了线性复杂度(对于正在运行的事务而言)
挑战2 如何在不违反隔离级别的情况下强制执行调度
- 现有并发控制协议不主动控制单个操作完成顺序
- 强制执行调度的系统会产生很高的开销:
- 要么在单个线程中序列化所有请求
- 要么要求开发人员手动构建自定义集合点来协调依赖关系
因此,本文开发了一种新的并发控制协议MVSchedO:
- 采用多版本时间戳排序
- 利用了预期的热键访问
- 对于各个热键维护一个调度队列
2.1. 效果
相比于基线(RocksDB)提升至3.9倍吞吐,有3.2倍尾延迟降低
3. 引入定义:Schedule Makespan
Makespan,即所有事务完成所需要的总时间
对于给定的调度,事务执行受到以下约束:
- 事务内部的操作顺序
- 事务之间的依赖性,由在运行时期间强制执行指定隔离级别的并发控制协议确定

不同的调度方案会导致makespan不同,差距可能非常显著。
表1: FIFO 相比于已知最优调度所增加的 Makespan
Epinions | SmallBank | TAOBench | TPC-C | YCSB |
---|---|---|---|---|
43.2% | 8.0% | 96.2% | 101.6% | 99.3% |
4. SMF贪心算法
流程:
- 首先,SMF随机选取一个事务加入调度
- 在每次迭代中,随机抽取k个事务,将增加Makespan最小的事务加入调度
时间复杂度为\(O(n\times k)\),实验证明,较小的k就足够了(e.g. k=5)
实验证明1(研究TPC-C):
- New-Order和Payment这两种事务主要在Warehouse和District的键上冲突
- 实验:研究分析了500个New-Order和Payment事务(10仓)
- SMF能够使访问不同Warehouse和District键的事务并行执行,实验中FIFO调度的makespan是SMF的1.7倍
- 由于事务性工作负载倾向于在一小部分键上发生冲突,这些键的影响较大
- 实验:运行了一个仅知道Warehouse和District表中键的SMF版本,和一个事先知道所有键访问情况的版本,产生的调度计划性能几乎相同
- New-Order和Payment这两种事务主要在Warehouse和District的键上冲突
反例,出现概率应当较小:

- 实验证明2:
- 通过将SMF生成的结果和对所有调度的均匀采样的结果进行比较,SMF的结果比大多数调度的makespan都小
- 一个调度相当于是一个有向无环图,各个调度的底(无向边)相同
- 使用现有的Interval-Reversal (IR) Random Walk方法对调度进行均匀抽样
- 实验证明,在均匀抽样数为299个时,SMF有95%的置信度优于99%的调度
- 在实验中评估了100k个均匀抽样的样本,SMF有99.99%的置信度优于99.99%的样本,SMF最好的结果落在了99.999百分位上
- 这种均匀抽样的方法被用于在运行时和SMF对比,如果SMF生成的结果有多次较差,可以切回FIFO
- 通过将SMF生成的结果和对所有调度的均匀采样的结果进行比较,SMF的结果比大多数调度的makespan都小
5. 系统构建
系统组件:
- 预测热键冲突模式的分类器
- SMF调度器,确定事务如何排序
- 调度优先并发控制协议MVSchedO,强制执行细粒度操作执行
5.1. 在线调度
- SMF需要知道事务中的热键
- 离线状态下,所有热键都是已知的
- 在线状态下,热键未知,需要额外hint来预测
- 每个事务有额外的hint,构成了MetadataVec,一个整数向量:
- 事务开始时程序向数据库提供事务种类
- 事务开始时从sql语句、clint元信息等中获取的一些元信息
- 对过往事务训练和验证knn,并分类,每类中出现频率最高的操作就是该类的热键操作
- 对新开始的事务,通过其MetadataVec得到其在knn的某一类,该类的热键操作集合即预测该事务将进行的热键操作
- 在线调度只需要考虑将要加入的事务对正在运行中的事务的影响
- 每个事务有额外的hint,构成了MetadataVec,一个整数向量:
5.2. MVSchedO
- 每个事务开始时
- 预测该事务将访问热键的操作
pred_hot_key_ops
- 使用SMF分配时间戳
ts
(而不是FIFO分配时间戳) - 对于每一个热键
k
,全局维护的时间戳数组pred_ops[k]
中会插入ts
,这相当于维护了一个操作队列
- 预测该事务将访问热键的操作
- 每个对热键操作时:
- 等待
min(pred_ops[k]) >= ts
,即,SMF分配在该事务前的其他事务对该热键的访问已经结束 - 操作结束后依据访问类型将
ts
从pred_ops[k]
中去除
- 等待
- 正确性:由于MVTSO中的时间戳分配是任意的,因此SMF选择的调度不会影响可串行化保证