FAST 20阿里的一个关于in-memory kv store的工作,优化基于hash的in-memory key-value store的热点访问问题。
Problem
Hot spot热点问题也就是真实场景下访问的不平衡性,如zipf分布。
如上图所示,在memcached等key-value cache system中的设计思路很简单,维护一个大hash table,用collision chain拉链法来应对hash collision。当chain的末端为hot item的时候,read的过程需要重复读chain前面部分的item。除了造成不必要的mem read以外,也使得system cache(CPU cache)性能下降。
比较明显的几个Solution:
- rehash(ememory footprint开销↑)
- 给hot item加一层front end cache(过还需要应对hotspot shift的问题)
在LevelDB, RocksDB等kv store on disk里就是使用后者方案。因为memory快很多,用来做cache很自然。
Solution
把原来的线性chain改成了一个环形结构hot ring,保证hash bucket的head指针动态指向链中的hot item来提升read的速度。(那万一有好多个hotspot咋办?文章实验里说一条冲突链5-10个item,一般只有一个hotspot)
这样的设计引出几个新问题:
- 环上数据会变化,怎么终止遍历
- 热点的动态感知怎么实现,因为热点会不停变动
- 对结构的改动影响并发,怎么实现无锁
- 太热了,环上有语义上的多个热点怎么办
有序环
用环上的key做有序环,来判断miss(则不需要reach ring’s end)。
这里做一个trick,为了降低遍历的时候比较key的开销,先用一个短的tag值做预比较排序,相同再用key做排序。
把hash结果的前k位用来分bucket,后n-k位做tag。
热点感知策略 Hotspot Shift Identification
Random Movement Strategy
每个线程维护一个thread local的计数器,每当处理R个request后,会判断当前的访问的item是不是在collision chains head上,如果在,那么不做任何处理,如果不在,那么让head指向当前访问的item,也就相当于当前命中的item转变成了hotspot item。
依赖概率的一个高效操作,低R值会导致震荡,文章R设为5。
Statistical Sampling
每R次访问,尝试采样对应的chain,统计item的访问频率。
热点继承:若第R次访问的item已经是头指针指向的item,则不启动采样。
用了指针数据的末端来做counter等标记位,没有占用额外空间。
具体采样过程之后补充。。。
无锁并发访问
实现主要参照A Pragmatic Implementation of Non-blocking Linked-lists,Lock-free linked lists using compare-and-swap。主要是实现了对于索引链表的并发性操作的维护。
待补充…(*因为fatcache的索引操作是单线程,靠多实例来维护并发性,暂时不写这部分了……
适应热点数据量的无锁rehash
多个热点,那就增大hashtable,做rehash。设置一个平均每次访问所需内存访问次数的阈值(文章为2),触发就rehash。
initialization
先把用来分bucket的位数往后增加一位(复用tag的最高一位),即翻倍hashtable的大小,一个老head对两个新head。
然后根据剩下的tag,数据根据范围$[0,T)$切分两半$[0,\frac{T}{2}),[\frac{T}{2},T)$,分给两个新head。
具体的切分操作如下:
创建一个rehash node,包含两个空数据的item(被两个新head指向),一个tag=0,一个tag=T/2。
Split
把两个空item插入来完成分裂。如图所示,B和E作为边界的节点,他们的前面被插入。注意图上的指针变化。
完成了此步之后,就可以对新hashtable进行访问了。
Deletion
回收旧hashtable、俩空item(注意图上指针的变化)。
note: 感觉在做split的时候,要保证老访问全部返回了,再上锁split。
但原文说”Note that the transition period only blocks the rehash thread, but not access threads”,不太理解…
Refer
FAST ‘20 - HotRing: A Hotspot-Aware In-Memory Key-Value Store on Youtube
看了几篇FAST 2020 – 暗淡了乌云 知乎专栏
前沿 | 最快KV引擎!存储顶会FAST’20论文揭秘Tair创新性引擎