问题
内存键值(KV)缓存[13,46]弥补了高性能网络和磁盘设备之间的性能差距。但内存缓存系统面临缓存节点之间的负载不平衡问题[5,29,31,50,64,65],这通常是由数据访问中的流行度偏差引起的,其中少数KV对象的访问频率远远高于其他对象。
为了缓解负载不平衡问题,之前的研究采用对象复制[2,15,29],或将对象划分为段并在缓存节点上均匀分布。但这些方法要么适用于大型对象(数百MB到数十GB[61]),要么引入额外的内存开销。
本文对56条生产轨迹进行了分析,发现小对象(几十字节到几KB)占主要部分,并得出两个观察结果:
-
小对象主导轨迹,且数据访问高度偏斜。
-
对象的热度在几天内保持稳定。
通过实验发现,与使用单个get操作相比,从同一节点检索多个对象的多get操作产生的尾延迟要短得多。因为减少了网络开销和序列化,可以借此通过批量操作优化性能。
本文方法
本文提出了AC Cache,一种用于小对象的访问相关性感知的内存缓存系统。
-
将KV对象的分布表示为整数线性规划问题,以平衡数据访问和内存消耗。
-
基于计数最小草图(CM草图),以内存高效的方式捕获访问相关性,并生成细粒度的相关性组。
-
将相关组的分布表示为最大流问题来平衡数据访问,并利用启发式算法调度其他KV对象来平衡内存消耗。
开源代码:https://github.com/nankeys/ACCache
在阿里云上对数十亿个对象进行的广泛实验表明,AC Cache可以将尾部延迟降低5.1-80.2%,并将访问吞吐量提高42.8-534.8%。
总结
针对内存KV缓存问题,现有方法主要适用于大对象,进行对象划分和复制。本文分析发现小对象占主要部分,且访问高度倾斜、热点稳定。于是提出AC Cache,用于小对象的访问相关性感知的内存缓存系统。包括3个技术:(1)将KV对象的分布表示为整数线性规划问题,以平衡数据访问和内存消耗。(2)基于Count-Min Sketch,捕获访问相关性,并生成细粒度的相关性组。(3)将相关性组的分布表示为最大流问题平衡负载,并利用启发式算法调度平衡内存消耗。