上自然也就不会产生这个流的数据包。反之,当这个高优先级的流的数据包出现时,服务器D可以确认此流在其接收方处也有足够高的优先级,所以是时候通知服务器B“传输中断”了。为了发出通知,发送者需要再多发一个原来在传输的流的数据包,并且这个包被打上标记以告知接收方优先级不一致事件已经发生。
[0027]b)流的温度:就像存储系统用温度来表示最近使用过的文件块一样,流的温度让接收方感知到最近传输过的流。一个热的流表示接收方最近收到过来自这个流的数据包,也说明这个流在其发送者那有足够的优先级被发送出来。一个冷的流表示接收方有一阵子没有收到来自这个流的数据包了,也说明这个流在其发送者处的优先级太低,不足以被发送出来。最热的流就是刚刚传输过的流,有最大的可能性激活后收到发送方的响应。我们将流的温度的取值范围设定为[0:7]。每次收到某个流的数据包,这个流的温度会被刷新为7度。每隔lOOus,流表中所有流的温度下降I度。在前面的基本假设中,我们已经固定了TCP超时时间为500us,因此每隔500us,TCP超时事件会产生一个数据包。如果这个流在发送方有足够的优先级,这个数据包会被发送出来到达接收方,并在其温度降为O度之前就把其温度刷新回7度。如果这个流在发送者处的优先级不够,那么这个流的超时事件所产生的包也无法发出,他在接收方处的温度最终会降为O度,接收方即可知道即使激活这个流也不能收到其发送方的响应。注意,当接收方收到发送者发送来的标记着优先级不一致事件的数据包时,相应的流会马上被冰冻(温度设为O)。
[0028]c)心跳包:从上面的描述中我们可以看出,其实TCP超时事件产生的数据包在SFS中实际上被当成心跳包,用来告诉接收方各个暂停住的流在其发送者处是否是活动的。这就好像hadoop系统里面Master通过接收到的心跳包来了解当前各个Worker的状态一样。有一点区别在于,TCP超时事件产生的数据包带着负载。为了节省带宽,我们让发送者砍掉心跳包中的负载,只保留包头。在pFabr i c中也有相似的设计,使用空包来探测网络的状态。注意,心跳包不会触发发送方通知机制,并且它仍然是被发送者调度着的。例如,如果一个流的优先级不够,那么它的心跳包无法被发送出来。如果它经历了多次超时事件产生了多个心跳包,发送者只为其保留其中序号最大的一个心跳包,其他的心跳包被直接丢弃以节省带宽。
[0029]d)候选窗口开启:接收方使用这个机制来激活最热的流以填充链路。在前面提到过网卡只能从流窗口中的表项中抽取ACK包。在这里,我们修改这个设定,现在网卡能从两个地方抽取ACK包,也就是流窗口和候选窗口。通常情况下,候选窗口是关闭的,因为流窗口中的流就足够填充链路了。而在优先级不一致事件发生时,流窗口中的流被中断了,这时,接收方要开启候选窗口来激活流以填充链路。候选窗口的开启由网卡的抽取动作触发。每次网卡抽取ACK包时,接收方检查当前流是否被冰冻(温度为O)。如果发现一个冰冻的流并且当前候选窗口未开启,候选窗口会被开启来激活当前最热的流。有时候候选窗口中的流也会遭遇优先级不一致事件而被冰冻,这时网卡的抽取动作会再次触发候选窗口开启事件,接收方再次找到当前最热的流并开启候选窗口来激活它。图7(a)_(d)展示了候选窗口的开启。在图7(a)中,接收方的流表中有五个来自不同发送者的TCP连接。其中流A处于激活状态,其数据包源源不断地到来,将其温度刷新为7度。其他流B-E被暂停住。在图7(b)中,随着时间的推移,所有流的温度都下降了一度。在图7(c)中,流A遭遇了优先级不一致事件,其温度变为O度。接收方在流B-E中找到温度最高的流E,并开启一个候选窗口来激活它(释放其ACK包)。在图7(d)中,接收方收到了刚才激活的流E的数据包,其温度被刷新为7度。图7(e)(f)展示了候选窗口的再次开启。在图7(e)中,流E也遭遇了优先级不一致事件,其温度变为O度。接收方在流B-D中找到了当前温度最高的流D,并为其打开了候选窗口。在图7(f)中,接收方收到了流D的发送方发来的数据包,其温度被刷新为7度。
[0030]e)候选窗口移动:接收方使用这个机制来移动候选窗口,将最热流优先策略转变回最少剩余包的流优先策略。候选窗口的开启实质上米用的是最热流优先的策略,这种策略用来填充链路非常有效,但并不能最小化FCT。我们知道流表中的流是从左到右按优先级排列的,那么向左方移动候选窗口就意味着将策略转变回最少剩余包的流优先策略。候选窗口移动的机制是这样工作的。当候选窗口开启时,接收方每次收到不在候选窗口中的流的数据包,它就检查这个流当前的位置。如果这个流在候选窗口的左边,则接收方将候选窗口挪到这个流的位置来激活它。反之则候选窗口不会移动。图7(g)是一个候选窗口移动的示例。流C接收到了一个心跳包,其温度被刷新为7度。虽然流C和流D的温度一样,但流C的优先级高于流D,因此候选窗口从流D挪到了流C。流D被暂停,流C被激活。
[0031]f)候选窗口关闭:这个机制用来关闭候选窗口以暂停住流。当候选窗口开启时,若收到流窗口中的流的数据包,则意味着优先级不一致事件的结束。这时,接收方关闭候选窗口,重新激活流窗口中的流。图7(h)是候选窗口关闭的示例。流A收到了其发送方发来的数据包,温度变为7度,重新被激活,候选窗口关闭暂停住流C。
[0032]我们使用包级的模拟器NS2来测试SFS的性能。我们将SFS与两种方案比较:DCTCP和PFabric13DCTCP的参数设置如下:交换机的显示拥塞通知的阀值设为15个包;TCP超时时间固定为lOOOuswFabric设置如下:为pFabric定制的TCP在发送完SYN包后,不需要接收方返回第一个ACK就直接开始发送数据包;TCP超时时间固定为500us AFS设置如下:TCP的拥塞窗口固定为BDP(8个包),超时时间固定为500us来产生心跳包。
[0033]测试所用的拓扑结构为8口交换机组成的收敛比为I比I的FatTree网络。此网络中有128台服务器,16台核心层交换机。所有链路的带宽和传播时延分别为IGbps和lus。对1500B的数据包来说,其在Pod之间的RTT(Round Trip Time)为86us,其在Pod内的RTT为28.6us。对于SYN包来说,其在Pod之间的RTT为16us,其在Pod内的RTT为4.6us。
[0034]我们使用符合真实数据中心网络流量分布的网页搜索和数据挖掘负荷来产生流量。在网页搜索负荷中,超过95%的流量来自30%的大小在1-20MB的流。在数据挖掘负荷中,超过95%的流量来大于15MB的3.6%的流,超过80%的流都小于10KB。我们用这两个负荷来决定在以上FatTree结构中产生流的大小。流的源和目的是随机选取的服务器,流的到来时间符合泊松过程。我们调整新流产生的速率来产生不同的负载情况以全面地测试SFS的性能。
[0035]图8是SFS与DCTCP和pFabric在FatTree中采用网页搜索负荷时的FCT。注意图中每个流的FCT已经做了归一化处理(实测完成时间/理论完成时间)。我们可以看到SFS表现得比DCTCP好,彳艮接近于pFabric。从图8(a) (b)可以看到,与DCTCP相比,SFS的小流的平均FCT减少最多63%,最慢的小流的完成速度快3到4倍。不出意料,SFS无法超越pFabric,pFabric的小流的平均FCT比SFS快1.3倍,最慢的小流的FCT比SFS快1.6倍。原因主要有两方面。首先,为pFabric定制的TCP无需等待接收方返回第一个ACK就可以开始发送数据包,这样很多小于8个包的流可以在一个RTT内完成。而在SFS中,TCP要等接收方返回第一个