Cuckoo Filters and Bloom Filters: Comparison and Application to Packet Classification论文总结


Application to Packet Classification论文总结)


Abstract

本文首先比较了侧重于数据包分类应用的 Bloom 和 cuckoo 过滤器。
该分析确定了杜鹃过滤器在误报率方面的缺点,当它们不接近满员时。
基于这一观察,本文还建议使用可配置的存储桶来提高布谷鸟过滤器的误报率随占用率的缩放。

Index Terms—Cuckoo filters, Bloom filters, Packet classification, SDN.


I. INTRODUCTION

可以先使用一个小过滤器来检查该元素是否存储在该内存中,而不是执行昂贵的外部存储器访问来搜索元素。

重要的是近似检查没有误报,因为这意味着不会找到存储在外部存储器中的元素。

相反,误报只会导致对外部存储器的不必要访问。

因此,用于实现检查的结构(通常称为过滤器)旨在避免误报并实现低误报概率。

在布谷鸟过滤器中,可以插入的元素数量是有限的,当占用率很高时,插入可能会失败,与插入不会失败的布隆过滤器相反,它们只会降低误报率.

第一个是对 Bloom 和 Cuckoo 过滤器进行详细比较。

第二个是让设计人员意识到,当布谷过滤器在其最大占用率以下运行时,在许多情况下,布谷过滤器的误报率会比布卢姆过滤器更差。

第三个贡献是提出了Configurable Bucket Cuckoo Filter可配置桶布谷鸟过滤器(CBCF),该方案使布谷鸟过滤器能够更好地随占用率缩放其误报率,从而扩展布谷鸟过滤器优于布隆过滤器的占用范围。


II. BLOOM FILTERS AND CUCKOO FILTERS

A. Bloom Filters

在这里插入图片描述

检查未存储在过滤器中的元素的误报概率或比率可以近似为 (p1)k,其中 p1 是位设置为 1 的概率,它是插入的元素数量的函数。给定的过滤器大小 m 和插入的元素 n,该概率可以估计为:
在这里插入图片描述
误报率
在这里插入图片描述

最小化误报率的散列函数 k 的数量:log2怎么来的
在这里插入图片描述
散列函数的最佳数量随着存储的每个元素的内存位数 m/n 而增加。
从实际的角度来看,使用较大的 k 值有缺点,因为需要多达 k 次内存访问才能完成查找
增加 k 会增加滤波器的复杂性,使得大值在许多设置中不实用。此外,当 k 接近 kopt 时,降低误报率的好处会更小,因此可以使用较低的值,而对误报率的影响很小。

布隆过滤器的一个限制是元素不能被删除
可以扩展为计数布隆过滤器(CBF),每个位置都有一个计数器以支持删除,但这会显着增加内存需求。

Deletable Bloom filter可删除布隆过滤器 (DlBF)Ternary Bloom filter三元布隆过滤器 (TBF)。 在不使用每个位置的计数器的情况下向过滤器添加一些附加信息,并支持一些删除但不是全部。

DlBF 将过滤器划分为区域,并跟踪插入元素之间没有冲突的区域。删除元素时,可以安全地将没有冲突的区域中的位清除为零。相反,无法删除存在冲突的区域中的位。

TBF 对数组 0,1 和 x 上的每个位置使用三个值,其中 x 表示冲突。删除元素时,只有存储1的位置才能清零。从讨论中可以看出,DlBF 和 TBF 都仅部分支持删除。

Variable Increment Counting Bloom Filter可变增量计数布隆过滤器 (VI-CBF) 采用了一种不同的方法,该方法在过滤器中的每个位置使用一个计数器,但使用插入元素上的哈希函数计算可变增量。通过仔细选择这些增量,如果搜索元素的增量与存储在过滤器中的值不匹配,则可以减少在某个位置上仅插入一个元素时的误报。

B. Cuckoo Filters

对于每个元素 x,使用哈希函数 f(x) 计算指纹,并将其存储在过滤器中而不是 x 中。过滤器是由 m 个桶组成的数组,这些桶由 c 个单元组成,每个单元可以存储一个指纹。常使用 c = 4
x 的指纹可以存储在两个桶中,分别由 a1 = h1(x) 和 a2 = h1(x) xor h2(f(x))
在这里插入图片描述

为了检查元素 y 是否存储在过滤器中,我们计算 f(y), a1,a2 of y 并检查 f(y) 是否存储在这些桶中。
如果另一个元素 x 存储在这些桶中的任何一个中并且 f(x) = f(y),
突然有一个问题,这个指纹是怎么算出来的?不过影响不大

对于使用 f 位指纹的过滤器,误报率可以近似为
在这里插入图片描述
o 是过滤器占用率,定义为 n/(m·c) ,其中 n 是存储在过滤器中的 n 个元素的数量没看懂怎么得出来的

当 o 接近 1 时,比较了 Bloom 和 Cuckoo 过滤器的误报率,这表明当 f 大于 8 时,Cuckoo 过滤器提供了较低的误报率

要插入元素 x,访问存储桶 a1、a2,如果有空单元格,则将指纹存储在那里。如果没有空单元格,则从过滤器中删除存储在这些桶中的元素 z 之一,并将 x 的指纹存储在该单元格中。然后,将 z 插入其备用存储桶,可能需要多次迭代

存储的指纹条目和元素之间存在一对一的关系,并且相同的指纹可能会在同一个槽中出现多次。

如果过滤器在接近满员的情况下运行,则在系统运行期间将没有进一步插入的空间。

在许多应用程序中,存储在过滤器中的条目数量是动态的,并且事先不知道。在其他应用中,即使存储在过滤器中的条目数量是静态的,它们的数量也可能因设备而异,因此必须针对最坏情况调整过滤器的大小。在这两种情况下,过滤器在大多数情况下都会在其最大占用率以下运行以支持额外的插入,或者因为设备的配置不是最坏的情况。在这两种情况下,cuckoo 过滤器的误报率可能大于 Bloom 过滤器的误报率,

C. Comparison

在这里插入图片描述

对于正向查找,布谷鸟过滤器将优于布隆过滤器,因为 k 至少为 2。与否定相反,Bloom 过滤器具有优势,因为一旦读取的位置值为 0,查找就会结束。
因此,Bloom 过滤器的平均访问次数将取决于其占用率。相反,对于布谷鸟过滤器,否定查找总是需要两次访问。
不是很懂怎么进行逆向查找

当每个元素的比特数(BPE)大于大约 8 时,布谷过滤器在最佳配置中的性能优于布隆过滤器,而布隆过滤器在比特较少时效果更好[5]。因此,当 BPE 较大时,cuckoo 过滤器提供更好的性能,

TBF 和 CBF 的 FPR 会明显变差,因为它们每个滤波器位置需要更多的片上存储器,因此当使用相同数量的片上存储器时,阵列会更小。

Bloom 过滤器在其所有变体中的误报率随占用率的缩放比 Cuckoo 过滤器更好。
与元素数量 n 的依赖关系对于 Bloom 过滤器是指数的,而对于 cuckoo 过滤器是线性的
在这里插入图片描述

最后一列显示需要在外部存储器上存储部分过滤器信息。

D. False positive rate versus occupancy

使用 f = 12、15、18 位的指纹模拟了具有 m = 8192 桶的四个单元的布谷鸟过滤器。

在大多数布谷鸟过滤器实现中,c 设置为 4 以实现两个冲突要求之间的平衡。至于指纹比特 f,当每个元素的比特数大于大约 8 时,plain cuckoo 过滤器在误报概率方面开始优于 Bloom 过滤器。
在这里插入图片描述
在这里插入图片描述

TBF 和 VI-CBF 的误报率比 Bloom 过滤器大得多。
这是因为 TBF 和 VI-CBF 都需要在芯片上存储额外的信息以支持移除。这减小了过滤器数组的大小并增加了误报的概率。

在计数 Bloom 过滤器的情况下,由于其计数器存储在片外,它存储与片上 Bloom 过滤器相同的信息,因此具有相同的误报率。

杜鹃过滤器的误报率随着占用率的降低而线性降低,而布隆过滤器的降低幅度更大。这意味着 f 越大,占有率越低,Bloom 过滤器在误报率方面优于杜鹃过滤器。


III. FILTERING FOR PACKET CLASSIFICATION

为了对数据包进行分类,它们的标头被解析以提取相关字段,然后将这些字段与一组规则进行比较,以决定对数据包应用的操作。
较小的过滤器存储在更快的内存中,以减少对存储在较慢内存中的完整表的访问次数

从每个传入数据包中提取一组数据包头字段以构建一个密钥,该密钥根据一组规则进行检查以确定必须应用于数据包的操作。

访问 DRAM 所需的时间比访问内部 SRAM 的时间要大几个数量级。DRAM 非常大,因此它可以存储非常大的表,而 SRAM 很小。因此,关键资源是片上SRAM,而片外存储器则丰富。

执行初始过滤很有趣,它可以指示访问完整表是否有意义。
使用了 Bloom 过滤器,因为它们可以有fp但不能有fn,因此如果有匹配规则,我们总是会找到它 [9]。 Bloom 过滤器可以消除超过 95% 的对外部存储器的访问

过滤可能有用的另一个例子是恶意 IP 地址的黑名单
根据列表检查每个数据包的源 IP,如果匹配,则丢弃该数据包。
在这里插入图片描述

数据包分类应用程序的一个重要特征是规则集中的插入或删除比查找少几个数量级。
因此,对于数据包分类,性能主要取决于查找速度,在大多数情况下插入和删除的影响可以忽略不计。


IV. MAKING CUCKOO FILTERS BETTER THAN BLOOM FILTERS AT PRACTICAL OCCUPANCY

鉴于 CF 相对于 BF 的优势,例如元素删除支持和在高占用率下较低的 FPR,我们尝试解决 BF 更好的 CF 方面

引入了一种新颖的Configurable Bucket Cuckoo Filter可配置桶布谷鸟过滤器(CBCF),当占用率低于最大值时,它可以降低布谷鸟过滤器的误报率。

A. Description of the CBCF

为了在中等占用率下实现更好的布谷鸟过滤器误报率,我们提出了一种可配置的存储桶,当存储在存储桶中的元素数量少于其容量
选择位 s 用于将存储桶配置为四个或三个。然后,当给定的桶存储的单元格少于四个时,我们可以使用具有三个较大单元格的第二个配置,以便指纹具有 f+f/3 位,从而将这个桶对误报率的贡献降低 2f/3倍。这个倍数关系没有看懂
在这里插入图片描述

在查找时,存储桶 a1,a2(注意 a2 总是使用最小的指纹计算)被访问,并且对于它们中的每一个,首先读取选择位 s 以确定指纹的长度。然后将搜索到的元素的指纹计算到所需的长度并进行比较。
在这里插入图片描述

类似的程序可用于移除,但一旦找到指纹就移除。但是,如果在删除一个元素时桶中有四个指纹,我们应该重新配置桶以存储剩余三个元素的更长指纹。

为了能够做到这一点,我们需要完整的元素,以便我们可以计算更长的指纹。因此,CBCF 只能用于将完整元素也存储在较大较慢内存中的应用程序。

一个实际的配置可以在更大的内存中拥有一个过滤器的副本,它存储完整的元素而不是指纹,以便指纹和元素之间存在一对一的对应关系。

当删除一个元素时,如果有多个匹配的指纹,则访问全元素表以定位要删除的元素,并避免删除另一个具有相同指纹的元素,否则会导致不一致的状态。一旦元素被定位,元素和它的指纹都会被删除,以保持 CBCF 中的指纹和主表中的元素之间的一一对应关系。
在这里插入图片描述

在这里插入图片描述

插入一个元素,需要访问存储桶 a1、a2,并将优先级分配给存储较少指纹的存储桶。然后,根据存储桶是否已满,将短指纹或长指纹存储在一个空单元格中。如果没有空单元格,则像原来的布谷鸟过滤器一样移动一个元素。应该在存储完整元素的表中执行相同的操作。
在这里插入图片描述

可以减少误报率将取决于未满的桶的比例,因此可以从使用更大的指纹中受益。这显然取决于过滤器的占用率,最好是 2f/3

为了最大限度地减少,已经实施了洗涤程序。
此过程顺序读取过滤器中的所有桶,对于已满的桶,随机删除一个元素并尝试将其插入到其他桶移动元素上,直到找到一个包含少于 c-1 个单元的桶(这样插入元素后仍未满)或已经进行了二十次动作。在第二种情况下,在 20 次移动之后,该过程将元素插入任何具有空单元格的桶中并停止。这种擦洗减少了已满的桶的数量,并使 CBCF 更有效。

可以通过使用例如两个选择位来扩展所提出的方案,以便当桶具有四个、三个、两个或一个元素时可以使用不同的指纹长度。然而,当大多数桶的元素少于三个时,这种扩展的最大好处就会出现,这意味着占用率会很低。这似乎不太感兴趣,因为即使过滤器必须为其最大占用率留出一些余量,在低占用率下运行也不是最佳选择。无论如何,这种扩展的研究留给未来的工作

B. Evaluation

建议的 CBCF 仅与 Bloom 过滤器进行比较,因为它是在不同的 Bloom 过滤器变体中实现最低误报率的过滤器。

使用 f = 12、15、18 位的指纹模拟了布谷鸟过滤器和具有 m = 8192 桶的四个单元的 CBCF,预计布谷鸟过滤器在误报率方面优于布卢姆过滤器

然后,同样大小的 Bloom 过滤器也被模拟,使用 95% 的占用率的最佳 k 值。特别是,当 f = 12、15、18 时,使用的 k 值为 9、11、13。构建了布谷鸟过滤器和 CBCF 并插入元素,直到达到所需的占用率。然后进行了一些元素替换(从过滤器中移除一个元素并插入一个新元素)以模拟该占用时的稳态操作。
在这里插入图片描述
在这里插入图片描述
cuckoo 过滤器的误报率随着占用率的降低而线性减少,而对于 Bloom 过滤器,减少的幅度更大。这意味着当考虑的指纹大小的占用率约为 90%、85%、80% 或更低时,Bloom 过滤器在误报率方面优于杜鹃过滤器。

对于 CBCF,Bloom 过滤器在占用率低于 60%、55%、55% 时的误报率优于 Cuckoo 过滤器
CBCF 能够扩展 Cuckoo 过滤器在误报率方面优于 Bloom 过滤器的占用范围。

仔细观察 CBCF 的误报率会发现,与 CF 相比,减少的最终入住率约为 70%。这意味着此时几乎没有满桶。有趣的是,这对应于 c = 3 的布谷鸟过滤器的占用率,约为 90% ,乘以 3/4 得到大约 70% 的观测值。这将是在没有满桶的情况下可以实现的最大占用率。因此,模拟结果似乎与理论分析一致。

在所考虑的场景中,大多数访问将是过滤器避免检查外部存储器的否定查找。因此,否定查找的速度将是影响过滤器速度的主要因素
在这里插入图片描述
在这里插入图片描述
可以看出,在 CF 和提议的 CBCF 的情况下,内存访问次数是恒定的,如表 I 预期的那样等于两次。这是因为返回负数,必须检查 x 元素映射到的两个桶。相反,对于布隆过滤器,访问次数取决于占用率。这再次是预期的,因为对于较低的占用率,找到零的概率会增加,并且当找到第一个零时,Bloom 过滤器会返回负值。 Bloom 过滤器的平均内存访问次数也是最大占用率的两次。

这些结果表明,当占用率低于最大值时,Bloom 过滤器在内存访问方面将优于 CF 和 CBCF。这与最近的研究一致,这些研究表明 Bloom 过滤器在软件实现方面比布谷鸟过滤器具有速度优势

评估插入和删除的性能。同样,内存访问次数用作比较的指标。
在布隆过滤器的情况下,插入的内存访问次数是恒定的并且等于 k(如前所述,对于 f 的每个值,它是不同的)。
CF 和 CBCF 的结果是相似的,因为插入过程是相同的

当我们接近过滤器容量时,内存访问的数量显着增加。这与布谷鸟过滤器的预期行为一致。对于插入,CF 和 CBCF 优于 Bloom 过滤器,除非它们的占用率高于 90%。
在这里插入图片描述
在这里插入图片描述

至于删除,使用计数布隆过滤器 (CBF) 进行比较。可以看出,CF 和 CBCF 再次具有相似的结果。在这种情况下,它们的性能优于 Counting Bloom 过滤器,因为它们只需要大约 2.5 次内存访问;小于 Bloom 过滤器中使用的 k 的最佳值。
CF 和 CBCF 的结果不依赖于指纹位数 f。相反,对于 Bloom 过滤器,因为 k 的最佳值随 f 变化,所以内存访问的次数也是如此。
在这里插入图片描述
在这里插入图片描述

C. Implementation overheads

与普通 CF 相比,提议的 CBCF 的一个潜在缺点可能是实现开销。

在大多数网络应用程序中,最频繁的操作是查找。
对于查找,对于 CBCF 和 CF,不在集合中的元素(这是最坏的情况)的内存访问次数都是两次。
对于集合中元素的查找,内存访问次数取决于指纹是存储在其第一个存储桶还是第二个存储桶中,但对于 CBCF 和 CF 也是相同的。
因此,CBCF 不会在内存访问方面引入任何开销。

但是,CBCF中的查找可能需要计算被搜索元素的更大的指纹(当选择位s = 1时)。

这样做的开销应该可以忽略不计,因为现代处理器有专门的指令来计算字长的散列,因此提供的指纹位比 CF 和 CBCF 所需的更多。

因此,额外的复杂性来自于读取选择位,然后基于它对三个或四个元素进行比较。 CBCF 确实需要很小的内存开销,因为每个桶需要一个额外的位来存储选择位。

最后,用于最小化已满桶数的清理过程也是开销。然而,由于大多数网络应用程序的插入和删除并不频繁,并且该过程只需要在大量插入后运行,因此它很少运行,因此对过滤器操作没有相关影响。


V. CONCLUSIONS

本文阐述了过滤器的重要性,并比较了布隆过滤器和布谷过滤器。

布谷鸟过滤器的缺点之一是它们的误报率随着占用率的降低而线性降低,而布隆过滤器的降低速度更快。这意味着当过滤器在其最大占用率以下运行时,就像许多实际配置的情况一样,布隆过滤器可以提供更好的性能。其实我觉得这里不应该用“低于最大占用率”来描述,这样总会给人一种接近最大占用率的感觉。因该用“较低占用率”比较好吧?

本文提出了一种优化的弹性布谷鸟滤波器。可配置桶杜鹃过滤器(CBCF)利用桶中未使用的单元格为存储在桶中的元素使用更长的指纹,从而减少其对误报率的贡献。

CBCF 确实可以扩展 Cuckoo 过滤器优于 Bloom 过滤器的占用值。为了支持不同大小的指纹,CBCF 需要将完整的元素(或至少最长的指纹)存储在另一个表中。因此,它仅适用于本质上存储完整元素或具有较慢的较大内存的应用程序,可以在其上存储完整元素而对成本没有相关影响。

提议的 CBCF 可以扩展为支持桶上的多种配置,例如,通过每个桶使用两个选择位。这些配置留待未来的工作,因为它们似乎将在较低的占用率下提供大部分好处,而过滤器不应该在具有实际利益的配置中运行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值