“Range as a Key” is the Key! Fast and Compact Cloud Block Store Index with RASK (FAST 2026)

一句话总结Alibaba-Cloud EBS 索引吃掉节点 ~57.1% 内存、最差集群因索引内存不够浪费 ~35% 物理存储;生产 trace 显示 65–81.5% 写属于连续 range(CW),RASK 用 ART trie 内部节点 + log-structured leaf 把 range 直接做 key,在四份行业 trace 上内存最多省 98.9%、吞吐最多 32.0×、P99 尾延迟降 48.2–97.4%,集成 RocksDB 后吞吐达原 skiplist 的 6.46×

问题与动机

Elastic-Block-Store(AWS EBS、Alibaba-Cloud EBS、Azure Managed Disks、GCP Persistent Disk)用 in-memory 索引把虚拟块设备(VD)的 LBA 映射到后端 DFS 中的 DataFile 位置。为保证 I/O 延迟,活跃索引必须 fully in-memory。随着租户规模扩大和 QLC SSD 等高密度介质普及,索引条目数与数据量同步膨胀,成为节点 DRAM 主消费者:Alibaba Cloud 统计 EBS-index 占节点内存 ~57.1%(LBAIndex 17.2% + CompressIndex 39.9%),最坏 ~10% 集群因索引内存不足无法索引数据,导致 ~35% 物理存储被浪费。

作者先排除三条「常规救场」路径:

  1. 加内存:成本高、扩容慢,生产环境不可持续。
  2. 换更省内存的通用索引:在五种典型 EBS workload 上,现有 LBAIndex(MemTable page-table + SSTable 按写请求粒度索引)已比 B-TreeART、PGM-Index 更省内存、更快——因为其他索引按单 LBA 粒度索引。
  3. 放大 compression unit(CU):EBS 用 4-block CU 配合流式压缩(LZ4)控制读放大;随机访问压缩方案(如 FSST)字典构建 ~1ms、压缩慢 9.78×,且变长块仍需 offset 元数据,无法减少索引条目。

因此论文 claim 的突破口不在「更好的点索引」,而在 workload 结构:云块存储写请求天然以 range 为单位出现,应按 range 索引而非 per-block。

关键观察 / 隐含假设

  • 观察 1:时间上相邻的写请求在空间上高度连续(Consecutive Write, CW)。Alibaba Cloud 一周 trace(1.4k VD、四类 workload)中,观察窗口 36 次写时 long CW ratio 为 65.0–81.5%;Tencent EBS trace 同样显著。根因是 FS journaling(ext4 jbd2)、Redis/MySQL 日志等上层服务偏好顺序写,多应用交错打断形成多个 CW 段。

    • 依赖假设:生产写路径保留 SegmentCache(128 block)等缓冲,使时间上邻近的写可被观测/合并;索引更新粒度可提升到 CW/range 而不破坏读语义。
    • 可能失效场景:高度随机小块写(论文 worst-case avg length ≤2 时 RASK 比 Origin 慢 6.64%);无写合并缓冲的极简块设备路径;range 极短导致 range-as-key 收益趋近于点索引。
  • 观察 2:读 CW 写入的数据时,>85.4% 读请求从 CW 起点开始,<1% 从起点 10 block 以外发起;95.7% 读落在 CW 起点 4 block(当前 CU 大小)以内。因此把 CU 对齐到 CW 不会显著放大解压读放大。

    • 依赖假设:读模式由写模式决定(日志/顺序读为主);CU 仍用流式 LZ4,仅对 >4 block 的 CW 整段压缩。
    • 可能失效场景:随机读密集 workload(数据库页级随机读)可能偏离 CW 起点;CU 放大后剩余 2.60% 请求延迟略升——论文认为可接受,但未在极端随机读 trace 上量化。
  • 观察 3:range 写普遍存在于多家云存储——Google trace 中 51.6%、Meta trace 中 90.3% 写跨过 4 block。range-as-key(RKey)不是 Alibaba 特例,可泛化到 flash cache、DFS metadata service 等 range-write 密集场景。

    • 依赖假设:索引语义是「最新写覆盖旧写」(非时序数据库的 version 保留);value 可按 range 切分(用户注册 DivideValue/MergeRange)。
    • 证据强度——四份 vendor trace + blktrace 白盒(MySQL TPC-C、Redis YCSB long CW ratio 29–99%)+ RocksDB/Meta Tectonic 集成实验互证。
  • 假设 1:range overlap 与 range fragmentation 是 RKey 的两类核心难题,现有点索引(eager/lazy B-tree)和 range-aware 索引(interval tree、segment tree、HINT)都不能同时做到低内存 + 低延迟 + 自动剔除 covered range。

    • 证据强度——10M uniform range microbenchmark 和四份生产 trace replay 上,eager/lazy 变体与 interval/segment tree 均显著落后;ablation 逐步叠加验证各机制贡献。
  • 假设 2:跨 leaf 读可能出现 snapshot 不一致(先看到后半 range、后看到前半),但 EBS/DFS metadata/flash cache 等应用可容忍,与 Masstree/ART 读 range 时的已知问题等价;实测不一致读仅占 ~0.0394%

    • 证据强度——频率极低,但论文未在强一致性 metadata 场景做端到端正确性证明;持久化、崩溃恢复由应用负责(RASK 纯 in-memory)。

核心方法

RASK(Range-AS-a-Key)是面向 range-write 密集 workload 的 in-memory 有序索引:ART 内部节点 + B-tree 风格 log-structured leaf,叶子条目 key 为 LBA range、value 为用户定义(EBS 场景为 DataFile 位置 + 压缩元数据)。

结构与基本流程

  • 内部节点ART trie,路径压缩 + 节点自适应,比 B-tree 更省内存。
  • 叶子:全局按 anchor key(该 leaf 最小 left bound)有序;leaf 内 append-only 追加新 range,doubly-linked 支持跨 leaf range 操作。
  • :定位 anchor ≤ target left bound 的 leaf,沿链表扫到 anchor ≤ target right bound,每 leaf 内用 ablation-based search 取最新值。
  • :定位 leaf → append;leaf 满则 GC → 仍满则 split → 跨 leaf 的 fragmented range 迭代插入后续 leaf。

Challenge-1:Range Overlap(回应观察 1 的写合并前提)

新 range 可能 cover/部分重叠旧 range。RASK 三件套:

  1. Log-structured leaf:写只 append,推迟剔除 fully covered 旧 range 到 leaf 满时 GC;leaf 作为 GC 单元限制 overlap 堆积上界。GC 相对写操作频率 5.08%
  2. Two-stage GC:Stage-1 lightweight GC 只检查「同 left bound 的较新 range 是否 cover 旧 range」(EBS trace 上覆盖 73.8% 可回收条目、有效率 59.1%),O(1) LT Map 快速腾位;Stage-2 normal GC 用 NonOverlap List 彻底清理多 range 联合 cover 的复杂情况。平均吞吐比仅 normal GC 再升 24.1%
  3. Ablation-based search:leaf 内反向扫描,用有序 Unfound List 跟踪尚未找到的子 range,每遇到 leaf range 就「消融」已覆盖部分,避免把 outdated overlap 值加入结果;写重 trace 上仍带来 12.6% 吞吐提升。

Challenge-2:Range Fragmentation(回应观察 3 的泛化部署)

user range 跨多个 leaf 的 range space 时被迫切分,增加读写与内存开销:

  1. Range-conscious split:split point 候选来自 GC 时 NonOverlap List 的 left bound(保证不切断现有 range),再选两侧 entry 最均衡者;84.3% split 不切断任何 range,<0.01% 需二次 split。
  2. Workload-aware merge & resplit:leaf header 计数 fragmented insertions(),超阈值则与左邻 leaf 合并再按新访问模式 resplit;频率仅 0.87% 写,内存再降 7.70%,吞吐开销 1.90%

EBS 写路径配套优化(§3,非 RASK 本体但支撑 workload 假设)

  • I/O compaction:SegmentCache flush 时重排/合并 CW,LBAIndex 写计数降 58.4–77.0%
  • CU alignment:>4 block 的 CW 整段压缩,CU 索引计数降 69.1–91.1%;与 RKey 结合理论可省 58.4–91.1% 索引条目。

用户需注册 DivideValue(split 时切 value)和 MergeRange(merge 时判断 range+value 是否可合并)。

并发:per-node 乐观锁 + version number;跨 leaf insert 用 lock handover;split/merge 用 // 触发读重试。24 线程下吞吐达 baselines 的 3.08–21.5×

设计取舍

  • 取舍 1:Lazy overlap 处理 vs 写延迟。选择 append + 批量 GC,避免 eager 删除 overlap 的高写成本;代价是 leaf 满前保留 dead range,读需反向扫描 + ablation。GC/SMO 阻塞写占比极低(split/merge 阻塞并发写 <0.01%)。
  • 取舍 2:固定 leaf capacity(默认 16)vs 参数敏感。capacity 8→128:峰值吞吐在 16;过小 GC 频繁,过大 overlap 处理成本升且空闲 slot 浪费内存(128 时内存反升 9.09%)。
  • 取舍 3:跨 leaf 弱一致读 vs 全局 snapshot。与现有点索引读 range 行为对齐,换极致性能;强一致跨 leaf 读需 future work「先 snapshot 所有涉及 leaf」。
  • 取舍 4:In-memory only vs 崩溃恢复。RASK 不负责持久化,EBS 等应用自行 WAL/checkpoint;降低索引复杂度,但集成方需处理重建成本——论文未讨论重启后索引恢复时间。
  • 边界条件:avg range length ≥100 时比 Origin 快 16.10×、比 9 个 ordered index 快 17.2–312.97×;短 range(<10)仍有 1.84–12.71× 优势;极稀疏写(≤2)略逊于 Origin。读/写比 5%–90% 均占优。

实验与结果

  • 平台:单线程 replay 为主(EBS 块服务内部逻辑单线程);并发实验 24 核 Xeon Platinum 8369B、96GB DRAM;RocksDB/flash cache case 用 12 核 + 188GB + NVMe。
  • Trace:Alibaba Cloud 1.8k VD / 1.5TB(Full + Sampled);Tencent 588GB/10 天;Meta Tectonic 150GB/3 年;Google flash cache 92GB/3 月。写路径先经 I/O compaction。
  • Baselines:10 个 SOTA ordered index——Lazy B-tree、Lazy ART、Wormhole、Eager HydraList、PGM-Index、Cuckoo Trie、HOT、segment tree、interval tree,以及 Alibaba Origin(LBAIndex + CompressIndex)。点索引均实现 eager/lazy RKey 变体。
  • Overall(Full Dataset):内存为 baselines 的 1.15–54.7%(Origin 的 ~19.9%);吞吐 2.76–37.8× baselines、1.15–1.82× Origin;P99 降 23.9–97.6%、P99.999 降 34.2–99.7%(vs Origin P99.99/P99.999 降 90.9%/98.8%)。
  • Ablation(Sampled):log-structured leaf + RKey 相对原始 ART 吞吐 1.50×、内存 −90.3%;叠加 normal GC +70.6%、two-stage GC +24.1%、ablation search +12.6%、range-conscious split +7.56% 吞吐且 −26.0% 内存。
  • 泛化:Tencent EBS 2.35–49.21× 吞吐;Meta RocksDB 换 RASK MemTable 7.46×;Google flash cache 1.52–37.52× 吞吐、内存 −3.2–99.9%
  • 敏感性:merge 阈值从 1/8→1 leaf size 内存再省 ~24%、吞吐仅降 ~1.67%;range 越长优势越大;24 线程平均延迟比 baselines 低 85.9–98.3%

Critical Analysis

论证链条

测量(EBS-index 占半数内存 + 换通用索引无效 + trace 显示 CW/range 写普遍)→ 洞察(range-as-key 可减条目数并减少多次 index update)→ 识别两类结构难题(overlap、fragmentation)→ 针对性设计(log-structured leaf、two-stage GC、ablation search、range-conscious split、merge/resplit)→ 四份生产 trace + 10 baseline + RocksDB 集成验证。

链条在 range-write 密集、覆盖语义、in-memory 索引 设定下闭合较好:ablation 逐步叠加、microbenchmark(10M uniform ranges)与 Full Dataset 结论方向一致,且 Tencent/Google/Meta 跨厂商复现支持「观察 3」的外推。

薄弱跳步:(1) Origin baseline 已含 LBAIndex 的 write-request 粒度 SSTable,RASK 的 1.15–1.82× 吞吐增益相对 Origin 小于相对通用索引的倍数——论文将 I/O compaction/CU alignment 作为 EBS 配套优化,但 Full Dataset 实验是否一律启用、与「纯 RASK 替换 LBAIndex」的分解不够清晰;(2) 从 trace replay(省略时间间隔)到生产尾延迟/隔离性的映射缺少在线 A/B;(3) 跨 leaf 弱一致读用 0.0394% 频率论证「可忽略」,对 metadata 强一致场景是否足够,取决于应用语义而非索引层自证。

假设压力测试

  • Workload 漂移:AI 训练 checkpoint、小块随机 overwrite、VM 镜像稀疏写等可能拉低 CW ratio;论文在 avg length ≤2 时已略输 Origin 6.64%,说明 RKey 收益与 range 长度强相关——「range 写普遍」在部分 tenant 上可能只是统计主导而非硬约束。
  • 删除与 tombstone:Delete 实现为 tombstone + GC 物理删除;高频覆盖写场景下 tombstone 与 overlap 交互复杂,论文对 delete-heavy workload 着墨少于写密集 trace。
  • 持久化与故障:RASK 明确 in-memory,重启需 replay 或外部 log 重建;EBS 生产节点故障、部分索引丢失时的 RTO/RPO 与 Origin LSM-like LBAIndex 对比——论文未讨论
  • 多租户隔离:单 VD trace replay 为主;多 VD 共享节点时的内存分摊、热点 VD 导致 leaf 频繁 GC/SMO 对邻居的影响——论文未讨论
  • Value 语义DivideValue/MergeRange 由用户实现;错误回调会导致 silent data mis-map,索引层不验证物理布局连续性——部署风险在应用侧。

实验可信度

  • Benchmark 代表性:Alibaba/Tencent/Meta/Google 四份 trace 覆盖 DB、MQ、搜索、容器、BigData 等,强于纯 synthetic;但 replay 去掉时间间隔、默认单线程,更偏「索引算法极限」而非「生产 BlockServer 端到端」。
  • Baseline 公平性:对 7 个点索引实现 eager/lazy RKey 变体,并选各 index 家族最优 lazy/eager 版本(Table 2),诚意较高;interval/segment tree 代表「不删 covered range」的 range-aware 路线,衬托 RASK 差异化设计。
  • Ablation 完整性:§7.5 对六项技术逐步叠加,量化 GC 频率、lightweight GC 有效率、split 质量——设计分解充分。缺少「去掉 log-structured 改 in-place update」或「仅 RKey 无 GC」的极端对照。
  • Metric 覆盖:吞吐、内存、P99–P99.999、24 线程扩展性较全;索引重建时间、GC 暂停分布、内存碎片、正确性测试几乎未报;Google flash cache case 中 segment tree 尾延迟偶优于 RASK(轻载下不 GC 的投机优势),说明 tail 优势非普适。

系统性缺陷

  • 运维与可观测性:开源代码与 Tianchi trace 加分,但论文未描述生产灰度指标(索引内存/accounting、GC 触发率告警、跨 leaf 不一致检测)。
  • 尾延迟与 SLO:相对 Origin 大幅改善 P99.999,主要归因于避免 LBAIndex MemTable→SSTable 转换 stall;但 merge/resplit 与 two-stage GC 仍可能在 leaf 满时造成写停顿,只是频率低——缺少与 EBS SLO 阈值的定量对齐。
  • 兼容性:需改 EBS 写路径(I/O compaction、CU alignment)才能吃满论文 §3 理论收益;仅替换索引而不改 SegmentCache 流程时,收益上界需重新测量——论文将两者作为整体故事,工程落地需拆分里程碑。
  • 对比范围:未与设备侧 FTL range mapping、ZNS zone-level mapping、或 EBS 架构级去索引方案(如更大 append-only segment)做同等深度对比——related work 定性讨论为主。

局限与 Future Work

  • 局限 1:RASK 当前纯 in-memory,持久化与崩溃恢复由上层负责;不适合直接当作 durable metadata store 而不加 WAL/snapshot。
  • 局限 2:跨 leaf 读仅保证 per-leaf snapshot 一致,强一致 range 读需额外锁全 leaf——论文列为 future work。
  • 局限 3:极短 range、高频随机写场景下相对 Origin 无优势甚至略差;RKey 假设 range 平均长度 >2 才典型受益。
  • Future work 1:在 Alibaba Cloud EBS 全栈上线,测量真实节点内存释放比例与运维成本,验证「避免浪费 35% 存储」的最坏集群案例是否可复现。
  • Future work 2:对 delete-heavy、强一致 metadata、多租户混部做 targeted trace 与 chaos 测试,量化 tombstone/GC 与跨 leaf 不一致的尾延迟与正确性边界。
  • Future work 3:探索 RASK 作为 LSM-Tree MemTable 之外的通用 in-memory tier(论文已示 RocksDB/Tectonic),系统测量与 skiplist/ART/Masstree 在可变 value 语义下的集成成本。

相关