Bluesky 如何用 One Hash Bloom Filters 提速

在 Bluesky 后端,Bloom Filter 帮助我们每秒跳过数百万次数据库查询,显著降低了磁盘 IO。传统实现需要多次哈希计算,而 Double Hashing 虽已优化,但在高并发场景下仍面临 mutex 锁竞争问题,导致部署耗时长达 90 分钟。我们尝试了 atomic 指令优化后,部署时间缩短至 15 分钟。进一步探索中,我发现了基于单哈希的 One Hash Bloom Filters 技术,通过数学技巧将位数组分割为互质分区,仅用一次 xxh3 哈希即可生成多个检查位。配合 CPU 缓存行对齐和分片原子操作,这种新方案在保持低误报率的同时,将最坏情况下的缓存缺失限制为一次,为高性能系统提供了更极致的工程实践。
Bloom filters 和 roaring bitmaps 让这个世界运转起来。
HN 评论区
10- aappleby
其实你没必要这么做——你可以继续使用大小为 2 的幂的表,只需对哈希值进行轻微的混合,就能得到每个额外的位索引。
(来源:我编写了 MurmurHash/SMHasher,并且在我自己的布隆过滤器和布谷鸟哈希表中都使用了上述方法)
- FreakLegion
注意:你在这里牺牲了不可忽视的空间效率,而且随着误报率降低,情况会变得更糟。分区意味着各分区的占用率不均匀,要么你接受低占用率(导致整体过滤器尺寸增加),要么你几乎肯定会遇到热点块(导致特定分区的误报率升高)。
- cperciva
虽然比访问磁盘便宜得多,但对于高性能系统来说,为每个键计算 k 个独立哈希仍然有点昂贵。
这取决于布隆过滤器的大小。大多数哈希值很大,且它们的位是独立的。