学术加油站|基于LSM-tree存储系统的内存管理,最大限度降低I/O成本

本文系北京理工大学科研助理牛颂登所著,本篇也是 OceanBase 学术系列稿件第 10 篇。欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/


「牛颂登:北京理工大学科研助理,硕士期间在电子科技大学网络空间安全研究院从事聚类和强化学习相关算法研究,在应用聚类研究个性化在线学习和强化学习的奖励函数设计方向取得了一定成果,目前研究方向为机器学习和数据库相结合的领域。」

今天分享的论文是"Breaking Down Memory Walls in LSM-based Storage Systems. PVLDB, 14(3): 241-254, 2020. doi: 10.5555/3430915.3442425 "

希望阅读完本文,你可以对基于 LSM-tree 存储系统的内存管理有新的收获,当然也可以有不同看法,欢迎在底部留言探讨。

今天为大家带来的这篇论文是加州大学的陈罗博士 2020 年发表于 PVLDB 的一篇论文:主要内容是其提出了一种动态的基于 LSM-tree 的存储系统的内存管理结构,以及根据工作负载动态调节写内存和缓冲区缓存内存分配的调优器,并在 AsterixDB 上分别以不同工作负载模式对单 LSM-tree 和多 LSM-tree 下的内存管理和内存调优器进行了性能测试。

自适应的内存管理结构

LSM-tree 被广泛应用于现代 NoSQL 系统中,如 LevelDB、RocksDB、Cassandra、HBase、X-Engine、AsterixDB 等。与传统的就地更新结构不同,LSM-tree 采用了非就地更新设计:首先在内存中缓冲所有写入,它们随后被刷新到磁盘,以形成不可变的磁盘组件;磁盘组件被定期合并,以提高查询性能和回收废弃记录所占用的空间。与所有的页面都在共享缓冲池中管理的就地更新系统相比,LSM-tree 引入了额外的内存墙,这些内存墙是指各个内存区域之间阻碍有效内存共享的障碍。

Image

图1 基于 LSM-tree 的存储引擎结构

以图 1 为例,总内存被划分为存储内存组件的写内存和存储不可变页面的磁盘缓冲区缓存。在这样的一个结构中存在三道内存墙,首先是为内存组件被分配固定的大小,例如 RocksDB 为每个内存组件设置了大小为 64MB 的限制,而 AsterixDB 规定最大可写的数据集个数为 N 个(N 默认是 8),也就是说每个活跃的数据集只能得到 1/N 的总的写内存。这样做的好处是比较方便,而且一定程度上能保证鲁棒性[1],但因为固定或者平均分配不是最优的分配方法,因此可能对系统的性能有负面的影响。

Image
图2 论文提出的自适应的内存管理结构

为了打破这三道内存墙,本文提出了一种自适应的内存管理结构,与前一种的不同体现在:

  • 首先,不为每个内存组件设置大小限制,而是所有内存组件都是通过共享的内存池来管理的;

  • 其次,根据不同的工作负载动态地将写内存的组件(即 SSTable 文件)进行刷盘操作,当 LSM-tree 没有足够的内存来存储传入的写操作时,将从池请求更多的页面,而当总体写内存使用过高时,将选择 LSM-tree 将其内存组件刷新到磁盘;

  • 最后,论文提出的内存调优器可以自适应地调节写内存和缓冲区缓存的内存分配。

正是通过这样的结构有效地打破了前面的三道内存墙。

写内存管理

一、分区内存组件

使用新的内存管理结构,内存组件可以变得非常大,因为它的大小不受限制。现有的 LSM-tree 实现使用跳表或者 B+ 树来管理内存组件,并始终将内存组件完全刷新到磁盘。但是,这减少了内存的使用,原因有两个:

首先,因为 B+ 树的页面大约有 2/3 是满的,所以在使用时可更新的 B+ 树存在内部碎片;

其次,考虑一个很大的 memtable 对象被刷新到磁盘之后,内存释放出来,新的 memtable 在前一段时间内内存利用率都很低,这降低了随着时间推移的平均内存利用率。

Image

图3 分区内存组件的LSM-tree结构

为了最大限度地利用内存,论文针对单个 LSM-tree 的内存组件提出使用内存分区的 LSM-tree 来管理写内存,即写内存也采用分层的方式。 如图 3 所示,可以分为 M0,M1 和 M2 三层,在 M0 处有一个活动的 SSTable 用于存储传入的写操作。当 M1 存满时,它的一个 SSTable 将使用内存合并到下一个层 M1。在选择合并的 SST 时,论文使用了一种贪婪选择策略,通过最小化在 M1 层重叠的 SSTable 的大小与所选的在 M0 处的 SSTable 的大小之间的比值来选择 SSTable 进行合并。

M2 层的内存 SSTable 最终被刷新到磁盘。对于内存组件存满所触发的刷新,M2 的 SSTable 将以循环方式刷新到磁盘。对于由事务日志长度过长所触发的刷新,使用最小日志序列号(Log Sequence Number,LSN)的 SSTable 将被刷新到磁盘。

这样的结构提高了内存利用率并降低了写入放大。首先,LSM-tree 比 B+ 树获得了更高的空间利用率;其次,由于所提的结构是范围分区的,它可以使用部分刷新,一次刷新一个内存 SSTable,从而使写内存始终保持满的状态。

二、多 LSM-tree 内存管理

在管理多个 LSM-tree 时,一个基本问题是如何将写内存分配给这些 LSM-tree。由于写内存是按需分配的,所以这个问题变成了如何选择要刷盘的 LSM-tree。对于日志触发的刷新,应该刷新 LSN 最小的 LSM-tree 以执行日志截断;对于内存触发的刷新,现有的 LSM-tree 实现(如 RocksDB 和 HBase)选择使用最大的内存组件刷新 LSM-tree。直观的感觉是,刷新这个 LSM-tree 可以回收最多的写内存,这些内存可以用于后续的写操作。但是,此策略可能不适合分区内存组件,因为由于部分 SSTable 刷新,刷新任何 LSM-tree 都将回收相同数量的写内存。

一种可选的方法是最小日志序列号策略,即每次选择最旧的 LSN 进行刷盘操作。这样做,LSM-tree 的刷新速率会与它的写入速率大致正比,而且比较热的 LSM-tree 会比较冷的 LSM-tree 更频繁地刷新。此外,当刷新是以日志触发型的刷新主导时,这样的策略还有助于日志截断。

论文提出了一种最优的刷盘策略,当给定 K 个 LSM-tree 的时候,写内存的分配可以被定义为一个最小化写成本的优化问题,即通过最小化第 i 个 LSM-tree 的写速率与每个条目大小的比值,乘上每个条目的写成本,这样一个式子来实现最优的写内存分配,如下式①所示。

Image

其中 ai 为第 i 个 LSM-tree 的内存分配比,ri 为第 i 个 LSM-tree 的写速率,Ci 是每个条目的写 I/O 成本。而 Ci 可以通过初次写入日志时的成本和每次合并时产生的成本之和计算,如下式 ②:

Image

其中 ei 为条目大小,P 为磁盘页面大小,T 为合并策略的大小比,|Li | 为第 i 层的大小,Mw 为总的写内存大小。将②式带入①式,再由拉格朗日乘数法可得下方③式:

Image

即第 i 个 LSM-tree 的最优内存分配比等于它的写速率占所有 LSM-tree 的写速率的比值。也就是说,分配给 LSM-tree 的写内存应该与它的写速率成正比,较热的 LSM-tree 相比于较冷的 LSM-tree 会获得更多的写内存。

三、内存管理方案评估

论文首先对提出的分区内存组件方法和最优刷盘策略进行了评估实验,采用的测试平台是 AsterixDB,基线分别是基于静态 B+ 树和动态 B+ 树的内存管理方法。静态的 B+ 树内存管理方法下,分为 AsterixDB 默认设置的活跃数据集个数为 8 的 B+ 树静态默认基线和每个实验下不同的活跃数据集个数 B+ 树静态调节基线。动态 B+ 树内存管理方法是指不为每个内存组件设置大小限制。刷新策略分别采用了最大内存、最小日志序列号的刷新策略和论文提的最优刷新策略,并在 YCSB 的不同读写比率的工作负载模式进行了实验。

Image
图4 单LSM-tree的内存组件实验评估结果

图 4 为在单个 LSM-tree 的内存管理对比实验,可以看到针对不同的工作负载,尤其是写入繁重的工作负载(图 4 b)下,由于分区内存组件方法更有效地利用写内存,对系统的性能提升最大。

Image

图5 多LSM-tree内存组件实验评估结果

图 5 为在多个 LSM-Tree 的对比实验下,最小日志序列号策略和最优刷新策略通过在 LSM - 树之间更好地分配写内存,提升了系统整体的吞吐量。

内存调优器

一、调优方法

内存调优器的目标是在写内存和缓冲区缓存之间找到最优的内存分配,以最小化每个操作的 I/O 成本,这反过来又可以最大限度地提高系统效率和总体吞吐量。假设总可用内存为 M,为了便于讨论,假设写内存大小为 x,这意味着缓冲区缓存大小为 M-x。设写内存为 x 时,write(x) 和 read(x) 是每次操作的写成本和读成本。调优目标是最小化每个操作的加权 I/O 成本,得到以下公式④:

Image

这里的两个加权参数 ω 和 γ 允许用户针对不同的用例调整调优目标。例如,在机械硬盘上,因为 LSM-tree 主要使用顺序 I/ O 进行写操作,ω 可以设置得更小;而在固态硬盘上,因为 SSD 的写操作通常比读操作成本更大,ω 可以设置得更大些。由于最佳的内存分配依赖于所处的工作负载,因此论文中采用了在线调优方法来执行连续调优。通过对 cost(x) 进行求导得出了 write(x) 和 read(x) 的导数,并通过实时的统计影响 write(x) 和 read(x) 导数的一些量,来调节动态地内存的分配。

二、实际中的 I/O 成本

内存调优器的最优性取决于 cost(x) 的形状。为了确保内存调优器总是找到全局最小值,cost’(x) 应该最多有一个根。直观上,当分配的写内存的大小比较小的时候,会有大量的合并操作,合并成本会比较大,总的 I/O cost 也会比较大;而当分配的写内存大小非常大的时候,合并成本会相应减小,但是会增加缓存未命中(buffer cache miss),读的成本会增加,总的 I/O 成本也会增加。因此,一个最优的 x 应该平衡读和写的成本。

Image

图6 操作的I/O成本受写内存的大小影响

论文通过实验发现许多实际工作负载的 cost(x) 通常允许内存调优器找到全局最小值。图 7 描绘了实验中 YCSB 写繁重工作负载(其中写和读的比重分别占 50%)和 TPC-C 工作负载的 I/O 成本。这些操作分布在 10 个 LSM-tree 中,每个 LSM-tree 有 1000 万条记录,遵循 80-20 热点分布。对于 TPC-C,比例因子设置为2000。可以看到,对于这两种工作负载,总 I/O 成本都有一个全局最小值。论文还通过改变总的内存大小和读写比率来评估其他配置,并发现总的 I/O 成本总是具有相同的总体形状。

Image

图7 不同写内存大小下的I/O成本

三、性能评估

在所有实验中,初始写内存大小设置为 64MB,模拟缓存大小设置为 128MB。LSM-tree 有 1 亿条记录,总容量为 110GB。为了评估内存调优器的准确性,在 TPC-C 上进行了一组实验,以比较调优后的性能和最佳性能。这里使用 TPC-C,因为它比 YCSB 表示更复杂、更实际的工作负载。比例系数设定为 2000。因为对于用到的 SSD 写入的成本是读取的两倍,在实验中,设置写权值 ω 为 2,读权值 γ 为 1,以平衡这两个成本。

为了找到最优内存分配(称为 opt),使用穷尽搜索来评估不同的内存分配,增量为 128MB。为了显示内存调优器的有效性,实验包含了两个额外的基线。第一个基线(称为 64M)总是将写内存设置为 64MB,这是内存调优器的起点;第二个基线(称为 50%)在缓冲区缓存和写内存之间平均分配总的内存预算。总内存预算从 4GB 改为 20GB,每个实验运行 1 小时。图 8 显示了每个操作的加权 I/O 成本和不同内存分配的事务吞吐量。

Image

图8 TPC-C上的内存调优器性能评估

使用穷举搜索,论文发现最小化加权 I/O 成本也可以最大化事务吞吐量。自动调优的 I/O 成本和吞吐量(tuned)非常接近于通过穷举搜索找到的最优值,这表明了内存调优器的有效性。此外,内存调优器的性能明显优于两个基于启发式的基线。分配较小的写内存可以使读开销最小化,但会导致更高的写开销。相比之下,分配一个大的写内存可以使写开销最小化,但是读开销会增加很多。因此,这两种分配也不能最大化总体事务吞吐量。

结语

本论文提出可以促进自适应内存管理的 LSM 内存管理结构,通过分区内存组件结构和新的刷盘策略,以更好地利用写入内存;为了打破写内存和缓冲区缓存之间的内存墙,引入了内存调优器,它可以根据工作负载模式连续地调优内存分配。实验证明,通过这些技术一起支持自适应内存管理,以最大限度地降低了基于 LSM 的存储系统的 I/O 成本。

参考文献:

[1] Taewoo Kim, Alexander Behm, Michael Blow, et al. 2020. Robust and efficient memory management in Apache AsterixDB. Software: Practice and Experience 50, 7 (2020), 1114–1151.


欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/21004.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

antd-vue-admin——通过链接跳过登录页直接进入系统内部——基础积累

最近在写后台管理系统,遇到一个需求,就是从系统A带参数可以直接进入到系统B内部。不通过系统B的登录页面进行登录。 一般系统的登录,都需要用户名和密码等参数,然后获取到token信息,最后进入到系统内部。 下面介绍具…

4. QT中的鼠标键盘事件 --- 鼠标拖拽案例

1. 说明 在QT的控件或者窗口当中,如果对于当前鼠标或者键盘的功能需要自己定义,可以重写父类当中对应虚函数,主要包括以下几个: //键盘按键按下 virtual void keyPressEvent(QKeyEvent *event); //键盘按键抬起 virtual void ke…

linux 常用命令awk

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。 AWK用法 awk 用法:awk pattern {action} files 1.RS, ORS, F…

【c语言】组件化打包—静态库lib

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

CVE-2023-32233 Linux kernel

0x01 漏洞介绍 近日&#xff0c;研究人员发现了Linux内核的NetFilter框架中的新漏洞&#xff08;CVE-2023-32233&#xff09;。该漏洞可被本地用户用于将权限提升为root&#xff0c;并完全控制系统。问题的根源在于tfilter nf_tables是如何处理批处理请求的&#xff0c;经过身…

AutoSizer.exe:自动调整窗口大小的便捷工具

AutoSizer.exe是一款实用的桌面应用程序,它旨在帮助用户自动调整窗口大小,提供更好的用户体验。无论您是在使用Windows操作系统进行日常工作还是进行多任务处理,AutoSizer.exe可以简化您的工作流程,提高效率。本文将介绍AutoSizer.exe的下载地址、功能介绍、使用方法以及其…

为世界第一大癌症高效研发首创新药,AI大模型助力药物研发叩开未来之门

近日&#xff0c;三位高中生引爆了医药圈&#xff0c;他们使用人工智能&#xff08;AI&#xff09;引擎进行靶点发现&#xff0c;确定了多形性胶质母细胞瘤&#xff08;GBM&#xff09;的新治疗靶点&#xff0c;多形性胶质母细胞瘤&#xff08;GBM&#xff09;是最具侵袭性和最…

238:vue+openlayers绘制扩展,弓形、曲线、扇形、双箭头、进攻方向...

第238个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中利用ol-plot插件进行绘制图形扩展,可以绘制弓形、弧形、标志旗、战斗进攻图形等等。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其他…

【Shell脚本】Linux安装Nginx以及开机自启

目录 一、Linux安装Nginx脚本1、把编写好的安装Nginx脚本放置到nginx.sh文件中2、在检查网络的时候&#xff0c;这里的IP地址&#xff0c;填写的需要安装Nginx服务器的IP地址3、这里的端口号可按照自己的需要进行修改4、安装Nginx脚本 二、Nginx开机自启 一、Linux安装Nginx脚本…

Spring【Again】——复杂POJO的绑定

简单介绍&#xff1a; Again系列是将之前的内容我认为做的不好的地方或者是理解不到位的地方再来一次&#xff0c;加深记忆或者改错。我们就在来复习一下之前我们说过的复杂类型的数据绑定。 先来复习一下简单数据绑定&#xff1a; 简单数据绑定就是我们在传递参数的时候&am…

玩转ChatGPT:快速制作PPT

一、写在前面 首先还是让小Chat推销下自己&#xff1a; 你是否曾经为制作 PPT 而烦恼&#xff1f;现在有了 ChatGPT&#xff0c;再也不必担心灵感枯竭啦&#xff01;使用 ChatGPT 撰写 PPT 可以让你轻松地组织思路、快速得到内容&#xff0c;无需任何营销口号&#xff0c;Cha…

C++模板类与继承

目录 分类 一、模板类不继承 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;分析 &#xff08;3&#xff09;运行结果 二、模板类继承普通类 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;分析 &#xff08;3&#xff09;运行结果 三、普通类继…

Win11校园网不弹出登录页面怎么回事?

Win11校园网不弹出登录页面怎么回事&#xff1f;最近有用户在使用校园网的时候遇到了一些问题&#xff0c;访问登录网站的时候&#xff0c;一直无法显示登录的界面。那么遇到这个情况如何去进行解决呢&#xff1f;一起来看看以下的解决方法分享吧。 解决方法如下&#xff1a; 方…

nodejs处理xlsx文件生成json文件

nodejs处理xlsx文件有好几种方式&#xff0c;这里用的是js-xlsx库&#xff1b; 需求 有一个 xlsx 的文件&#xff0c;里面有几个不同的 sheet&#xff0c;需要读取这个表格中不同 sheet 的数据&#xff0c;并且为每个 sheet 生成对应的 json 文件。 例如有一个名为 template…

文本三剑客之——Awk

Awk Awk简介Awk语法格式Awk常见内置变量Awk实例演示按行输出文本BEGIN模式和END模式按字段输出文本通过管道&#xff0c;双引号调用shell命令date 的用法getline的用法awk数组 Awk简介 Awk是一个功能强大的编辑工具&#xff0c;用于在Linux/UNIX 下对文本和数据进行处理。数据…

ChatGPT vs. Bing vs. Bard

随着 2022 年 ChatGTP 的推出&#xff0c;人工智能聊天机器人的世界突然走上了一条新道路。如今&#xff0c;密切关注 AI 的人都知道&#xff0c;不同公司推出了几款产品。从谷歌拥有自己的 Bard AI&#xff0c;到微软发布新的 Bing AI Chat&#xff0c;再到 OpenAI 发布GPT-4。…

用gost实现远程端口映射

gost 是一个非常优秀的tunnel. 支持多种形式的端口映射。 本文只介绍远程端口映射方式的tunnel. 远程端口映射的意思就是&#xff0c;将本地端的某个服务的端口A&#xff08;tcp/udp&#xff09;映射到远程的某个端口P上&#xff0c; 用户通过访问远程的端口P来访问本地端的这…

生态碳汇涡度通量数据分析

生态碳汇涡度相关监测与通量数据分析 朱老师&#xff08;副教授&#xff09;&#xff1a;来自国内重点高校&#xff0c;长期从事涡度通量观测与分析研究&#xff0c;发表SCI论文多篇&#xff0c;主持国家与地方科研项目多个&#xff0c;在生态环境数据处理与分析中具有丰富的实…

Fourier分析入门——第3章——离散函数的Fourier分析

目录 第 3 章 离散函数的Fourier分析 3.1 引言 3.2 在1点采样的函数 3.3 在2点采样的函数 3.4 Fourier分析是一种线性变换 3.5 Fourier分析是一种基向量的变更 3.6 在3点采样的函数 3.7 在D点采样的函数 3.8 整理(tidying up) 3.9 Parseval[p:zeifa:l]定理 3.10 关联…

【LeetCode】203,移除链表元素。 难度等级:简单。链表入门题目,值得深入研究。

文章目录 一、题目二、解答&#xff1a;迭代法&#xff0c;引入一个新的头结点三、难点解释 【LeetCode】203&#xff0c;移除链表元素。 难度等级&#xff1a;简单。 本题是链表入门题目&#xff0c;值得深入研究。 一、题目 二、解答&#xff1a;迭代法&#xff0c;引入一个…