论文阅读笔记-BitSense Universal and Nearly Zero-Error Optimization for Sketch Counters with Compressive

论文阅读笔记:BitSense: Universal and Nearly Zero-Error Optimization for Sketch Counters with Compressive Sensing


这篇文章是黄群老师发表在SIGCOMM2023的一篇论文,论文旨在对传统sketch计数器进行优化提高空间效率。BitSense使用技术是压缩感知,对sketch计数器进行优化,达到效果是2个:通用和几乎零误差。传统sketch采用固定大小计数器方案,由于流量的倾斜分布,计数器的高阶比特造成浪费,BitSense就是针对这种问题对浪费的高阶比特进行优化。具体是将计数器的高阶比特视作一个稀疏向量,利用压缩感知技术来压缩和恢复计数器。作者又对压缩和恢复模块进行了封装提供了一个编程接口。

具体来说,BitSense将每个计数器表示成几个更短的计数器,我们称作segments,因为计数器的隐性浪费现象,大多数的segments是0,形成了一个稀疏向量,BitSense在数据平面根据稀疏性利用压缩感知技术压缩这些segments,在控制平面恢复它们。恢复过程需要解决一个优化问题。进行查询用到一个辅助sketch(记录最低层segments的溢出)。控制平面进行恢复操作,数据平面进行估计操作,线上估计操作也作为BSCnt的一个接口进行了封装。涉及的操作有:压缩、恢复、查询,查询用到辅助sketch。

Abstract

存在问题:1) 由于sketch计数器向低值倾斜(skewed towards low values),大多数计数器中的较高位仍然为零。如此大量的未使用比特损害了sketch算法所看重的空间效率。 2) 不幸的是,缓解这个问题的努力要么适用于特定的算法(specific algorithm),要么会损害准确性。提出方案:设计了一种新的优化框架BitSense,它集成了现有的sketch算法。关键思想是将sketch计数器中的较高位视为稀疏向量(sparse vector),并利用压缩感知技术(compressive sensing techniques)压缩(compress)和恢复(restore)计数器。此外,BitSense提供了一个编程模块(programming model),帮助开发人员轻松实现sketch算法,而无需处理压缩和恢复的细。BitSense提出了一种自动配置参数(automatic approach for parameter configuration)的方法,理论上,它保证在配置下几乎为零误差。实现和效果:在P4中构建了一个BitSense原型和一个软件平台,并将其与14个sketch解决方案集成。实验表明,BitSense将现有sketch解决方案的内存使用量显著降低了25%-80%,同时产生的开销很小,精度下降几乎为零,优于五种最先进的优化框架。

1. Introduction

sketch如何工作:在现有的测量技术中,一类广泛的概率算法,即sketch算法,引起了人们的广泛关注。sketch算法在有限的资源使用下实现了较高的精度。sketch将测量结果(例如,per-flow frequencies每流频率)存储在固定大小的计数器中。当数据包到达时,它提取流键(flowkey),它被定义为数据包中报头字段的组合(例如,5元组)。然后,它散列流键以选择计数器并相应地更新它们。当查询流量统计信息时,sketch会根据其计数器产生准确的估计。

sketch存在问题:考虑到更大的流量和更多样化的测量任务,sketch必须扩展大小以保持可接受的误差水平。这一趋势对高速交换硬件提出了挑战,由于物理限制,高速交换硬件片上存储空间有限。为了解决这个问题,我们观察到sketch计数器遭受隐性浪费,即大多数计数器的较高位为零并导致浪费。这种浪费是普遍的,因为现有的sketch分配足够长的固定大小的计数器来保存最大值。网络流量的不均匀性(the skewness in network traffic)进一步加剧了这个问题:计数器偏向于低值,因为只有一小部分流量是大的。

以前研究在压缩计数器存在限制:第一,它们以失去精度为代价减少了存储资源,从而影响了测量结果的质量。第二,它们是为特定的数据结构精心设计的,无法推广到其他sketch。第三,它们不适应流量特征:一些框架在高度倾斜(highly skewed)的流量下是有效的,但在均匀分布(uniform distribution)下是无效的。综上所述,提高sketch算法的空间效率(space efficiency)和适应不同的流量特征仍然是关键和具有挑战性的问题。

提出BitSense新优化框架:目的是移除sketch计数器中的隐性浪费(implicit waste)。核心思想:将计数器的高位视为一个稀疏向量(sparse vector)。因此,BitSense使用压缩感知技术(compressive sensing)对它们进行压缩。具体来说,BitSense用几个更短的计数器表示每个计数器,我们称之为段(segments)。由于计数器的隐式浪费,大多数段(segments)为零,形成一个稀疏向量(sparse vector)。BitSense通过在数据平面上利用稀疏性(sparsity)使用压缩感知(compressive sensing)压缩这些段并在控制平面中恢复它们。恢复(recovery)解决了一个优化问题(optimization problem)。压缩感知理论保证了恢复后的计数器与原始计数器几乎相同,这意味着精度下降几乎为零。

BitSense在数据平面提供了一个估计方法用于实时查询:关键思想是在一个小的辅助sketch(auxiliary sketch)中记录segments的溢出。由于很少发生溢出,所以辅助sketch占用最小的内存。BitSense利用辅助sketch来估计计数器,而无需解决优化问题。与恢复(recovery)相比,估计提供了更宽松的准确性保证。幸运的是,由于近似的估计足以为sketch生成可靠的答案,因此估计不会损害总体度量质量(overall measurement quality)。

BitSense从3方面解决了以前方法限制:首先,我们提出了一种自动设置参数以避免精度损失的方法。理论分析保证在这种配置下误差几乎为零。其次,为了通用性(universality),BitSense与现有sketch框架的工作流程无缝集成。它提供了一个sketch计数器的抽象(即BSCnt)来隐藏压缩和恢复的底层细节。最后,对于适应性(adaptability),BitSense在不同的sketch数据结构和流量特征下稳健地减少了存储。它还会产生有限的资源开销。

软硬件实现和实验效果:在P4中构建了BitSense的原型和软件平台,我们还将其与14种sketch算法相结合,以证明其广泛的适用性(broad applicability)。实验表明,BitSense使sketch算法仅使用原始存储的25%-80%就能达到相同的精度,同时产生很少的开销。BitSense优于五个最先进的sketch优化框架。

BitSense原型的源代码:https://github.com/N2-Sys/BitSense

2. 背景和相关工作

2.1 计数器的隐式浪费

论文旨在优化sketch计数器,sketch计数器紧凑地存储流状态以适应有限的交换机内存。交换机内存称为sketch部署瓶颈有3个原因: (i) 流量的快速增长推动了对大量计数器的需求,这可能会超过内存预算。 (ii) 测量任务的多样性导致多个sketch在一个交换机共存,减少了每个sketch的内存预算。 (iii) 由于全局算力和速度的限制,片上存储器的数量受到严重限制(例如,几十MB)。为了解决这个问题,我们观察到计数器遭受隐性浪费(implicit waste),即大部分位保持为零。有两个原因:(i) sketch计数器通常是固定大小的。它们应该包含足够的位以避免溢出。由于最大值比平均值大几个数量级(,因此浪费的数量是巨大的。(ii) 大型计数器必须与大流量或许多小流量相关联。然而,这两种情况都很少发生。首先,网络流量的普遍偏性(the ubiquitous skewness)表明大流量很少。其次,sketch算法的随机性排除了小流频繁的哈希冲突。因此,大多数计数器中的较高位是未使用的。

2.2 相关工作

可变宽度计数器(Variable-width counters): 我们可以从小计数器开始,并在溢出上添加额外的位(例如,通过合并短计数器)。不幸的是,由于两个原因,可变宽度计数器在高速数据平面上是不可行的。首先,寻址这样的计数器在计算上是禁止的(computationally prohibitive)。例如,SALSA 必须检查几个合并位来确定单个计数器的边界。其次,计数器扩展可能会移动或调整其他计数器的大小,导致代价高昂的级联效应(cascading effect)。

缓存协作方法(Cache-assisted methods) : 在混合SRAM-DRAM存储器设计中,快速SRAM缓存小型计数器,并偶尔将它们刷新到DRAM中更大的计数器。然而,该设计有两个严重的缺点 :(i)它会导致昂贵的SRAM到DRAM的更新,以及 (ii)由于SRAM的容量有限,计数器管理算法难以实现。CASE 通过计数SRAM中的大流量数据包并在缓存替换期间基于估计器回写来利用重尾(heavy tail) 。然而,它会导致显著的精度损失。

混合sketch方法(Hybrid sketch methods):这种解决方案通过提出一种混合结构来有效地使用计数器,试图结合两种不同算法的优势。Elastic sketch在哈希表中跟踪大流量,在CM中跟踪剩余流量。MC sketch 根据流的优先级,保留了细、粗两个部分(a fine and a coarse part)。DHS用更长的fingerprints记录大流量而不是小流量,从而以更细的粒度进行监测。然而,这些方法粗略地将大型计数器与小型计数器分开。在每个专用数据结构中,隐式浪费仍然普遍存在。

计数器共享方案(Counter sharing schemes):在这种方案中,计数器的各个部分共享一个共同的片上地址(on-chip address),从而减少了内存占用。它们依赖于解码方法来恢复计数器值。例如,Counter Braids使用消息传递算法(message-passing algorithm)进行解码。一个严重的缺点是,在内存紧张的情况下,它可能产生高度有偏的甚至毫无意义的估计。其他解码方法依赖于无偏估计器。不幸的是,这些精心制作的估计器存在巨大的差异,使得最终的估计值无偏,但有变化。

3.BitSense的设计

BitSense是一个通用的、几乎零错误的sketch计数器优化框架,有几个设计目标:

  • 内存效率(memory efficiency):它有效地消除了sketch计数器中的隐性浪费。
  • 通用性(universality): 与现有sketch算法无缝集成。当与多个sketch同时集成时,BitSense可以测量不同的流量统计。
  • 接近零错误(nearly zero error):它在压缩后恢复每个计数器几乎为零错误;因此,它不会损害测量精度。
  • 鲁棒性(robustness): 对于不同的流模式,它是节省空间的(space-efficient)。
  • 有限开销(limited overhead) : 它产生有限的资源开销。
  • 用户友好型(user-friendliness): 他为用户提供了一个清晰的接口

3.1 设计概览

Abstract: BitSense提供了一个库,其中包含一种新型计数器,即BSCnt,用于隐藏消除隐式浪费的底层细节。每个BSCnt逻辑上表示一个固定大小的计数器,而BitSense将压缩它们在数据平面上的较高位,并在回答查询时恢复它们的值。BSCnt通过其接口支持基本的计数器操作,如增量和实时值访问。BitSense通过组合基本的BSCnt接口来实现复杂的计数器操作。因此,BitSense可以通过用BSCnt接口取代现有的sketch算法的计数器操作来与之集成。

Segment: BitSense表示一个BSCnt,它有几个从低到高排序的短计数器,我们称之为段(segments)。这种表示类似于数字的十进制表示,其中每个片段都像一个数字。具体来说,当BSCnt的值太大而不能在短段中保存时,该段会产生溢出,而高段会存储该溢出。例如:假设BitSense表示一个值为27的BSCnt,包含4个2位段。段0保持值27%(2^2) = 3,并产生溢出(27−3)/(2^2) = 6。段1不能保存值6;因此,它存储值6%(2^2) = 2,并产生溢出(6−2)/(2^2) = 1。段2可以保存值1;因此,它存储这个值并且不会产生溢出。段3未被修改,因此为零。由于高段的使用频率低于低段,它们往往是稀疏的,并导致压缩的机会。

在这里插入图片描述

基于segment的压缩:BitSense利用较高段的稀疏性来减少内存使用。具体来说,BitSense利用压缩感知,这是一种足以压缩和恢复稀疏向量的技术来压缩更高的段。它减少了高段的数量。因此,每个较高段不再存储单个溢出(来自较低段),而是存储多个溢出(来自不同较低段)的总和。当传入数据包更新BSCnt时,BitSense会修改相关的段。

基于优化的恢复(Optimization-based recovery): BitSense通过解决控制平面的优化问题来恢复压缩后的计数器。由于压缩模糊了单个溢出的信息,基于优化的恢复旨在恢复尽可能多的溢出。然而,由于高段比潜在溢出少得多,完全恢复每个溢出通常是不可行的。幸运的是,压缩感知理论保证了恢复的计数器几乎与原始计数器(具有高段的稀疏性的)相同。

线上估计(online estimation): 当我们试图在数据平面中检索计数器(retrieve a counter)时,解决优化问题在计算上是令人望而却步的。因此,BitSense允许直接在数据平面估计计数器值。关键思想是为BitSense配备一个辅助草图(auxiliary sketch),记录最低段的溢出。它利用辅助sketch的精度保证和相对较低的开销来准确、快速地估计溢出值。与控制平面恢复相比,在线估计提供了更宽松的精度保证,但速度更快,计算量更少。我们的实验表明,在线估计不会降低整体测量质量。我们还将在线估计封装为BSCnt的接口,从而对用户隐藏辅助sketch的细节。

自动配置(Autoconfiguration): BitSense自动配置压缩和恢复阶段的参数以及辅助sketch。它的配置说明了底层sketch结构和流量特征,使其对不同的流量模式具有鲁棒性。此外,我们从理论上证明,该配置以低访问和哈希开销实现了几乎零错误的恢复

架构:BitSense由数据平面和控制平面组成,最近在软件定义测量中的研究。它的工作流程包含四个步骤:

(1)Develop: 考虑到遥测目的,用户使用BSCnt库开发sketch算法(称为raw sketch)

(2)Transform: BitSense控制平面通过减少高段的数量来变换原始草图(raw sketch)。如果需要在线估计,它还会附加一个辅助草图(auxiliary sketch)。

(3)Update:数据包通过数据平面接口更新bscnt,它在内部修改转换后的sketch,包括段和辅助草图(如果有的话)(segments and the auxiliary sketch)。

(4)Restore: 数据平面定期向控制平面报告转换后的草图(transformed sketch),控制平面通过求解优化问题恢复计数器。恢复阶段的输出是与原始sketch在结构上同构的恢复草图(restored sketch)。应用程序可以通过查询还原后的草图(the restored sketch)来获取流量统计信息。

在这里插入图片描述

我们工作和以前压缩感知工作不同之处:首先,我们展示了如何用压缩感知去除隐式浪费,而之前的工作只关注于精确的测量。其次,我们的解决方案可以与现有的sketch集成,提高它们的空间效率,这超出了独立的sketch解决方案。

3.2 Develop:BSCnt and its Interfaces

BitSense将BSCnt定义为C语言风格的结构。用户在开发原始草图(raw sketch)时使用BSCnt构建数组或矩阵,就好像他们在操作常规的固定大小的计数器一样。BSCnt支持三种接口:

在这里插入图片描述

接口组合(Composition of the interfaces): 通过组合add和est接口,BitSense支持数据平面的复杂计数器操作。例如,我们考虑将计数器重置为零。我们首先通过est获取计数器的估计值𝑣,然后通过add更新计数器−𝑣。

图4演示了BSCnt与Space-saving算法的使用,注意,BitSense仅用相应的接口替换计数器操作。sketch算法的其他部分保持不变,BitSense通过对固定大小计数器的清晰抽象,可以与现有的sketch算法集成。

在这里插入图片描述

3.3 Transform: Data Structure

转换(Transformation)将一个原始的草图(raw sketch)变成了一个节省空间的结构(space-efficient structure)(其实就是压缩)。假设一个raw sketch有 n 0 n_0 n0 个计数器。BitSense用 L L L 个段(segment)表示每个计数器,其中段 l l l 包含 b l b_l bl 位( 0 ≤ l ≤ L − 1 0 \leq l \leq L-1 0lL1 ),所有计数器的段 l l l 共同构成一层; 因此有 L L L 层。此外,BitSense将所有层 l l l 段视为线性数组,为压缩提供统一的数据结构。图5(a)说明了BitSense如何变换一个2 × 3 Count-Min sketch,其 n 0 = 6 n_0=6 n0=6 。BitSense用 L = 3 L=3 L=3 段表示每个计数器,如图中水平对齐的块所示。此外,一层包括六个垂直对齐的段。

在这里插入图片描述

在这里插入图片描述

BitSense从三个方面对原始草图(raw sketch)进行了转换。首先,它削减了高段的数量。其次,它将一个状态位附加到一个段。第三,它附加了一个辅助草图(auxiliary sketch)。

Reduced segments: BitSense将层𝑙> 0的段数缩减为 n l ( < n l − 1 ) n_l(<n_{l-1}) nl(<nl1) 。因此,每个段不再像图5(a)那样存储单个溢出,而是存储多个溢出的总和。我们把多次溢出的总和称为sample,这是一个从压缩感知文献中借用的术语。具体来说,Layer-𝑙段存储了sample的最低 b l b_l bl 位。如果sample太大而无法装入一个段,则其较高的位将是溢出,这是Layer-(𝑙+ 1) sample 的成分。作为说明,图5(b)显示了转换后的草图,其中 n 1 = 3 n_1=3 n1=3 n 2 = 1 n_2=1 n2=1 。第0层将六个溢出压缩为三个sample,每个sample存储在第1层段中。第2层进一步将第1层的溢出压缩为一个sample。

Status bit: 状态位是与每个段(segment)相关联的一个位,用来指示段是否溢出。由于计数器值是倾斜(skewed)的,我们期望大多数状态位不被设置。未设置的位表示该段永远不会溢出。这将有助于之后的恢复(recovery)。注意,Layer-(𝐿−1)段没有这个位。原因是它们不能溢出;否则, 没有层来存储溢出值。现有的测量框架也有类似的要求,即每个计数器应该足够长,以避免溢出。由于它们采用较长的计数器而不是较短的段,它们加剧了计数器的隐性浪费。

Auxiliary sketch: 辅助sketch记录层0溢出。它接收0层段(Layer-0 segment)的索引(index)作为“flowkey”,其溢出作为“value”。辅助sketch的设计灵活。任何支持实时插入、删除和每流查询的sketch都是可行的。我们需要删除,因为我们必须在计数器分配时重置“流”(即,层0段的溢出(Layer-0 segment))。

辅助sketch和状态位分别消耗额外的空间以方便恢复和在线估计。幸运的是,由于减少的段节省了更多的内存,因此总体空间减少仍然是显著的。

3.4 Upadate of the Transformed Sketch

传入的数据包通过数据平面接口更新转换后的sketch(transformed sketch)。它们调用add来修改计数器,调用est来检索计数器的值。BitSense实现这两个接口如下。

在这里插入图片描述

Mapping overflows to a samples: BitSense通过基于哈希的方案将每层的溢出压缩为更少的sample。具体来说,BitSense在层𝑙中指定了几个(例如三个)哈希函数。每个哈希函数将一个Layer-𝑙段映射到一个Layer(𝑙+ 1)段。只要Layer-𝑙段溢出,我们将溢出添加到每个映射的sample中。由于哈希函数的数量很少,映射sample的数量也受到限制。

在这里插入图片描述

示例:假设转换sketch(transformed sketch)有 L = 3 L=3 L=3 层, 有 n l = 3 − l n_l=3-l nl=3l 个segments,在层 l = 0 , 1 , 2 l=0,1,2 l=0,1,2 b l = 2 b i t s b_l=2 bits bl=2bits。辅助sketch是一个有两个桶的数组(an array with two buckets)。假设即将到来的包按顺序触发了4个计数器更新。

首先,我们将2号计数器增加2。由于 C 0 [ 2 ] C_0[2] C0[2] 没有溢出,add立即终止。第二,我们将0号计数器增加5。现在 C 0 [ 0 ] C_0[0] C0[0] 溢出一,触发了一个对⟨0,1⟩插入辅助sketch。由于两个Layer-0函数都将 C 0 [ 0 ] C_0[0] C0[0] 映射到 C 1 [ 0 ] C_1[0] C1[0] ,我们将 C 1 [ 0 ] C_1[0] C1[0] 增加2。第三,我们把1号计数器增加16个。除了更新辅助sketch和第1层之外,我们注意到第1层段(segment)都溢出了一个。使用Layer-1哈希函数,我们将 C 2 [ 0 ] C_2[0] C2[0] 增加2。第四,我们把1号计数器减9。这个过程几乎与第三步相同,只是现在溢出是负的。例如, C 0 [ 1 ] C_0[1] C0[1] 存储(0−9)%(2^2) = 3,溢出(−9−3)/(2^ 2) =−3。如果我们要检索计数器1,根据辅助sketch,它的估计溢出是1。因此,计数器估计为1 × (2^2) + 3 = 7。

在这里插入图片描述

3.5 Restore: Control Plane Interface

恢复阶段(recovery phas) 对控制平面的计数器进行恢复。虽然第0层段存储计数器值的最低 b 0 b_0 b0 位,但它们的溢出是不清楚的。因此,关键在于从更高层的sample中恢复每个溢出。

问题定义:我们从两个方面对恢复(formalize the recovery)进行数学形式化。首先,我们形式化段(segment)、样本(sample)和溢出(overflow)之间的关系。具体来说,我们将sample向量 S l S_l Sl 定义为所有Layer-𝑙 sample的数组,将overflow向量 X l X_l Xl 定义为所有Layer-𝑙溢出的数组。关系是 S l = 2 b 1 ⋅ X l + C l S_l=2^{b_1} \cdot X_l +C_l Sl=2b1Xl+Cl ,因为 C l C_l Cl 存储低位,而 X l X_l Xl 保存高位。其次,压缩本质上是一个线性变换,因为每个sample是所有映射溢出的总和。我们表示变换矩阵为 ϕ l \phi_l ϕl 。它的(j,k)-th系数表示层-𝑙索引𝑘映射到𝑗的次数,即:

在这里插入图片描述
在这里插入图片描述

恢复阶段(recovery phase)形成了一个优化问题。由于段(segments)比溢出(overflows)少得多,即使有状态位的帮助, S l + 1 = ϕ l X l S_{l+1}=\phi_lX_l Sl+1=ϕlXl 通常也是不确定的。因此,我们找到 X l X_l Xl 的“最佳”估计,而不是确定 X l X_l Xl 。我们寻求最小化 l 2 l_2 l2 范数:

在这里插入图片描述

在这里插入图片描述

图8恢复算法示例 : 我们恢复三个计数器(图8)。对于第1层,构建的优化问题有两个变量和一个方程,形成一个待定系统。幸运的是,规范强制 X 1 = ( 0 , 0 ) X_1=(0,0) X1=(0,0) 。然后, S 1 = 2 2 ⋅ X 1 + C 1 = ( 3 , 1 ) S_1=2^2 \cdot X_1 + C_1=(3,1) S1=22X1+C1=(3,1) 。恢复𝑆1后,我们继续恢复𝑆0。这两个方程是满秩的;因此,有一个唯一解𝑋0 =(1,1,0)。最后,我们得到 S 0 = 2 2 ⋅ X 0 + C 0 S_0=2^2 \cdot X_0 + C_0 S0=22X0+C0

4. 评价

评价指标: 进行了两个测量任务:per-flow measurement和heavy hitter detection。对于per-flow measurement,我们测量准确性使用flow ratio 和ARE。对于heavy-hitter检测,我们测量准确性使用F1-score和ARE。引入另外两个指标:memory footprint ratio(MFR)和recovery time。MFR是指优化后和优化前的内存占用比。注意,内存占用也包括辅助sketch的内存占用。恢复时间是指控制平面恢复的运行时间。

在这里插入图片描述

5. 总结

我们设计并实现了BitSense,一个通用的sketch计数器优化框架。BitSense利用压缩感知有效地压缩和恢复计数器,几乎为零错误。它提供了一种编程抽象和一种配置方法来对用户隐藏细节。评估表明,BitSense显著提高了现有sketch的空间效率,同时产生最小的开销。BitSense进一步释放了sketch解决方案的力量,特别是在具有严格存储限制和大流量的高速交换硬件上。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值