知识卡片
HitSet三种实现在内存与查找效率间的取舍
内容
统计”哪些对象最近被访问过”这件事,Ceph 提供三种粒度递减的实现:ExplicitObjectHitSet 直接用完整对象标识(约 100 字节)做集合,最直观但内存开销最大;ExplicitHashHitSet 只存对象 32 位哈希值(4 字节),内存省很多,但只能判断”这个哈希值出现过”,反查具体是哪个对象时必须遍历全部候选对象重新计算哈希比对;BloomHitSet 用压缩的布隆过滤器,内存占用进一步压缩,代价是存在假阳性(可能误判某对象”在”而实际不在)。这和 [[四种Bucket选择算法的复杂度权衡|CRUSH 的多种 Bucket 选择算法]]是同一种工程直觉的重复出现:同一个问题(判断集合归属/选择)在不同的精度、内存、查找速度要求下,从来不存在一个通吃所有场景的最优实现,只能提供多个刻度供不同场景取舍。
参考来源
《Ceph源码分析》第13章《Ceph自动分层存储》