论文阅读 A Hotspot-Aware In-Memory Key-Value Store

A Hotspot-Aware In-Memory Key-Value Store

一些需要了解的知识点

1.rehash

2.无锁结构

3.RCU(Read-Copy Update)是数据同步的一种方式,适用于需要频繁的读取数据

4.CAS(Compare-and-Swap),即比较并替换

5.YCSB*,全称为*“Yahoo! Cloud Serving Benchmark,测试工具

Introduction

热点问题(即在高度倾斜的工作负载中频繁访问的一小部分项目)是现实场景中的常见问题

1、背景

①.有许多解决方案可以解决群集范围内的热点问题,例如一致哈希数据迁移前端数据缓存( consis-
tent hash , data migration and front-end data caching)

②.此外,单节点热点问题也得到了很好的解决。计算机体系结构利用分层存储布局(例如,磁盘、随机存取存储器、中央处理器高速缓存)将频繁访问的数据块高速缓存在低延迟存储介质中。LevelDB和RocksDB,使用内存中的千伏安来管理热项目。

③.但是在内存中键值系统的 “热点问题”经常会被忽略,而且这个问题在互联网的时代变得至关重要

2、问题提出

许多索引结构可用于实现KVS,skip list , balanced/trie trees, and hashes。哈希由于更快的查找而最受欢迎

虽然存在减少内存访问的机制,但它们的效果有限。例如,

  • CPU缓存有助于加速热点访问,但只有32MB的容量。

  • 重新散列(rehash)操作有助于减少每个冲突链的长度,但会显著增加内存占用。

    这种情况为我们提供了在高度倾斜的工作负载中进一步优化热点访问的机会。

首先,CPU高速缓存可以加速对热数据块的访问(即,以64字节高速缓存行为单位)。但是对于大多数商品服务器来说,CPU缓存的容量在32 MB左右,而整个内存卷超过256 GB。只能缓存0.012%的内存,远远低于图1中观察到的热点比率。

其次,哈希表可以被扩大(rehash)以减少冲突链的长度,从而定位热项目需要更少的存储器访问。然而,当哈希表已经很大时,就不再建议重新散列了。例如,对于两个连续的再散列操作,第二个操作需要两倍的内存空间,但只带来一半的效率(intermsofthechainlengthereduction)。

总之,所有现有方法只能在很小程度上缓解热点问题

3、文章贡献

提出了HotRing,这是一种内存KVS中的热点感知,它利用了一个哈希索引,该索引针对对一小部分项目(即热点)的大规模并发访问进行了优化。

最初的想法是使查找项目所需的内存访问与项目的热度(负)相关,即较热的项目应该读取得更快。为了实现这个目标,必须解决两个挑战:

  • 热点转移——热点项目的集合不断转移,我们需要及时检测和适应这种转移;

    对于热点转移问题,我们用无序环结构替换散列索引中的冲突链,这样当热点转移时,头指针可以直接指向热点项目,而不会影响正确性。

    此外,我们使用轻量级机制来检测运行时的热点转移。

  • 并发访问——每个热点本质上都是由大量并发请求访问的。因此,为了保持令人满意的性能,支持读/写操作的高并发性至关重要。

    我们采用了受现有无锁结构启发的无锁设计,并对其进行了扩展,以支持HotRing所需的所有操作,包括热点移位检测、头指针移动和有序环的rehash( hotspot shift detection, head pointer movement and ordered-ring rehash)。

总结

  • 我们在现有的内存索引中发现了热点问题,并证明了热点感知设计在提高热点项目的性能方面有很大的潜力
  • 我们提出HotRing,一种有序的环散列结构,作为第一个利用热点感知设计的方法。它通过将头部指针移近热点项目来提供对热点项目的快速访问。它还采用轻量级策略( lightweight strategy)来检测运行时的热点转移。
  • 我们使HotRing无锁,以支持大规模并发访问。特别是,我们从头开始设计特定于HotRing的操作,包括hotspot shift detection, head pointer movement and ordered-ring rehash

Design of HotRing

在本节中,将会详细阐述采用热点感知的HotRing中的详细设计,包括索引结构、热点移位检测策略和无锁操作(即读/写、插入/删除、头指针移动和重新散列)

1、Ordered-Ring Hash Index

1.1、传统KVS的实现方法
  • 许多索引结构可用于实现KVS,如skip list,balanced trees和hashes,其中hashes因查找速度快而最受欢迎。
  • 但是哈希索引无法感知热点项目,因为项目是平均地分布在冲突链中,在工作负载高度倾斜的情况下,这种分布会导致整体性能的严重下降。

在这里插入图片描述

1.2、Ordered-Ring Hash Index
  • 改进了传统散列索引中冲突链的结构,链中的的头指针可以指向相应环中的最后一项与第一项相连,形成一个环。并且该环是一个有序环。

  • 以这种方式,哈希表中任何项,碰撞环的设计使得HotRing可以根据数据热度移动头部指针,并从任何开始位置扫描整个环。

在这里插入图片描述

1.3、搜索停止条件

一个问题:由于基于环的设计,存在一个严重的问题:如果没有找到目标项目,它可能导致环中的无限遍历

解决方法:在变成有序环的时候,因为key的大小可能并不小,只是简单的对key进行排序,比较会带来巨大的开销。我们构建字典序:orderi = (tagi, keyi)。先根据tag进行排序,tag相同再根据key进行排序。

公式:

在这里插入图片描述

  • u项目B满足搜索终止条件1,搜索项位于环中两项之间,未命中
  • u项目D满足搜索命中条件,命中
  • u项目G满足搜索终止条件2,搜索项位于环中最小项之前,未命中
  • u项目H满足搜索终止条件3,搜索项位于环中最大项之后,未命中[外在这里插入图片描述

2、Hotspot Shift Identification 热点转移识别

在有序环散列索引中,查找过程可以很容易地确定是否有命中或未命中。剩下的问题就是热点移位时如何识别热点和调整头指针

为了获得良好的性能,必须考虑两个指标,即:识别精度和反应延迟 identification accuracy and reaction delay

2.1、Random Movement Strategy

每个线程维护一个变量,记录执行了多少次请求,每R个请求之后,如果第R个请求访问的不是当前的热数据(head pointer指向的元素),则将head pointer指向当前访问的元素。

优点:实现简单,执行策略的开销小

缺点:

  • 当环中存在多个热点项目时,只能处理一个热点项目
  • 若用户的访问负载倾斜程度小,造成头指针移动的频率会变高,效率就会降低
2.2、Statistical Sampling Strategy 统计抽样策略
2.2.1、head pointer即item的构成

由于现代机器的物理地址只占48位(但可以用64位原子比较和交换操作来更新),我们可以利用剩余的16位来记录元数据。

在HotRing中,每个头指针由三部分组成

在这里插入图片描述

a)

  • Activebit是一个用于控制热点识别的统计采样的标志
  • Total Counter记录对相应环的访问次数

b)

  • Rehashis a flag to control rehash process
  • Occupied is used to ensure concurrency correctness并发正确性
2.2.2、Statistical Sampling.
  • 如何低开销地动态识别热点是一个具有挑战性的问题。在保持准确性的同时,将开销降至最低至关重要,这是通过在HotRing中定期采样实现的。特别是,每个线程都为已处理的请求维护一个线程本地计数器。完成所有请求后,我们决定是否启动新一轮采样。
  • 如果第二次访问是一次访问,这意味着当前热点识别仍然是准确的,否则,这意味着热点已经转移,我们开始采样。遵循3.2.1中的类似考虑,参数Ris设置为5。当活动位被置位时,对环的后续访问将被记录在总计数器和相应项目的计数器中。该采样过程需要额外的CAS操作,并导致暂时的访问不足。为了缩短这个周期,我们将样本数量设置为与每个环中的项目数量相同,我们认为这已经提供了足够的信息来导出新的热点。

2.2.3、热点调整

  • 采样过程完成后,最后一个访问线程负责频率计算和热点调整。首先,线程使用CAS原语自动重置活动位,这确保只有一个线程将执行后续任务。然后,这个线程计算环中每个项目的访问频率.
    在这里插入图片描述

  • 因此,选择最小值(Wt)作为热点项目可确保更快地访问热点。如果计算的位置不同于前一个头,则应该使用CAS原语来移动头指针。请注意,该策略不仅处理单个热点,还适用于多个热点。它有助于找出避免热点之间频繁移动的最佳位置(例如,不一定是最热的项目)。热点调整完成后,负责的线程重置所有计数器,为将来的下一轮采样做准备。

2.2.4热点继承
  • 当对头部项目执行RCU更新或删除时,我们需要将头部指针移动到另一个项目。但是,如果头指针随机移动,它很有可能指向一个数据项,这将导致热点识别策略频繁地被触发。此外,由于识别策略的频繁触发,系统的性能会严重下降。
  • 首先,如果冲突环只有一个项目(即下一个项目地址与头指针的位置相同),头指针将被更新或删除。如果有多个项目,HotRing使用现有热点信息(即,头部指针位置)来继承热点。我们为RCU更新和删除操作设计了不同的头指针移动策略,以确保热点调整的有效性:对于头项目的RCU更新,由于访问的时间局部性,最近更新的项目具有被立即访问的高概率。因此,标题指针被移动到标题项目的新版本。对于首项的删除,只需将首指针移动到下一项,这是一个简单有效的解决方案。
2.3、Write-Intensive Hotspot with RCU
  • RCU是指Read-Modify-Update操作,对于小于8B的value,可以通过CAS(compare and swap)原子就地更新。
  • 但是对于超过8字节的数据,就需要先新建一个节点,然后替换旧的节点,这个时候就需要遍历整个链表来获取head pointer的前一个元素。
  • 为了减少内存访问,HotRing增加的是head pointer的上一个元素的counter,这样head就是热点数据的前一个元素,加速了热点数据的修改。
    在这里插入图片描述

3、Concurrent Operations并行操作

头部指针的移动使得无锁设计更加复杂。这主要反映在以下几个方面:

  • 一方面,头指针的移动可能与其他线程并发。因此,我们需要考虑头指针移动和其他修改操作的并发性,防止指针指向无效项。

  • 另一方面,当我们删除或更新一个项目时,我们需要检查头部指针是否指向该项目。如果是这样,我们需要正确而灵巧地移动头部指针。在这一部分,我们主要介绍并发访问的控制方法来解决HotRing中的并发问题。为了实现高访问并发性和确保高吞吐量,我们实现了一整套无锁设计,这些设计已经被之前的工作严格引入。原子CAS操作用于确保两个线程不会同时修改同一个下一项地址。如果多个线程试图更新同一个下一个项目地址,只有一个线程成功,其他线程失败。失败的线程必须重新执行它们的操作。

  • Read:不需要额外操作,完全无锁。

  • Insertion

    ①创建新项

    ②连接新项的next指针

    ③检查前一项的next指针:没被占用,通过CAS修改前一项的指针,否则进行重试

  • Update

    ①当更新的数据不超过8字节:使用原地更新 CAS,不需要其它操作

    ②超过8字节使用RCU更新,分成三种情况

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • Deletion.

    ①设置被删除项的occupied为占用

    ②再更改前一项的next指针

  • Head Pointer Movement.

    ①正常的头指针移动:

    设置新指向的项目的occupied为占用

    ②更新/删除头指针指向的项目:

    更新时,需要将旧版本项目的occupied为占用

    删除时,需要将被删除项目和被删除项目的下一项的occupied为占用

4、Lock-free Rehash

随着来自插入的新数据的到来,环中冲突项目的数量继续增加,导致每次访问遍历更多的项目。在这种情况下,KVSes的性能会严重下降。我们在HotRing中提出了一个无锁重挂策略,允许灵活的重挂数据量增加。传统的重散列策略由哈希表的负载因子(即平均链长)触发

然而,这没有考虑热点的影响,因此不适合HotRing。为了使索引适应热点项目的增长,HotRing使用访问开销(即检索项目的平均内存访问次数)来触发重新散列。我们的无锁重挂策略包括初始化分割删除三个步骤:

4.1、Initialization
  • 创建一个rehash线程,它会初始化一个2倍于旧空间大小的哈希表,每一个旧表的头指针会对应两个新表的头指针,原表中的每个环都将被拆成两个环。rehash操作中,哈希值用于定位的部分从k位变成了k+1,tag则减少了1位。HotRing根据tag范围对数据进行划分。假设tag最大值为T,tag范围为[0,T),则两个新的Head指针对应tag范围为[0,T/2)和[T/2,T)
  • lrehash线程会创建一个rehash node,其中包含两个空数据的rehash child item,tag分别为0和T/2,并用rehash标志来标识。它们将作为拆分后两个环的头节点。

在这里插入图片描述

4.2、Split

接下来需要分割原有的环到2个新的环。如图,因为itemB和E是tag的范围边界,所以线程会将两个rehash item节点分别插入到itemB和E之前(此时新表被激活,后续的访问可以通过新表进行,而过去旧表的访问也依然可以继续进行。)

在这里插入图片描述

4.3、Deletion

保持一段过渡期,确保所有针对旧表的访问结束后,rehash线程删除rehash nodes,将环真正拆成两个新环

在这里插入图片描述

学习总结

1.了解到“热点”问题,对于那些经常被访问的数据,在访问负载不均衡及高并发的情况下,存储系统该如何设计,这篇论文给我提供了一个实现的思路。

2.学到了一些知识名词,如CAS,RCU,Lock-Free等,明白了基本的原理及它们是适合在什么场景应用的。

3.一些数据结构的知识,如何在环结构上增删改查、哈希表为了保证稳定性和效率,可以通过rehash操作

参考:
1、https://www.usenix.org/conference/fast20/presentation/chen-jiqiang
2、https://www.cnblogs.com/helloworldcode/p/13022166.html/
3、https://blog.csdn.net/weixin_37802735/article/details/108184330
4、https://blog.csdn.net/qq_40758751/article/details/106645884?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-3.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-3.not_use_machine_learn_pai

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值