SIGCOMM 21 CocoSketch:High-Performance Sketch-based Measurementover Arbitrary Partial Key Query 论文阅读

8 篇文章 1 订阅

一、简介

相对于传统的基于采样的网络测量方法,基于Sketch的测量方法由于其高精确性和资源消耗低的特性现在被更广泛的研究。

从sketch提出到现在,关于sketch提出了很多不同的方法,但是这些方法都是基于一个特殊的流键(one particular flow key),也就是只能根据这个唯一的流键进行相应的判断和处理,这些sketch方法无法支持多个keys。

本文的主要亮点即:提出了一个支持 任意部分键查询(arbitrary partial key queries) 的方法,我们只需要在测量开始之前指定感兴趣的所有可能的流键,在查询时,我们可以提取该范围内任何键的信息。

CocoSketch将任意部分键的查询问题转换为了子集和估计问题,使得子集和估计的理论工具实用化。为了在软件和硬件平台上实现理想的资源精度权衡,文中提出了两种技术:

(1)随机方差最小化,以显著减少每包更新延迟;

(2)消除每包更新逻辑中的循环依赖,使实现硬件友好。

Motivation

以往的方法都是通过 single flow key来统计信息,这些flow key可以是一个特定的报头字段(如SrcIP、DstIP),也可以是字段组合(比如 五元组),或者是字段中的比特子集(比如 SrcIP的任意前缀),这里的single flow key 意思不是说这个key只能有一个数(毕竟五元组也不是一个数),而是说,这能根据这一个值来判断,比如如果确定了是五元组,那就只能根据五元组这一个key来判断,不能多也不能少,不能再根据其他的key(比如SrcIP前缀)。

所以,虽然这种方法已经有了很多的研究,也有很多成果,但是如果想要用sketch同时测量多个流键(multiple flow keys),是不切实际的。因为这要求操作员载测量开始之前就把所有可能的流键定义出来,这在实际中比较难做到,很难将所有的流键都定义出来,比如DDoS检测可以跟踪数十个流密钥上定义的大流,包括SrcIP/DstIP、5元组和它们的任意前缀。另外交换机中的计算资源是有限的,现有的一些方法为每个流键分配一个sketch,如Tofino交换机(有48个ALU),每个Count-Min Sketch需要8个ALU运算,因此不能运算超过6个sketch,所以如果分别定义出所有的流键可能也无法运算。

Solution

本文定义了一类称为“任意部分键查询”的新问题,它“后期绑定”sketch应该支持的键。操作人员只需要预先定义一个较大范围的键(称为 全键K_{F}----full key K_{F}),在查询期间,他们仍然可以查询属于K_{F}一部分的任何键(称为部分键---partial key)的流大小。(如,全键是五元组,则系统应该估计任意部分键的流大小,如:SrcIP和SrcIP的任意前缀)。

用于“任意部分键查询”的理想系统应满足三个要求:(1)保真度(对任何部分密钥的可证明准确性保证),(2)资源效率(使用最小内存的高吞吐量)和(3)兼容性(在各种软件和硬件平台上,例如Open vSwitch[50]、PISA[49]和FPGA[51])。

 但是现有的方式总是无法同时满足上面提到的这三种要求,如下表所示:

 它们只能满足其中的部分要求,难以做到全部满足,而本文提出的CocoSketch(Cornucopia Sketch)可以做到。CocoSketch 为任意部分键查询提供了可证明的准确性保证,并且通过只维护一个草图,大大减少了内存使用和更新延迟。此外,CocoSketch可以在软件和硬件平台上高效地实现。

 CocoSketch与无偏节省空间(USS)[53]具有相同的理论基础,USS是一种最新的子集和估计技术[54]。给定一组项目,每个项目都有一个权重,子集和估计问题估计任何项目子集的总权重。任意部分密钥查询的问题可以归结为子集和估计问题:部分密钥流c的大小等于在部分密钥上匹配的完整密钥流子集的总大小。例如,由SrcIP和DstIP字段定义的流c的大小等于与c共享SrcIP和DstIP的所有5元组流的总大小。USS背后的关键思想是方差最小化技术,它将子集和估计的方差最小化。但是,USS的更新延迟随着系统中记录的流量的增加而成比例增长(以10^{4}增长),所以即使是很简单的实现也会导致CPU吞吐量低的问题,并且他不能由一些资源约束硬件支持。

Challenges

CocoSketch的挑战在于如何将子集和估计理论实际应用于部分密钥查询问题。

本文提出了两个技术:

        (1)stochastic variance minimization(随机方差最小化):它利用“d的幂选择”来大幅减少每个数据包的更新延迟,同时仍然保持所有流上的大小估计的低总方差。

        (2)remove circular dependency(移除循环依赖性):通过将随机方差最小化的操作并行化,以仅导致估计误差轻微增加的方式消除循环依赖。

Arbitrary Partial Key Problem

什么是任意部分键问题?文中定义了任意部分键查询,它支持对多个键的查询,而无需预先定义要度量的键。操作员只需要指定一个包含将来可能查询的所有部分键的完整键,具体的定义如下:

定义一:任意键。

 这个定义实际上就是前面说的,部分密钥流c的大小等于在部分密钥上匹配的完整密钥流子集的总大小。对于部分键的任意的流e,我们有f(e)是流e的统计函数值(本文假定函数 f 就是一个求流大小的函数)

定义二:任意部分键查询。

二、现有的方法以及局限性

1、One single-key sketch per key:

实现任意部分键查询的一个方法是为每个可能的部分键创建一个单键sketch,但这种方法在前面也说过了,并不可行,数量可能很大,最终使得交换机无法处理。无法扩展到多个关键点。

最近的R-HHH减少多个sketch上每个sketch的操作开销,这种基于采样的方法提高了软件中sketch的吞吐量,但在相同的内存空间量下,它会显著增加资源使用。以达到相同的错误界限或者是降低精度。

Tofino交换机前面也说了,资源使用量随着sketch的增多而线性增长,因此只能支持少数几个键(能处理的sketch有限)

2、Full-key sketch with post recovery:

可以为 full key 部署 single-flow key sketch,并使用以下两种方法从完整密钥流信息恢复部分密钥流的大小,尽管这两种方法都不理想。(1) 一种方法是通过查询和聚合属于部分密钥流的所有可能的完整密钥流的大小来恢复每个部分密钥流的大小,但是这样的完整密钥流的数量可能非常大。(2)另一种方法是,我们只聚合显式记录在sketch中的完整密钥流,而不是聚合所有完整密钥流的估计值。

3、Subset sum estimation:

将任意部分密钥查询问题转化为子集和估计问题。与 single-key sketch 不同,single-key sketch 可以最大程度地减小单个项目的估计误差,子集和估计提供了对所有(和任何子集)项目总和的无偏估计,且方差最小。这非常符合我们的目标,因为每个部分密钥流大小等于完整密钥流子集的总大小。如下图

 不过现有的这种对于子集和估计的问题的工作,尤其是USS,对网络的测量是不切实际的。原因主要还是USS的局限性(更新延迟随着流量增加以10^{4}增长)。

所以,现有的方法都不那么好。

三、CocoSketch

 Coco Sketch的框架图如图。整个Coco Sketch的流程在图上也可以很清楚的看到。

Coco Sketch只用了一个sketch,大小为 d*l(d和 l 都是可以配置的),其中 d 代表有 d 个哈希函数,l 代表每一行有 l 个位置,所以共有 d*l 个桶(bucket)

CocoSketch有三个设计要求:

[R1] 部分密钥的准确性保证:CocoSketch应为所有部分密钥查询提供准确性保证。本文重点关注与流大小相关的查询的准确性(例如,Heavy Hitter检测、Heavy Change检测)

[R2] 计算和内存资源效率:CocoSketch应在软件和硬件平台上使用较小的内存占用实现高吞吐量

[R3] 与不同平台的兼容性:CocoSketch应同时适用于软件(如CPU和OVS)和硬件(如FPGA和可重构ASIC平台。

工作流程:

首先,操作员预先定义一个全键(full keyK_{F}),其中任意可能会查询的键都是部分键(partial key K_{p}),K_{F}可以是大范围的数据包头字段,例如5元组或应用层头。

 step 1:提取到来的流的完整的键值e,用 d 个哈希函数将 e 映射到 d 个bucket中,这d个bucket的每一个都是 l 个bucket 数组中的的一个。

setp2:以随机方差最小化的方法,用数据包大小更新映射存储桶的计数器。

step3:根据数据平面维护的sketch,首先恢复每个记录的完整密钥流的大小。

step4:仅聚合记录的完整密钥流的大小,以推断由查询的部分密钥Kp定义的流的大小

                                        图2 说明了CocoSketch相对于基线的性能优势 

接下来说明一下CocoSketch中使用的两种技术

1、Stochastic Variance Minimization

Variance minimization in Unbiased SpaceSaving:首先了解一下USS中如何将流量大小的估计方差最小化,以及为什么具有那么高的更新延迟。对于具有完整密钥流e和数据包大小w的每个传入数据包,

        (1)如果在一个存储桶中已经存在了流 e,那么USS将该bucket中的e的counter值增加w,以便不增加方差;

        (2)否则,USS扫描bucket以查找计数器counter值最小的bucket,即C_{min},将其增加 w,然后以 \frac{w}{C_{min}} 的概率将bucket中的flow key替换为e。

由于每次更新的内存访问次数与bucket的数目相同(以10^{4}为尺度),所以USS实际上违反了要求[R2]和[R3]。

那么现在的问题是:如何在保持高精度保证的同时降低USS的更新成本?

Reducing update delay:文中提出了严格的方差最小化:对于当前未被草图记录的每个数据包,CocoSketch在d个散列索引桶(而不是所有桶)中找到最小的桶,增加计数器,并以与USS相同的方式替换流。换句话说,如果d是桶的总数,CocoSketch将等同于USS。然而,CocoSketch将d设置为比bucket数(例如10^{4})小得多(例如2到4),从而大大减少了更新延迟。

现在,关键问题是为什么在每个数据包中只更新d个存储桶(而不是所有存储桶)中的存储桶仍然会产生方差很小的无偏大小估计?

文中假设流遵循重尾分布(大多数流的体积小,少部分流的体积大)

  • 对于大流来说bucket中的counter值是比较准确的,因为它的计数器大部分是由相同的大流量增加的,碰撞的可能性很小。
  • 对于小流,我们的技术(如USS)将小流分布在映射的bucket之间(如“负载平衡”过程),以控制每流的差异,由于这些小流的数量很大,因此会有很大的概率碰撞。

2、Circular Dependency Removal

虽然随机方差最小化允许CocoSketch在软件平台上实现高性能,但由于其更新操作中固有的循环依赖性,它无法在硬件平台上有效实现。文中使用Tofino架构展示了这个问题,并提出了一个有效的解决方案。

Constraints in RMT switches:图3以Tofino交换机的pipeline架构作为RMT交换机的一个示例。每个pipeline 由多个阶段组成,重要的是,每个阶段都不能访问任何先前阶段的内存。因此,任何草图更新算法都必须遵循单向工作流(unidirectional workflow),即:数据流严格的从第一阶段到最后一个阶段执行。并且,每个pipeline的stage数量是有限的,且每个stage的内存和计算资源都是有限的,因此,任何草图算法都必须适合于较小的内存空间,并对每个数据包执行少量的内存访问。

Circular dependencies and their removal:随机方差最小化引入了两种循环依赖形式,如图4所示,使其与RMT交换机中的单向工作流不兼容。所以要去除这些循环依赖,否则在RMT交换机中是无法正常执行的,因为这种硬件交换机只能单向处理工作流。

  •     首先,我们需要删除bucket之间的循环依赖关系。每个数据包更新都有d>1个对应的bucket。对这 d 个bucket 的更新存在相互依赖。如:原本每个bucket的key是否要更新是依赖于剩下的(d-1)个bucket的(因为要更新最小的那个值),所以这里形成了一个循环依赖。

解决:独立并行地更新每个bucket。我们不在d个bucket上运行一个随机方差最小化实例,而是运行d个随机方差最小化实例,每个实例只在一个bucket上执行。显然,一个bucket上的随机方差最小化可能会导致更大的误差。为了控制误差,用d个bucket中的 中值 作为最终结果。

  • 其次,我们进一步消除了流键与其在每个bucket中的估计大小之间的循环依赖关系。这种依赖性来自算法设计,其中(i)每个计数器更新取决于存储桶中的key(因为只有当记录的密钥与到达数据包的密钥匹配时,计数器才应增加),但(ii)每个密钥更新取决于存储桶中的计数器(因为替换存储桶中的key的概率取决于其估计大小)。为此,我们简化了更新逻辑,并将流密钥和估计大小分为不同的阶段。因此,一个桶中的更新过程可以流水线(pipeline)进行。

通过消除bucket之间和bucket内部的循环依赖,可以在硬件中高效地实现CocoSketch。

四、设计原理

 接下来描述CocoSketch的更新和查询机制。

Basic CocoSketch

原始的cocosketch的结构示例图如下,其数据结构包括了d=2个数组,每个数组有 l 个bucket,实际上,每个bucket就是一个(key,value)对,其中,key代表特定的完整的键,value代表流大小的估计值。

B_{i}[j] 代表第 i 个数组的第 j 个bucket,B_{i}[j].K 和  B_{i}[j].V 分别代表他的 key 和 value值。d个数组分别有 d 个不同的哈希函数。

将每个传进来的packet 定义为(e,w),e代表一个特定的 full key,w是它的增量大小。如何将packet(e,w)插入到sketch?首先根据d个数组的哈希函数,分别将流键 e 映射到 d个array的bucket中,再根据 随机方差最小化 来决定更新哪个bucket的值。这里有两种情况:

        (1)如果 e 匹配到 d 个bucket中的任意一个,直接以增量w增加bucket的值,然后返回。

        (2)如果 e 匹配不到,则找到其中value值最小的bucket(假设是B_{k}[h_{k}(e)].V,其中h_{k}(e)代表对其做哈希散列),给它的value值增加 w ,然后以概率 \frac{w}{B_{k}[h_{k}(e)].V} 用新来的键 e 替换掉原来的键。如果有多个bucket的value值一样且最小,随机选一个更新。(注意:这里是先选最小的再增加w,而不是给每个都增加w然后再选最小的,别搞混淆了!)

注意,对于每个传入的数据包,我们的插入逻辑保证它只更新一个bucket的值和最多一个bucket的键。

具体的例子也可以参考图5,有两个数据包插入,分别是第一种和第二种情况。

注意:basic cocsketch的方法是没有去除循环依赖性的,所以还提出了硬件友好的CocoSketch方法

Hardware-friendly CocoSketch

Hardware-friendly CocoSketch 扩展了基本CocoSketch,通过删除循环依赖插入来优化硬件中的资源效率。

 Hardware-friendly insertion:与之前的Basic CocoSketch不同,这里每一个array的插入都是相互独立的。这是因为网络硬件(如FPGA)的体系结构通常是由并行运行的不同逻辑部分设计的,硬件友好的算法设计应该利用并行性来更好地利用资源。

对于每个数据包,我们独立地更新每个数据包,而不是同时在d个bucket上进行随机方差最小化。

从图中也可以看出来,与basic cocosketch方法不同之处在于:

        实际上这种硬件友好的cocosketch(去除了循环依赖性)是将key和value分开存储,这去除了第一个依赖性。

        并且前面提到的在将packet插入的过程中,将 e 映射到d个bucket中,用随机方差最小化的方法来决定哪一个bucket进行更新(即:选择value最小的,然后以概率更新),这里只会更新一个bucket。而新的方法中,实际上在packet的插入过程中,不再使用随机方差最小化的方法(也就是不再选择一个最小的来更新),而是直接独立且同时的对每一个bucket进行更新,也就是:

(1)如果能匹配到e(也就是哈希的结果对应的bucket的key是e),则直接增加w然后返回。(2)如果匹配不到e,则d个array中的每一个bucket的value都增加 w,然后以概率\frac{w}{B_{k}[h_{k}(e)].V}进行更新。

(无论是否是full key e,都增加w),这里要注意,由于这种方式对每一个bucket都增加w并且以概率更新,所以是有可能一个流在多个bucket中出现(也即:刚好都更新为新的e)。

Query for Arbitrary Partial Key

Query front-end:

我们首先通过查询记录的全键流的sketch,构建一个包含两列(全键,大小)的表(即,每个记录流的估计大小的表)。

在 硬件友好的CocoSketch 中,由于一个流可能出现在多个array中,因此我们将以不同array中的中值估计大小作为其最终估计大小。

Examples of partial key query:

如上图:假设完整的key是(SrcIP,SrcPort),我们想查询部分密钥SrcIP。我们首先得到完整的键结果(左)。然后,我们根据SrcIP字段聚合结果以获得部分密钥结果(右)。有两个完整密钥流共享SrcIP 19.98.10.26,所以我们将它们的大小相加,得到部分密钥流 19.98.10.26 的估计大小1041(520 521)相反,SrcIP 34.52.73.17只有一个完整的密钥流,因此部分密钥流34.52.73.17的估计大小为856。

五、实验

最终实验在四个不同的平台进行了部署,分别是基于x86的CPU环境下、OVS、 Xilinx FPGA和Barefoot Tofino交换机下。

实验的metric:

一些实验结果如下:

可以看到,本实验提出的方法召回率不是比较稳定的,并且是最好的。

具体的实验结果大家可以参考论文,这里主要是对论文的方法进行了总结。

六、总结

本文实际上就是提出了一个任意部分键查询的方式,通过这种方式,在很小的开销下(只需要一个sketch)就可以高效的记录这些流的特征,我们只需要定义一个可能出现的流键,然后可以通过这个full key来查询任意的部分键(partial key),利用随机方差最小化的思想更新bucket(减少了每个包更新的延迟),并且是以概率的方式进行更新,因为硬件的一些特性,还提出了硬件友好的cocosketch方法,对d个array独立进行操作,并且将(key,value)对分为两个部分,使得因为随机方差最小化导致的循环依赖型被消除。

与传统的single flow key的方式相比,cocosketch的方法可以任意查询部分键的数值,更加灵活,并且平均数据包吞吐量增加了27.2倍(文中有实验图)。

本文主要是对SIGCOMM2021的这篇论文做了一个阅读笔记,也是这一个专栏的一个目的,仅供学习使用,可能有的理解不完全正确,也欢迎大家一起讨论

论文链接:CocoSketch | Proceedings of the 2021 ACM SIGCOMM 2021 Conference

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值