Update competition submission PR list
本作品采用官方支持的 文件 + 链接 模式提交。
本仓库只作为比赛提交材料入口,不作为统一源码 baseline。实际源码改动分别位于公开 GitHub PR 和对应 feature branch 中。每个 PR 都基于提交时的 kvcache-ai/Mooncake:main 开发和测试,因此每项实验使用该 PR 对应的 upstream base commit 作为 baseline。
kvcache-ai/Mooncake:main
最终提交内容包括:
选择赛题二:Mooncake Store 性能、高可用与 SGLang HiCache 优化。
本作品围绕 Mooncake Store 的 benchmark、metadata 热路径、prefix query、storage backend 鲁棒性和 HiCache promotion 路径展开。
本作品包含 6 个队伍直接提交的 Mooncake PR。
本作品采用 PR-scoped baseline,不强行使用一个统一 baseline SHA。
原因是:每个 PR 都是面向 Mooncake 上游的独立贡献,均基于提交时的最新 kvcache-ai/Mooncake:main 开发和测试。强行使用一个后验统一 baseline,反而不能准确反映开源开发和 review 过程。
每项结果记录:
2bae8b37058def66f7a69584803affec0d94e05b
16e237007d679e845a3d4504dc08b6967d6294b3
ca7e5fbf95e66bb1825d1b319ee28bfc03d73ec5
ce835c9d48afaf929a643124b5ee4f0e1c6de84f
079353e4b78369088bc82c60becabd045bef72c6
954d0fa6ddab24453787edb6c0bcc820a63cc800
47b267a5a1130f34f73b69fb0e3f0f599461851c
96394111dac67f1fc10945f965f3fdd88c32fa8e
652949eb0d194546a0c7046dd8ef0aea63780429
25a9606d1929302a5be30b0a4d6925187feac01d
866ed32f6f8c351b900b805f9c15b00bdf0f5d07
67cff1f808f8c2439159fa879c02df306b1d132f
PR #2340 为 allocation_strategy_bench 增加 --workload=size_class_churn 模式。该 workload 模拟多 size class 的 KVCache-like 对象分配压力,支持预填充、失败后淘汰重试,并输出吞吐、延迟分位数、full / partial / failed allocation、eviction 次数、prefill summary、fragmentation ratio、largest free region 和每个 size class 的延迟拆分。
allocation_strategy_bench
--workload=size_class_churn
该 PR 不改变 Store 运行时行为,只提供可复现的 benchmark 工具。
PR #2221 的目标是减少 batch 操作中重复的 per-key metadata 查询和锁开销。核心思路是按 metadata shard 对 batch keys 分组,在可能的情况下每个 shard 只获取一次锁,并将 wrapped batch RPC 调用直接路由到 batch-aware fast path。
该改动保持请求顺序和 error-code 语义不变,公共 API 向后兼容。
PR #2260 保留原有 regex API,但对以下简单 pattern 避免完整 std::regex_search:
std::regex_search
^tenant_042/session_
^foo$
复杂 regex pattern 仍继续使用原有 regex 实现。
PR #2355 在 io_uring + O_DIRECT bucket read 出现硬失败时,切换到 buffered read path 重试,避免反复在同一 direct I/O 路径上失败。同时移除了共享可变 aligned scratch buffer,改为更适合并发 BatchLoad() / WriteBucket() 的 per-operation scratch buffer。
io_uring + O_DIRECT
BatchLoad()
WriteBucket()
PR #2529 将 promotion 执行逻辑从 FileStorage heartbeat path 中移出。heartbeat path 只负责从 master 拉取 promotion task 并入队,后台 worker 负责 allocation、batch load、writeback 和 success/failure notification。
这样可以避免长时间 promotion backlog 阻塞 heartbeat 进度。
PR #2445 增加 SizeClassAwareAllocationStrategy,根据请求大小选择 segment,目标是在混合 size-class KVCache workload 下降低碎片率并减少 partial allocation。
SizeClassAwareAllocationStrategy
现有 Random 和 FreeRatioFirst 策略不会区分对象大小。小对象和大 KV block 混合竞争 segment 时,小对象可能消耗大对象后续需要的连续空洞,从而增加碎片率和不必要的 partial allocation。
Random
FreeRatioFirst
新策略按对象大小分类:
该实现不修改 OffsetAllocator 内部,不改变公共 API,并保留 best-effort allocation 语义。
OffsetAllocator
allocation_strategy_bench --workload=size_class_churn
BatchGet
batch_size=4
BatchPut
bucket + use_uring=true
size_class_churn
SizeClassAware
运行命令:
cmake --build build --target allocation_strategy_bench -j$(nproc) ./build/mooncake-store/benchmarks/allocation_strategy_bench \ --workload=size_class_churn \ --segment_capacity=1024 \ --num_allocations=2000 \ --prefill_pct=70
验证结果:
reached=yes
--segment_capacity=64
定向测试:
master_metrics_test
batch_remove_test
client_integration_test
first-round server benchmark 汇总:
额外 Python 端到端测量:
Workload:
结果:
该结果对应 16.74x 加速和 94.02% 延迟下降。该优化只针对 prefix-oriented query pattern,不代表任意 regex 的 Store 全局性能收益。
./mooncake-store/benchmarks/storage_backend_bench \ --backend=bucket \ --test=load \ --value_size=131072 \ --batch_size=32 \ --num_operations=200 \ --warmup_operations=20 \ --verify=false \ --cache_mode=drop_cache_external
use_uring=true 主要结果:
use_uring=true
main
补充说明:更严格的 cold-cache use_uring=false retest 显示相对 main 存在吞吐回退,因此该路径被记录为后续优化项,不作为本 PR 的主收益声明。
use_uring=false
功能验证:
promotion_on_hit_test
性能结果:
selected_keys=14
promoted_before_timeout=0
selected_keys=14-15
time_to_all_promoted=200.92-201.21 ms
post_promotion_read_latency_ms p50=0.18-0.22
p95=0.18-0.30
两次测试使用相同 master runtime 和 workload 参数,只替换 store.so / engine.so。
store.so
engine.so
评测方法使用 PR #2340 引入的 size_class_churn workload,在 allocation-strategy 层测量 fragmentation ratio、largest free region 和 full / partial / failed allocation。
本地运行配置:
segment_capacity=64MB
num_allocations=2000
prefill_pct=70
size_class_pattern=all
size_class_evict_ratio=0.02
100 segments 代表性结果:
在这些代表性混合 size-class 场景中,SizeClassAware 相比已有较强 baseline 将平均碎片率降低约 28%-51%,同时减少 partial allocation。
cd /root/hpf/workspace/mooncake_ccf source .agent/env.sh cd Mooncake-Nameless
cmake --build build --target master_metrics_test batch_remove_test client_integration_test -j$(nproc) ./build/mooncake-store/tests/master_metrics_test ./build/mooncake-store/tests/batch_remove_test ./build/mooncake-store/tests/client_integration_test
cmake --build build --target master_service_test prefix_query_bench -j$(nproc) ./build/mooncake-store/tests/master_service_test \ --gtest_filter=MasterServiceTest.GetReplicaListByRegex:MasterServiceTest.GetReplicaListByRegexComplex ./build/mooncake-store/benchmarks/prefix_query_bench \ --num_keys=50000 \ --num_prefix_groups=100 \ --query_iterations=100 \ --value_size=1024 \ --target_prefix_id=42
cmake --build build --target storage_backend_bench storage_backend_test -j$(nproc) ./build/mooncake-store/benchmarks/storage_backend_bench \ --backend=bucket \ --test=load \ --value_size=131072 \ --batch_size=32 \ --num_operations=200 \ --warmup_operations=20 \ --verify=false \ --cache_mode=drop_cache_external
cmake --build build --target promotion_on_hit_test -j$(nproc) ./build/mooncake-store/tests/promotion_on_hit_test --gtest_color=no
完整性能 benchmark 还需要运行 metadata server 和 master endpoint。
cmake --build build --target allocation_strategy_bench -j$(nproc) ./build/mooncake-store/benchmarks/allocation_strategy_bench \ --workload=size_class_churn \ --segment_capacity=64 \ --num_allocations=2000 \ --prefill_pct=70 \ --size_class_pattern=all \ --size_class_evict_ratio=0.02
feat/part-2-batch-fast-path-pr
feat/part-3-prefix-query-fastpath
feat/part-4-offsetallocator-size-class
feat/part-5-bucket-readback-fastpath
feat/part-6-size-class-aware-strategy
feat/part-7-hicache-group-read-path
competition-submission
Mooncake Store 性能、高可用与 HiCache 优化比赛提交仓库,包含6个相关PR、baseline策略、设计方案、实验结果与复现命令。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
Mooncake Store 性能、高可用与 HiCache 优化比赛提交
1. 提交方式
本作品采用官方支持的 文件 + 链接 模式提交。
本仓库只作为比赛提交材料入口,不作为统一源码 baseline。实际源码改动分别位于公开 GitHub PR 和对应 feature branch 中。每个 PR 都基于提交时的
kvcache-ai/Mooncake:main开发和测试,因此每项实验使用该 PR 对应的 upstream base commit 作为 baseline。最终提交内容包括:
2. 赛题方向
选择赛题二:Mooncake Store 性能、高可用与 SGLang HiCache 优化。
本作品围绕 Mooncake Store 的 benchmark、metadata 热路径、prefix query、storage backend 鲁棒性和 HiCache promotion 路径展开。
3. 作品总览
本作品包含 6 个队伍直接提交的 Mooncake PR。
4. Baseline 策略
本作品采用 PR-scoped baseline,不强行使用一个统一 baseline SHA。
原因是:每个 PR 都是面向 Mooncake 上游的独立贡献,均基于提交时的最新
kvcache-ai/Mooncake:main开发和测试。强行使用一个后验统一 baseline,反而不能准确反映开源开发和 review 过程。每项结果记录:
2bae8b37058def66f7a69584803affec0d94e05b16e237007d679e845a3d4504dc08b6967d6294b3ca7e5fbf95e66bb1825d1b319ee28bfc03d73ec5ce835c9d48afaf929a643124b5ee4f0e1c6de84f079353e4b78369088bc82c60becabd045bef72c6954d0fa6ddab24453787edb6c0bcc820a63cc80047b267a5a1130f34f73b69fb0e3f0f599461851c96394111dac67f1fc10945f965f3fdd88c32fa8e652949eb0d194546a0c7046dd8ef0aea6378042925a9606d1929302a5be30b0a4d6925187feac01d866ed32f6f8c351b900b805f9c15b00bdf0f5d0767cff1f808f8c2439159fa879c02df306b1d132f5. 设计方案
5.1 Benchmark 与碎片率观测
PR #2340 为
allocation_strategy_bench增加--workload=size_class_churn模式。该 workload 模拟多 size class 的 KVCache-like 对象分配压力,支持预填充、失败后淘汰重试,并输出吞吐、延迟分位数、full / partial / failed allocation、eviction 次数、prefill summary、fragmentation ratio、largest free region 和每个 size class 的延迟拆分。该 PR 不改变 Store 运行时行为,只提供可复现的 benchmark 工具。
5.2 Batch Metadata 热路径
PR #2221 的目标是减少 batch 操作中重复的 per-key metadata 查询和锁开销。核心思路是按 metadata shard 对 batch keys 分组,在可能的情况下每个 shard 只获取一次锁,并将 wrapped batch RPC 调用直接路由到 batch-aware fast path。
该改动保持请求顺序和 error-code 语义不变,公共 API 向后兼容。
5.3 Prefix Query Fast Path
PR #2260 保留原有 regex API,但对以下简单 pattern 避免完整
std::regex_search:^tenant_042/session_^foo$复杂 regex pattern 仍继续使用原有 regex 实现。
5.4 Bucket Readback Fallback
PR #2355 在
io_uring + O_DIRECTbucket read 出现硬失败时,切换到 buffered read path 重试,避免反复在同一 direct I/O 路径上失败。同时移除了共享可变 aligned scratch buffer,改为更适合并发BatchLoad()/WriteBucket()的 per-operation scratch buffer。5.5 Promotion-on-Hit Backlog Drain
PR #2529 将 promotion 执行逻辑从 FileStorage heartbeat path 中移出。heartbeat path 只负责从 master 拉取 promotion task 并入队,后台 worker 负责 allocation、batch load、writeback 和 success/failure notification。
这样可以避免长时间 promotion backlog 阻塞 heartbeat 进度。
5.6 SizeClassAwareAllocationStrategy
PR #2445 增加
SizeClassAwareAllocationStrategy,根据请求大小选择 segment,目标是在混合 size-class KVCache workload 下降低碎片率并减少 partial allocation。现有
Random和FreeRatioFirst策略不会区分对象大小。小对象和大 KV block 混合竞争 segment 时,小对象可能消耗大对象后续需要的连续空洞,从而增加碎片率和不必要的 partial allocation。新策略按对象大小分类:
该实现不修改
OffsetAllocator内部,不改变公共 API,并保留 best-effort allocation 语义。6. 实验结果
6.1 结果汇总
allocation_strategy_bench --workload=size_class_churnBatchGet,batch_size=4BatchPut,batch_size=4bucket + use_uring=true,重复 10 次size_class_churn,100 segments,混合 size-class patternSizeClassAware平均碎片率降低约 28%-51%6.2 PR #2340:Size-class Fragmentation Benchmark
运行命令:
验证结果:
reached=yes--segment_capacity=64的小场景也能提前达到目标并退出6.3 PR #2221:Batch Metadata Hot Paths
定向测试:
master_metrics_test: PASSbatch_remove_test: PASSclient_integration_test: PASSfirst-round server benchmark 汇总:
BatchPut,batch_size=4BatchGet,batch_size=4额外 Python 端到端测量:
6.4 PR #2260:Prefix Query Regex Fast Paths
Workload:
^tenant_042/session_结果:
该结果对应 16.74x 加速和 94.02% 延迟下降。该优化只针对 prefix-oriented query pattern,不代表任意 regex 的 Store 全局性能收益。
6.5 PR #2355:Bucket Readback Fallback Hardening
Workload:
use_uring=true主要结果:main补充说明:更严格的 cold-cache
use_uring=falseretest 显示相对main存在吞吐回退,因此该路径被记录为后续优化项,不作为本 PR 的主收益声明。6.6 PR #2529:Promotion-on-Hit Backlog Drain
功能验证:
promotion_on_hit_test: baseline 和 current tree 均 37/37 passed。性能结果:
selected_keys=14,promoted_before_timeout=0,40s timeoutselected_keys=14-15,time_to_all_promoted=200.92-201.21 ms,post_promotion_read_latency_ms p50=0.18-0.22,p95=0.18-0.30两次测试使用相同 master runtime 和 workload 参数,只替换
store.so/engine.so。6.7 PR #2445:SizeClassAwareAllocationStrategy
评测方法使用 PR #2340 引入的
size_class_churnworkload,在 allocation-strategy 层测量 fragmentation ratio、largest free region 和 full / partial / failed allocation。本地运行配置:
segment_capacity=64MBnum_allocations=2000prefill_pct=70size_class_pattern=allsize_class_evict_ratio=0.02100 segments 代表性结果:
在这些代表性混合 size-class 场景中,
SizeClassAware相比已有较强 baseline 将平均碎片率降低约 28%-51%,同时减少 partial allocation。7. Demo 与复现命令
7.1 通用环境入口
7.2 PR #2340 Benchmark Demo
7.3 PR #2221 Batch Hot Path Demo
7.4 PR #2260 Prefix Query Demo
7.5 PR #2355 Bucket Readback Demo
7.6 PR #2529 Promotion-on-Hit Demo
完整性能 benchmark 还需要运行 metadata server 和 master endpoint。
7.7 PR #2445 SizeClassAware Strategy Demo
8. 源码与链接
feat/part-2-batch-fast-path-prfeat/part-3-prefix-query-fastpathfeat/part-4-offsetallocator-size-classfeat/part-5-bucket-readback-fastpathfeat/part-6-size-class-aware-strategyfeat/part-7-hicache-group-read-pathcompetition-submission9. 限制与后续工作