文章目录

  • 背景描述
  • dCompaction设计
  • 触发条件 VCT
  • 触发VT 合并的条件 VSMT
  • 测试数据

优化的重心集中在减少写放大上,同时将读性能维持在和rocksdb 原生读性能接近,优化思想是中国科学院的2位博士 提出的。
论文原地址:
dCompaction: Speeding up Compaction of the LSM-Tree via Delayed Compaction

背景描述

关于LSM的问题,这里不多介绍,有兴趣的同学可以看看之前 总结的相关优化论文的描述:
1. PebblesDB Building Key-Value Stores using FLSM-Tree(Fragmented) SOSP‘17

2. X-Engine: An Optimized Storage Engine for
Large-scale E-commerce Transaction Processing SIGMOD’19

论文中 通过YSCB 构造的workload 来统计 三种类型的操作造成的IO:Compaction, Get, Put.
如下图:

其中IO操作主要是由compaction 造成的,而读IO仅仅会由读的比例的增加而增加,且最大不会超过 总的IO的20%,也就是大部分IO操作都是由Compaction造成的。

再通过分析Compaction的实现 如下图:

可以发现实际compaction过程中针对同一个key可能会写入多次,比如C2–>C3 compaction,会将选择的C3的文件经过合并再次写入到C3之中,这就是写放大的源头。

dCompaction设计

为了减少写放大,dCompaction核心设计了 virtual compaction 和 virtual SSTables,如下图:

compaction过程中 内存里维护virtual sstables ,之间以树状结构来管理实际的real stabiles。virtual sstables 包含如下几种类型的元数据:

  • smallest key
  • largest key
  • file number
  • file size
  • Parent SStables

相比于实际的real sstables 多了一个parent SStables,用来管理实际的sst文件

dCompaction 实际的过程如下图

原本的Compaction实现:

  1. T22@L2 + T32,T33@L3 --> T34,T35,T36@L3

  2. T34,T35,T36@L3 + T42,T43@L4 --> T44,T45,T46,T47,T48@L4

也就是T34,T35,T36中的key-value会被多读、多写一次

dCompaction实现:

  1. T22@L2 + T32,T33@L3 --> VT34,VT35,VT36@L3

    这一步仅仅将实际的sstable中的元数据读上来,在内存中构造 virtual table,合并real table的元数据,从而完成virtual compaction。不需要对T34,T35,T36中的数据多读写一次。

  2. VT34,VT35,VT36@L3 + VT42,VT43@L4 --> T44,T45,T46,T47,T48@L4

    这一步通过L3的virtual table + L4的virtual table 完成一次real compaction。

通过dCompaction,将实际T22@L2 + T32,T33@L3 + T22@L2 + T32,T33@L3 + T42,T43@L4 --> T44,T45,T46,T47,T48@L4

降低为T22@L2 + T32,T33@L3 + T42,T43@L4 --> T44,T45,T46,T47,T48@L4

所有的key-value仅仅只需要产生一次IO操作即可,能够有效得降低读写放大,提升写性能。

但是这个过程 对读性能有影响。dCompaction 下的读 和 原生rocksdb的读 流程对比如下图:

实际的读在有virtual table的情况下会有如下几步:

  1. 读memtable
  2. 读block cache
  3. 读virtual table
  4. 确认key是在VT smallest – largest key之间
  5. 读Parent sstables
  6. 从实际的T 中读取key-value

相比于从实际的T中直接读取 多了两步。

触发条件 VCT

VCT定义了一个阈值用来控制当前compaction是virtual compaction还是real compaction,触发算法如下:

  1. compaction开始

  2. 选择需要被合并的 sst files

  3. sst files 计数

  4. Count = sst files 计数

  5. 如果 Count < VCT

    ​ 触发virtual compaction

    否则

    ​ 触发real compaction

如果VCT 被设置为0,那么默认就是real compaction;

随着VCT被设置的数值不断增加,virtual compaction会触发得越来越频繁,compaction产生的IO会降低,但是VCT 越大,并不代表系统性能越好。

  • 这其实也是变相的compaction delay,virtual compaction进行的越多,单次real compaction的量会越大,这一次的 real compaction会将系统的性能拖到低谷。
  • Virtual compaction越多,real ssttables 也会越多,这其实会增加读延时,从而降低读性能。

所以VCT的值需要做一个实际的测试来平衡real compaction 和 sst files 计数 compaction

触发VT 合并的条件 VSMT

这个阈值主要是用来控制一个virtual sstables 能够包含多少real sstables,如果读的过程中发现virtual sstables的real sstables 超过了这个阈值,就对当前virtual sstables进行合并。

这个参数主要是为了 降低 的读请求命中VT 的时 对读性能的影响。

比如读请求命中 VT34,发现其中的real sstables 的个数超过VSMT,那么触发VT的合并。

将VT34 管理的三个real sstables T22,T32,T33都读到内存中,合并为T34,T35,T36。

同理 其他的VT35,VT36 也需要合并到T35,T36。这个过程其实是对IO带宽的一种浪费,但是VT merge 能够减少查找时的IO,提升读性能。

实际的合并算法:

  1. 如果 sstable.type == virtaul sstable

    ​ 2. 计算VT中有多少个real sstables

    ​ 3. Count = the number of real sstables

    ​ 4. 如果 Count >= VSMT

    ​ 合并virtual sstable 到real sstables

实际VSMT 也不能随意设置,否则同样会对性能有很大的影响。

如果VSMT设置的过小,VT merge会很频繁,将增加合并过程中的IO消耗(需要读到内存,合并 并写入)。为了降低一部分读延时,缺增加了dCompaction对读写放大的优化效果。

而如果VSMT设置的过大,VT 得不到合并,同样无法达到提升读性能的效果。

测试数据

硬件如下:
CPU: Intel Xeon E5645 (6core,2.4GHz, 12MB L3 cache)
DRAM:2GB
2 * 1TB SATA hdd( 平局寻道时间/旋转延时 : 8.5 ms/4.2 ms, 传输带宽:150M/s)
1 * 480GB SATA intel ssd (平均读/写延时:80 μs/85 μs, 平均读/写带宽:550/520 MB/s)

rocksdb 配置 都是默认的配置,dCompaction的VCT 是12, VSMT 是5。
使用YCSB 按照读写比,生成的workload。

和开头提到的 dCompaction的目标集中在减少写放大,保证读性能。
如下图为四种workload下的测试情况:
D1: (2.4×10^7, 1, 0, 256 B, 6 GB),
D2: (2.4×10^7, 0.8, 0.2, 256 B, 5 GB),
D3: (2.4×10^7, 0.2, 0.8, 256 B, 2 GB),
D4: (2.4×10^7, 0, 1, 256 B, 6 GB)

其中 D(O, W, R, V, S) 为数据集的描述,O表示操作次数,W 表示写占的比例,R 表示读占的比例,V 表示value siz,S 表示总的数据集大小。

如上图可以看到 dCompaction的实现对整体的写性能有很大的提高,同时也有不弱于rocksdb的读性能。

后续还有更加详细的性能数据,相同数据量下两种compaction产生的IO量对比,读写延时对比,不同数据集对性能的影响 以及 VCT和VSMT 指标对性能的影响。

LSM 优化系列(二)-- dCompaction: Speeding up Compaction of the LSM-Tree via Delayed Compaction相关推荐

  1. LSM优化系列(五) -- 【SIGMOD‘19】X-engine 在电商场景下针对大规模事务处理的优化-- 强者恒强啊

    文章目录 1. 前言 2. 论文结构 2.1 海啸 问题 2.2 泄洪 问题 2.3 洋流 问题 3. X-engine架构 3.1 读路径优化 概览 3.2 写路径优化概览 3.3 Flush和Co ...

  2. LSM 优化系列(四) -- Rocksdb和Lethe 对Delete问题的优化

    文章目录 前言 1. 问题背景 2. 问题复现 3. Rocksdb 的 Delete-Aware 优化 3.1 可配置的 Delete-Aware调度 3.2 Compaction 逻辑对 dele ...

  3. SSE图像算法优化系列二十五:二值图像的Euclidean distance map(EDM)特征图计算及其优化。...

    Euclidean distance map(EDM)这个概念可能听过的人也很少,其主要是用在二值图像中,作为一个很有效的中间处理手段存在.一般的处理都是将灰度图处理成二值图或者一个二值图处理成另外一 ...

  4. SSE图像算法优化系列二十二:优化龚元浩博士的曲率滤波算法,达到约1000 MPixels/Sec的单次迭代速度...

      2015年龚博士的曲率滤波算法刚出来的时候,在图像处理界也曾引起不小的轰动,特别是其所说的算法的简洁性,以及算法的效果.执行效率等方面较其他算法均有一定的优势,我在该算法刚出来时也曾经有关注,不过 ...

  5. LSM 优化系列(六)-- 【ATC‘20】MatrixKV : NVM 的PMEM 在 LSM-tree的write stall和写放大上的优化

    文章目录 LSM 问题背景 MatrixKV 设计细节 整体架构介绍 Matrix Container介绍 Receiver RowTable Compactor Space management C ...

  6. SSE图像算法优化系列二十九:基础的拉普拉斯金字塔融合用于改善图像增强中易出现的过增强问题(一)...

    拉普拉斯金字塔融合是多图融合相关算法里最简单和最容易实现的一种,我们在看网络上大部分的文章都是在拿那个苹果和橙子融合在一起,变成一个果橙的效果作为例子说明.在这方面确实融合的比较好.但是本文我们主要讲 ...

  7. ElasticSearch优化系列二:机器设置(内存)

    点击"阅读原文"直接打开[北京站 | GPU CUDA 进阶课程]报名链接 预留一半内存给Lucence使用 一个常见的问题是配置堆太大.你有一个64 GB的机器,觉得JVM内存越 ...

  8. SSE图像算法优化系列二十一:基于DCT变换图像去噪算法的进一步优化(100W像素30ms)。...

    在优化IPOL网站中基于DCT(离散余弦变换)的图像去噪算法(附源代码) 一文中,我们曾经优化过基于DCT变换的图像去噪算法,在那文所提供的Demo中,处理一副1000*1000左右的灰度噪音图像耗时 ...

  9. hprof文件分析工具_应用稳定性优化系列(三),资源泄露问题分析及定位

    继介绍稳定性ANR类故障和Crash/Tombstone类故障后,本章将介绍第三大类故障资源泄露及其典型场景.分析定位和解决方法. 1  资源泄露问题原因分析 2  典型泄露场景 静态变量长期维持到大 ...

最新文章

  1. 使用指针给矩阵除主对角线外的元素赋值为0
  2. pytorch下载时出现错误:EOFError: Compressed file ended before the end-of-stream marker was reached
  3. 判断SIM卡属于哪个移动运营商
  4. wordpress网站后台打开速度很慢解决方法?
  5. libtorch Compiler Error C2951
  6. uni.request接口封装;小程序uni-app接口封装
  7. 进击的小程序:品牌自营GMV同比增长210%,这些行业增速最快……
  8. 蓝桥杯 ADV-16 算法提高 和最大子序列
  9. webdriver原理_(最新版)如何正确移除 Pyppeteer 中的window.navigator.webdriver
  10. 零信任时代企业如何提升权限的安全?从浏览器小程序说起
  11. [AI教程]最全人工智能图谱解析和视频下载
  12. sim800使用方法
  13. DTcms 上传图片BUG补丁,解决方案
  14. win10连接共享打印机出现报错0x0000007c问题
  15. win10显卡驱动怎么装_既然大家都说装了win10,就不用鲁大师监测显卡温度,为什么呢?...
  16. python在单词表中查找包含所有元音字母aeiou的单词并打印
  17. 自动化测试工程师_所以你想成为一名测试自动化工程师
  18. idea run with coverage异常
  19. 核磁谱图分析步骤_MestReNova核磁谱图处理指南
  20. 【RK按键】按键切换

热门文章

  1. 获取request的变量
  2. mybatis 使用resultMap实现数据库的操作
  3. XFile 关键帧动画的解析遇到的问题
  4. usaco Hamming Codes
  5. 位运算符Java与详解_java位运算符详解
  6. 知道PHP期末答案,PHP期末练习(参考答案).doc
  7. python特效进度条_六种酷炫Python运行进度条
  8. python image stiching_Python自然语言处理,词云图生成
  9. linux 启动脚本sleep后不执行_JMeter多脚本间的启动延时
  10. java代码实现count排序_java计数排序