Nemo: A Low-Write-Amplification Cache for Tiny Objects on Log-Structured Flash Devices

本文提出了 Nemo,一种专为闪存设备上的微小对象设计的低写放大缓存系统,它通过增加哈希碰撞概率来提升集合填充率,并结合基于布隆过滤器的索引与混合热度追踪机制,在显著降低应用级写放大的同时,实现了高内存效率和低缺失率。

Xufeng Yang, Tingting Tan, Jingxin Hu, Congming Gao, Mingyang Liu, Tianyang Jiang, Jian Chen, Linbo Long, Yina Lv, Jiwu Shu

发布于 Wed, 11 Ma
📖 1 分钟阅读☕ 轻松阅读

Each language version is independently generated for its own context, not a direct translation.

这篇论文介绍了一个名为 Nemo 的新系统,它的任务是解决现代数据中心里一个非常头疼的问题:如何高效地存储海量“小碎片”数据,同时不让硬盘“累死”或“浪费空间”。

为了让你轻松理解,我们可以把整个存储系统想象成一个繁忙的快递分拣中心

1. 背景:快递分拣中心的困境

想象一下,你的公司(比如 Twitter 或抖音)每天要处理几亿条短消息(比如评论、点赞)。这些消息都很小,只有几百个字节(就像一个个小包裹)。

  • 内存(DRAM):就像分拣中心里的传送带。速度极快,但空间有限,而且很贵。
  • 闪存(SSD/硬盘):就像仓库里的货架。空间大,便宜,但存取速度比传送带慢,而且有个致命弱点:不能直接修改,只能整块擦除重写

现有的问题:
以前的系统(比如 FairyWREN)在处理这些小包裹时,就像是一个笨拙的搬运工

  1. 写放大(Write Amplification):你想往货架上放一个小包裹,但货架规定必须按“整箱”(比如 4KB)来存。为了放这一个 200 字节的小包裹,搬运工不得不把整箱(4KB)都搬下来,把旧东西扔掉,再塞进新东西,最后把整箱再搬回去。
    • 结果:为了存 1 个包裹,实际写了 20 次数据。这就像为了寄一张明信片,却把整个集装箱都运了一遍,既费油(磨损硬盘寿命)又低效。
  2. 内存开销大:为了记住每个小包裹在货架的哪个位置,需要画一张巨大的地图。如果包裹太多,这张地图本身就要占掉很多内存,导致能存包裹的地方变少了。

2. Nemo 的解决方案:聪明的“集装化”策略

Nemo 就像是一个超级聪明的物流经理,它提出了三个核心策略来解决问题:

策略一:把“小包裹”凑成“大货柜”(提高填充率)

  • 旧做法:来一个包裹,就急着往一个格子里塞。结果格子只塞了 10%,剩下的 90% 空间是空的,但为了写这 10%,整个格子都要被搬运。
  • Nemo 的做法
    • 缓冲池:Nemo 不会来一个就塞一个。它先在一个内存缓冲区里把小包裹攒一攒。
    • 概率等待:它甚至有点“拖延症”。如果缓冲区还没满,它故意不急着写硬盘,而是继续等更多的包裹进来,直到把整个“货柜”(Set-Group)塞得满满当当(比如 89% 以上)。
    • 一次性搬运:等货柜满了,再一次性把整个货柜整整齐齐地搬上货架。
    • 比喻:就像等公交车。以前是来一个人就发一辆车(浪费);Nemo 是等车坐满了再发车。虽然乘客等了一小会儿,但每辆车的利用率极高,大大减少了发车的次数(写放大)。

策略二:用“模糊地图”代替“精确地图”(节省内存)

  • 旧做法:为了找到包裹,必须画一张精确到每个格子的地图,每个包裹都要占几十字节的内存。
  • Nemo 的做法
    • 布隆过滤器(Bloom Filter):Nemo 用一种叫“布隆过滤器”的魔法工具。它不记录“包裹 A 在 3 号架”,而是记录“包裹 A 可能在 3 号架、5 号架或 8 号架”。
    • 分层存储:它把这张“模糊地图”的大部分存在便宜的硬盘上,只把最热门的那一小部分(比如最近常查的)放在昂贵的内存里。
    • 比喻:以前你要找书,必须背下图书馆每一本书的精确坐标(费脑子/内存)。Nemo 的方法是:你只需要知道“这本书可能在 A 区、B 区或 C 区”,然后去这几个区扫一眼就行。虽然偶尔会扫错(误报),但省下了巨大的记忆空间。

策略三:混合“热度”追踪(智能淘汰)

  • 问题:当仓库满了,该扔掉哪些旧包裹?扔掉热门的会后悔,扔掉冷门的又可惜。
  • Nemo 的做法
    • 它不记录每个包裹被访问了多少次(太占内存),而是记录**“这个货柜最近是不是经常被打开”**。
    • 如果一个货柜最近很火,里面的包裹就算平时没人看,Nemo 也会把它们“捞”出来保留在内存里,防止被误删。
    • 比喻:就像超市的货架。如果某个货架最近很热闹,经理就会把货架上所有东西都保留,哪怕其中有个罐头平时没人买,因为万一有人想买呢?这种“连坐”策略既省了记数器的内存,又保证了热门商品不丢。

3. 效果如何?

实验结果显示,Nemo 非常成功:

  1. 写放大极低:它把写放大从原来的 15 倍(写 1 次实际写 15 次)降低到了 1.56 倍。这意味着硬盘的寿命延长了 10 倍,电费也省了。
  2. 内存占用少:每个包裹只需要 8.3 比特 的内存开销,比之前的方案更省空间。
  3. 速度快:虽然它用了一些“模糊”策略,但因为它是批量操作,反而让读取速度更稳定,没有卡顿。

总结

Nemo 就像是一个精明的物流大师。它不再盲目地为了存一个小包裹而大动干戈,而是通过**“攒货再发”(提高填充率)、“模糊定位”(节省内存)和“连坐保热”**(智能淘汰),完美解决了在廉价大硬盘上存储海量小数据时的效率问题。

这不仅让数据中心省钱(少买硬盘、少换硬盘),也让我们的 APP 响应更快、更稳定。