存储

什么是“异构内存”存储引擎(HSE)?

Neelima Premsankar著 - 2020-06-17

如果你还没有听说,美光最近发布了它的 异构内存存储引擎 致开源社区. 我们的设计重点是提供一个解决方案,使存储类内存(SCM)和ssd性能更高, 通过减少写放大,增加了SSD的有效寿命, 所有这些都被大规模部署. 与传统存储引擎相比,HSE通常有利于雅虎等工作负载! 云服务基准测试(YCSB)多次.

什么是“异构内存”存储引擎(HSE)?

为什么异构? 美光拥有广泛的动态随机存取记忆体沙巴体育结算平台组合, SCM和ssd为我们提供了构建存储引擎的洞察力和专业知识,可以智能地管理跨不同内存和存储介质类型的数据放置. 与为硬盘驱动器编写的传统存储引擎不同, HSE的设计初衷是利用SCM和ssd的高吞吐量和低延迟.

实现

HSE利用离散介质类型的优势,支持两种介质类型进行数据存储:“分级”介质类和“容量”介质类. 登台媒体类通常配置为在高性能(IOPS和/或MB/s)上运行。, 低延迟和高写入持久性介质(例如, SCM或数据中心级ssd(带NVMe™). 热备数据, 短期访问在冷时分配给暂存媒体类, 长期数据通常被配置为以较低的成本运行, 容量介质类层中的较低写入持久性介质(如四级单元[QLC] ssd). 这使得HSE能够实现高吞吐量和低延迟,同时还可以节省低耐久性介质上的写入周期.

可配置的持久性层

HSE持久性层是驻留在暂存媒体类上的用户可配置逻辑构造. 持久性层提供用户可定义的数据持久性,其中用户可以指定在系统故障时可能丢失多少毫秒数据的上限, 比如功率损失.

数据最初从动态随机存取记忆体摄取到持久性层. 存储从更快的暂存媒体类分配,以满足低延迟, 耐久性层的高吞吐量要求. 与传统的预写日志(WAL)不同, 这个持久性层避免了传统日志中常见的“双重写入问题”,从而显著减少了写入放大.

数据老化

随着存储数据的增长, 数据在系统的多个层之间迁移,并作为垃圾收集的一部分进行重写,以优化查询性能(完成时间)。. 以下是高级流程:

  1. 当需要存储新数据时,首先将其写入持久性层.
  2. 随着数据的老化,它被重写为容量媒体类,作为后台维护操作.
  3. 当新数据到达时, 新数据可能使现有数据过时(通过更新或删除以前写入的记录). 维护操作定期扫描现有数据,进行空间回收. 如果大部分数据现在无效或过时, 这些操作通过重写仍然有效的数据来回收空间——释放旧数据占用的所有空间.e.、垃圾收集). 为了有效地服务查询,还安排了有效数据,以便可以轻松扫描.
  4. 有效的数据被重新组织到层中,以便更快地处理查询. 在整个过程中,键和值数据被隔离到单独的流中——键被写入暂存媒体类以促进更快的查找. 最后,底层的旧数据被写入指定容量的媒体类设备.

在处理查询和从两个媒体类读取数据时,索引被页面缓存到动态随机存取记忆体中. LRU(最近最少使用)算法对索引进行动态排序,以方便索引跟踪, 夹住最热的(i).e.(访问最频繁的索引),假设系统动态随机存取记忆体可用.

媒体课表演

我们的测试设置使用了一个 带NVMe的美光9300固态硬盘作为分期媒体类设备和四个微米 5210 SATA QLC ssd盘 作为容量介质类设备. 我们使用 雅虎!®云服务基准(YCSB) 来比较每秒操作数和99.9%尾部延迟:

  • 首次运行:配置为容量媒体类设备的4个微米 5210 QLC ssd
  • 第二次运行:4块5210 SSD配置为容量媒体类设备,1块带NVMe的微米 9300 SSD配置为暂存媒体类设备

我们跑 YCSB工作负载A、B、C、D和F 两种配置的线程数相同.1 表1总结了几种YCSB工作负载组合, 应用程序示例取自YCSB文档. 表2到表4分享了沙巴体育安卓版下载硬件的其他测试细节, 软件和基准配置.

表1:工作负载

YCSB工作量 I / O操作
应用实例 
A 50%读
50%的更新
会话存储记录用户会话活动
B 95%读
5%的更新
照片标记
C 100%读
用户配置文件缓存
D 95%读
5%的插入
用户状态更新
F 50%读
50%读-修改-写
用户数据库或记录用户活动

1 没有测试工作负载E,因为它没有得到普遍支持

 

表2:硬件细节

服务器平台
服务器平台 服务器平台 基于Intel®(双插槽) 
处理器
2 Intel E5-2690 v4
内存
256 gb DDR4
ssd
暂存级介质:1x带NVMe的美光9300 SSD
容量级介质:4倍微米 5210.68TB SATA ssd
介质配置
LVM分条逻辑卷
 

表3:软件细节

软件详细信息
操作系统 Red Hat Enterprise Linux 8.1
HSE版本
1.7.0
RocksDB版本
6.6.4
YCSB版本
0.17.0
 

表4:基准2

YCSB基准配置
数据集 2TB(20亿个1000字节记录) 
客户端线程
96
操作
每个工作负载20亿美元

2 不同的配置可能显示不同的结果.

吞吐量

YCSB首先加载数据库. 这是一个100%的插入工作负载. 将9300添加到组合中可以将加载2TB数据库所需的时间减少四倍.

图1显示了五个YCSB工作负载的负载阶段和运行阶段的吞吐量. 对于写密集型工作负载,如工作负载A(50%更新)和工作负载F(50%插入), 添加微米 9300作为登台媒体类可以提高总体吞吐量2.3和2.分别为1次. 工作负载B和D(5%的更新/插入)在吞吐量方面的改善较为温和,因为这些工作负载中95%的读取几乎完全来自包含容量媒体类的5210块ssd.

 

图1:YCSB工作负载的吞吐量

延迟

图2显示了99.9%的读(尾)延迟. 添加9300后,除工作负载C外,所有工作负载的读尾延迟都得到了显著改善(2 ~ 3倍), 也就是100%读取). 回想一下,新到达的写操作首先被9300吸收,然后随着数据的增长在后台逐渐写入5210. 关键数据(索引)被写入9300,使得在第二个配置中查找更快. 一小部分读取由9300而不是5210提供服务(取决于正在读取的数据的查询分布和年龄)。.

另外, 通过减少对5210的写入次数, 即使是由5210提供服务的读也较少受到正在进行的写的争用, 所以尾部读延迟更低. 插入/更新延迟没有被描绘出来,因为它们在运行阶段的两种配置中是相似的.

 

图2:YCSB工作负载的延迟

字节写

最后, 我们测量了在执行每个工作负载的过程中写入5210的数据量. 添加9300作为暂存媒体类可以减少写入5210的字节数, 保持写周期并延长5210的写寿命. 在加载(仅插入阶段)期间, 写入5210的字节数减少了1 / 2.4,见表5.

 

表5:写减少

字节写
配置 4x 5210   9300 + 4x 5210
GB写入5210(容量介质)
7,260
2,978
GB写入9300(暂存介质)
N/A
4,158

图3显示了在YCSB工作负载运行阶段写入的gb总数. 注意,这包括用户和后台写入. 除了工作负载C(100%读取), 其他工作负载显示,通过向配置中添加一个9300,写入5210的总字节数至少减少了两倍.

 

图3:写入数据的减少

未来的工作

作为未来工作的一部分, 我们正在寻求扩大HSE API的具体方面,以提高其使用, 比如自定义媒体类策略,它赋予应用程序更多的控制权. 例如, 如果应用程序创建了键值存储(KVS), (相当于关系数据库中的表),仅用于索引, 它可以指定特定的KVS应该使用暂存媒体类来加速查找. 如果索引KVS的大小变得太大而无法在staging设备上容纳, 应用程序可以指定使用暂存媒体但退回到容量媒体的策略. 我们还可以引入预定义的媒体类策略模板,并扩展HSE API,以允许应用程序根据需要使用它们. 一定要保持联系,了解潜在的发展.

Neelima Premsankar

Neelima Premsankar

Neelima Premsankar是美光公司HSE项目的存储软件工程师. 她曾从事数据中心固态驱动器和网络驱动器的固件工作. 她喜欢举起重物,然后放下来取乐(举力)。.

+