其他分享
首页 > 其他分享> > Sigcomm 2021 Programmable Packet Scheduling with a Single Queue 顶会论文阅读

Sigcomm 2021 Programmable Packet Scheduling with a Single Queue 顶会论文阅读

作者:互联网

最近阅读了SIgcomm今年的一篇论文,在这里做简单的总结思考。作为学习论文阅读的一个过程。

可编程数据包调度    首先要知道什么是可编程数据包调度,我们知道,以往的数据包转发操作等都是与硬件耦合的,转发规则都是在生产硬件的时候就定下来的,不能改变;而可编程数据包调度则是进行了解耦合,我们可以自己决定要怎么转发,在不影响到硬件的情况下在数据平面进行编程,控制数据平面的转发操作。

文中提出了Admission-In First-Out(AIFO)队列,这是一种仅使用单个先入先出队列的可编程数据包调度的新解决方案。AIFO的动机是两种最新趋势的汇合:交换机中的浅缓冲区和终端主机中的快速收敛(fast-converging)拥塞控制,这两种趋势共同导致了一个简单的观察结果:在现代数据中心网络中,流完成时间(FCT)的决定性因素通常是哪些数据包在排队或被丢弃,而不是他们离开交换机的顺序。AIFO的核心思想是保持一个滑动窗口来跟踪最近数据包的等级(rank),并计算窗口中到达数据包的相对等级关系以进行准入控制(admission control)。理论上,我们证明了AIFO提供有界的性能,以对比Push-In First-Out(PIFO)。根据经验,我们完全实现了AIFO,并使用一系列实际工作负载评估了AIFO,证明AIFO与PIFO非常接近。重要的是,与PIFO不同,AIFO可以在现有硬件上以线路速率运行,并且使用的交换机资源最少,仅为单个队列。

什么是PIFO?

Push-In-First-Out(PIFO)队列是可编程数据包调度的一种常用抽象总结。PIFO将一个列组与每个数据包相关联,并维护一个排序队列以缓冲数据包。新到达的数据包根据其等级插入队列,数据包从头部离开队列,通过改变rank计算功能,可以在PIFO的基础上实现不同的数据包调度算法,如:用于最小化流完成时间(FCT)的最短剩余处理时间(SRPT)和用于加权公平性的开始时间公平排队(STFQ)。

PIFO的难点

在实现起来具有挑战,很难实现。rank的计算相对简单,但是现有交换机不支持数据平面中的排序队列(sorted queue),这使得插入计算好rank的packet到指定位置变得困难。

什么是AIFO?

AIFO和PIFO一样,也可以支持不同的调度算法,只需要修改Admission Control里计算rank等的操作就可以。

AIFO还能够避免产生饥饿现象(starvation prevention),而PIFO虽然支持多种调度算法,但它不能支持pFabric所需的饥饿预防,因为当PIFO编程为使用SRPT时,流的后一个数据包将首先被调度。

使用单个先入先出(FIFO)队列。FIFO(drop tail)队列是最简单的队列之一,可以以线路速率运行,几乎在所有交换机中都可用。

理想情况下,AIFO应接纳与PIFO相同的数据包集,以近似它。AIFO通过维护一个滑动窗口来跟踪窗口中最近数据包的rank,并计算到达数据包的rank,以决定是否接纳或主动丢弃数据包,即使队列可能仍有空间!

FIFO、PIFO、AIFO处理packet的区别

FIFO    FIFO与操作系统中学的是一样的,也就是先入先出,离开队列的顺序和进入队列的顺序是一样的。如图,有一个流过来,数据包分别是1 4 5 1 2 2,那么当缓冲区只有4个位置的时候,那么只有1 4 5 1进来了,后面的两个rank为2 的数据包都被drop了,并且最终以这个顺序出队。

 PIFO    PIFO与FIFO的思想是非常不一样的,在进入队列的时候,入队的数据包会根据它们的秩(rank)进行排序,rank越小代表优先级越高,优先级越高的会越早被处理,也就是优先级高的会放在整个队列的前面。缓冲区内数据包的变化如下:  { 1 }、{ 1  4 }、{ 1  4  5 }、{1  1  4  5 }(这里,当rank值为1的数据包进入队列后,因为优先级更高,这里会进行调度,放到前面去)、{ 1  1  2  4 } (当rank值为2的数据包到了以后,按照优先级会排到1的后面,那么此时,rank为5的数据包就被drop了)、 { 1  1  2  2 }(理由如上,rank为4的被drop了)

AIFO   AIFO与PIFO和FIFO都有些类似,在AIFO中提出了一个admission control,主要是用于控制什么数据包能够进入到这个缓冲队列中。上文也提到了,AIFO是一个使用了FIFO方式的single queue,AIFO主要是在入队之前进行控制,在admission control,设置了rank < 3 是入队的条件,因此,队列变化如下: { 1 }、{ 1 1 }、{ 1 1 2 }、 { 1 1 2 2 };

这里有一个要注意的,在这里AIFO和PIFO的出队的packet和顺序都一样,但是实际上,出队的顺序有可能不一样,如下:

 PIFO如上,最终是 1 1 2 2 ,但是AIFO中,他只是在Admission Control的时候进行了判断,判断为可以入队时,则数据包进入缓冲队列,但是!!在缓冲队列里并不会再根据优先级在排序了,而是按照FIFO的方式,怎么进去的就是怎么样的顺序出队。

设计目标

所以,本文提出的方法AIFO实际上相当于是,将原本的数据包的调度问题转换为了Admission Control 的问题,只需要处理“是否允许进入队列”,可以入队的话就按FIFO的方式入队和出队,不允许入队则直接丢包;不需要像原本PIFO一样要在在缓冲区内部调度,使得更容易实现。

设计的目标就是缩小 AIFO 和 PIFO 之间的差距,使得AIFO更接近于PIFO

是否接近的考量方式如下:

① 经过AIFO和PIFO两种方式后输出的数据包是否相同

② 经过AIFO和PIFO两种方式后输出的数据包的顺序是否相同

关于第一点:

 让PIFO和AIFO退出队列(直到timet)的数据包集分别为P(t)和A(t),用如下式子代表PIFO和AIFO之间的差距,

是P(t)和A(t)之间集差的基数(cardinality of the set difference); 是A(t)和P(t)之间的集差,P(t) 和 A(t) 分别是集合 P(t) 和 A(t) 的基数。\Delta \left ( t \right )\in [0,1],当\Delta越大说明AIFO和PIFO之间输出的数据包差距越大,当\Delta越小说明AIFO和PIFO输出的数据包的差异越小。当\Delta= 0,说明完全一样,\Delta= 1说明完全不一样 ;

根据实验结果表明,AIFO在性能表现上接近于PFIO。

关于第二点:

 如上面说的,AIFO和PIFO的区别展示了虽然他们输出的数据包可能是一样的,但是顺序不一定一样!

但作者认为,第二点并不是那么重要,有时甚至不需要优化,原因是:(i)现在都趋向于浅缓存。(ii)终端主机上的紧密控制回路趋势。缓冲区很浅使得并不会有很多的数据包在缓冲区中,最终使得AIFO和PIFO之间的差异会缩小。

所以,AIFO和PIFO很接近!

 总结。总之,最终目标是设计AIFO,AIFO具有最低的硬件要求(即单个队列),并允许正确的数据包集,以最小化\Delta(缩小和PIFO的差距)并保持浅缓冲区。该算法应该能够在现有硬件的数据平面上实现,并以线速率运行。我们希望确保该算法为PIFO提供关于\Delta的有界性能。

AIFO的设计

AIFO原理: AIFO仅使用单个FIFO队列,而不是PIFO队列或多个严格优先级的FIFO队列。它在FIFO队列前面添加admission control,以决定是否接纳或丢弃到达的数据包。准入的数据包由队列按FIFO顺序进行缓冲和发送,不需要额外的调度。

 AIFO通过同时考虑时间和空间这两个维度,实现了具有二维准入控制的PIFO的近似。

时间分量   通过基于到达速率的波动随时间改变阈值来考虑时间维度;admission control的控制是动态的而非固定的,根据到达速率和离开速率之间的实时差异进行更新。当到达速率显著超过离开速率时,阈值变得更为激进。

空间分量   通过基于每次数据包的rank来确定阈值来考虑空间维度。它确保被接纳的数据包具有与PIFO接纳的数据包相似的rank。

所以,主要是基于两个关键(时间分量和空间分量)来设计AIFO(也就是admission control),算法如下:

 对于时间分量:

c(current queue length)、 C(target queue size), 用c和C之间的差异来捕获到达速率和离开速率之间的差异。当前队列长度接近目标队列大小时,即当 \frac{C-c}{C} 很小时,admission control更加激进。分配一个headroom,以允许参数为k的小突发。当队列长度在headroom范围内(即 c\leq kC ),所有数据包均被接纳(即可以入队)。所以,C和c之间的差异也可以按照\frac{1}{1-k}进行缩放。在算法中的第五行,将c\leq kC  和 W.quantile(pkt) \leqslant \frac{1}{1-k}\frac{C-c}{C}两种情况分别处理,实际上,c<=kC 相当于是多余的

对于空间分量

根据滑动窗口来进行判断,AIFO维护最近接收的packet的滑动窗口,使用到达的packet的rank值的分位数(W.quantile(pkt))作为判断的准则,当这个rank小于\frac{1}{1-k}\frac{C-c}{C}时,packet被接收(可以入队),否则packet会被丢弃。考虑了\frac{1}{1-k}的headroom后,\frac{1}{1-k} \frac{C-c}{C}代表剩余的空间。

为什么要考虑两个分量?

考虑两个分量来确定packet最终能否入队,虽然更复杂一些,但是二维方法的好处时一个组件的不精确性可以由另外一个组件补偿,如果空间分量的分位数(quantile)估计有所偏差,比如允许了额外的packet入队,那么也就是队列长度c会增加,那么分位数阈值\frac{1}{1-k} \frac{C-c}{C}会增加,于是时间分量会更加严格控制,这会修正空间分量,使其用更小的rank阈值来判断。

 以下列出了两种情况:

 ① 允许数据包低于分位数阈值。

② 分位数阈值以上的丢包

关于AIFO的部署

AIFO主要部署在可编程交换机的数据平面,AIFO算法本事与硬件结构时无关的。但是在部署时也有相应的问题:

① 时间分量的队列长度估计,时间分量的主要挑战是根据队列长度保持动态阈值\frac{1}{1-k} \frac{C-c}{C},由于通常队列的信息在packet经过了traffic manager,也就是到达egress的时候才知道队列的长度信息,而我们要在ingress就进行判断,解决方法如下,构造了一个循环来解决,入口和出口处均有寄存器,出口的管道上利用寄存器记录每个出口管道端口的队列长度,每当packet通过traffic manager,可以把队列的长度值写道出口寄存器,,并利用worker packet(工作数据包)把出口寄存器的信息携带到入口寄存器中,这样在入口就知道每个队列的长度信息了,从而方便判断。

 ② 空间分量的分位数估计,空间分量的主要挑战是对分位数的计算问题。我们使用一组阶段(a set of stages)来实现滑动窗口来存储最近的数据包和估计分位数,可编程交换机通常支持每级访问多个寄存器,如:每个阶段有m个寄存器,模拟有n个插槽的滑动窗口,需要n/m个阶段;比如共需要16个插槽的滑动窗口,每个阶段有4个寄存器,共有4个阶段,如下图,每个寄存器的索引从0到  n-1,他代表了packet在滑动窗口中的位置,寄存器 i 存储的值相当于是滑动窗口 i 处的packet的rank值。

用index tagger模块来跟踪滑动窗口,index tagger模块的循环计数器(counter)在0到n-1之间循环,它将计数器的值分配给来的packet,然后自增1,比如,此时index tagger的counter是4,则pkt.index的值为4,则,第二阶段的第一个寄存器(即i=4的寄存器)的rank值将用到达的数据包的rank值更新(更新为5),而counter自增1后变为5,也就是下一个到达的packet的pkt.index设为5,并指向第二阶段的第二个寄存器(i=5处);

同时,当数据包经过每个阶段的时候,交换机还将数据包的rank与每个寄存器中的值与ALU进行比较,每个ALU输packet的rank是否小于寄存器的值,如果packet的rank比较小,则output=1,如果packet的rank值比较大,则output=0,将所有的ALU的output相加,,到达数据包的分位数(quantile)用 q / 窗口长度来计算:W.quantile(pkt)= q / n ;

如下图,到达数据包的rank为5,小于图中6个红色标记的寄存器值,所以q/n=6/16=37.5%(这里我有一些疑惑,但是暂时还没想明白,不知道为什么是6个红色的寄存器的值,我也看了原视频,也不明白,如果有明白这里为啥的希望可以交流交流~)

 实验评估

 文中进行了多个实验,分别测试了queue length的长度、窗口长度和采样率等因素的影响,还测试了AIFO与PIFO之间的差距等等,实验结果表明,AIFO只需呀一个单队列就可以很接近PIFO,而不像SP-PIFO需要严格的优先级队列等等才能实现,因此认为AIFO整体表现较好,资源消耗低。

总结

实际上,这篇论文主要解决的问题就是如何进行数据包的调度,之前提出了PIFO方法,但是这个方法实现起来比较困难,于是后来有了SP-PIFO,但是SP-PIFO需要严格的优先级队列来控制,本文提出了新的方法,也就是AIFO,AIFO设置了一个Admission Control,用于控制数据包能否进入队列,只要判断了能够进入队列,对于队列的调度采用的是最简单的FIFO先入先出。实际上就是将控制移到了入队之前,PIFO的思想是在缓冲队列中调度,根据rank调整数据包在缓冲区队列中的位置,AIFO将其放在入队之前,更好实现。另外,AIFO将方法分为了时间和空间两部分来考虑,进行互补,保证入对数据包的准确性,使AIFO更接近PIFO,实现更好的效果。

标签:packet,AIFO,Sigcomm,队列,PIFO,Packet,Queue,rank,数据包
来源: https://blog.csdn.net/weixin_44260459/article/details/121008036