具有入口控制的业务量管理的制作方法_4

文档序号:8225869阅读:来源:国知局
0116] 7.管道P有足够的信用供业务量类别TC发送分组。
[0117] 如果上述条件都满足,那么调度器253被配置为选择分组传输,并且可以从,例如 与子端口S、子端口S业务量类别(TC)、管道P、管道P业务量类别TC相关联的令牌桶中减 去合适的信用(即令牌)。
[0118] 在一个实施例中,信用单位涉及分组的长度。例如,信用单位可对应于一个字节, 即,多个分组的长度的最大公约数。因此,用于长度为n个字节的分组的传输的信用数量等 于(n+h),其中h是每个分组的成帧开销字节的数量。因此,分组信用对应于分组长度加上 每个分组的成帧开销字节的数量。例如,与以太网帧相关联的成帧开销字段包括长度为7 字节的前导码、长度为1字节的帧分隔符的开始(SFD)、长度为4字节的帧校验序列(FCS) 和长度为12个字节的帧间间隙(IFG),总共24个字节。帧校验序列(FCS)可被视为开销, 如果它不包含在mbuf?分组长度字段中。
[0119] 在一个实施例中,业务量整形可以在子端口和/或管道级别实现。例如,调度器模 块253可被配置为实现业务量整形。业务量整形是限制速度的形式,可以延迟一些分组,以 控制(即限制)来自,例如网络设备200的分组的传输速率。延迟的分组将存储在例如队 列250中。对于子端口和管道的业务量整形可以每个子端口地使用业务量整形(TS)令牌 桶以及每个管道地使用TS令牌桶来实现。每个TS令牌桶都可以使用,例如,饱和的计数器 来实现,该计数器被配置为维护可用信用的数量的计数。如果在TS令牌桶中的信用的数量 大于或等于分组中的字节的数量加上成帧开销字节,则分组被发送,否则,不发送。
[0120] 令牌桶可以由两个令牌桶参数来描述。第一桶参数,bucket^ate,对应于向该桶 添加信用的速率,单位为每秒信用数。第二桶参数,bucket_size,对应于可存储在桶中的信 用的最大数量,单位为信用个数。令牌桶可以通过将桶的内容(即可用信用的数量)设置 为预定义的值,例如零或半个bucket_size而进行初始化。所述桶可以被更新,例如,可以 向目前在桶中的信用添加信用,周期性地或按要求,至少部分地基于bucket^ate。如本文 所描述的,所述桶速率可以根据以下方式确定:bucket_rate= (tb_credits_per_period/ tb_peri〇d)*r,其中r是端口线速率(以每秒字节数为单位)。桶中的信用总数不得超过 bucket_size。因此,当桶已满时可用于添加到桶中的额外的信用将被丢弃。响应于分组调 度,信用将被消耗。对应于分组的字节数量加上用于分组的成帧开销的信用数量将从桶中 去除。只有当桶中有足够的信用在以发送完全分组(分组的字节和分组的成帧开销)时, 该分组才可以被发送)。
[0121] 可以利用永久数据结构来实现令牌桶。数据结构的元素可以被包括在图6的数据 结构600中,例如,包括在子端口表602和/或管道表604。元素可包括上次信用更新的时 间(tb_time)、以字节为单位计量的允许信用更新之间的时间段(tb_peri〇d)、以字节为单 位计量的每tb_period的信用限额(tb_credits_per_period)、以字节为单位计量的桶大 小(tb_size)和以字节为单位计量的目前在桶中的信用的数量(tb_credits)。如本文所 述,Tb_time可以以字节为单位进行计量,以促进信用消耗操作,因为当前的时间是以字节 为单位维护的。信用更新之间的实际时间间隔可以包括一个或多个tb_peri〇d。可用信用 的数量可以对应于实际时间间隔中的tb_period的数量乘以tb_credits_per_period。
[0122] 令牌桶操作一般包括初始化、信用更新和信用消耗(例如在分组调度时)。表1 包括示出了与本发明一致的示例性TS令牌桶的操作的伪代码。如本文所述,时间对应于当 前的处理器时间,以字节为单位。N_peri〇ds对应于自上次信用更新后时间间隔中的tb_ period的数量。
[0123]表1
[0124] /*lnitializationa*/
[0125] tb_credits = 0;or tb_credits = tb_size/2 :
[0126]/^creditupdate*/
[0127] n_periods = (time_tb_time)/tb_pefiod ;
[0128]tb_credits+ =n_periods氺tb_credits_per_period;
[0129] tb_credits = min(tb_credits,tb_size);
[0130]tb_time+ =n_periods氺tb_period;
[0131] /^credit consumption*/
[0132]pkt_credits=pktlen+frame-overhead;
[0133]if(tb_credits>=pkt_credits) {tb_credits=pkt_credits;}
[0134] 如表1所示,TS令牌桶可以初始化为零信用或与对应于半个令牌桶容量的多个信 用。令牌桶信用更新操作可以发生在出列操作期间,例如流程图900、950。例如,当选择管 道(即由管道磨机选择)时,启动信用更新操作。随后信用更新操作可以被配置为更新管 道的以及与管道相关联的子端口的各自的TS令牌桶信用。在操作910,在所述管道被选择 之后,并且在管道和子端口信用被使用之前(例如,在操作922),管道和子端口的TS令牌桶 信用被更新。
[0135] 在另一个例子中,每次发送分组时,都可以触发信用更新操作。在这个例子中,TS 令牌桶信用更新操作可以被配置为更新与分组相关联的子端口和管道的信用。将以计算效 率为代价实现相对较高的精度。
[0136] 在一个实施例中,自上次更新后经过至少一个完整的tb_period,TS令牌桶信用 可被更新。在本实施例中,精确度可与速度折衷。可以通过为tb_peri 〇d选择一个值以满 足吐_(^6(1;^8_口61'_口61';[0(1=1来实现全精度。当小于全精度可以接受时,可以通过将1:13_ credits_per_period设置为较大的值来实现改进的性能(例如增大的速度)。
[0137] 作为(S卩,响应于)分组调度(如操作922)的结果,可在出列操作期间执行TS令 牌桶信用消耗操作(如操作924)。如果可用的TS令牌桶信用(例如tb_credits)的数量 小于分组信用(即分组长度加上成帧开销),那么不能调度该分组以进行传输。如果可用的 TS令牌桶信用的数量大于或等于分组信用,则当调度传输时,可以从TS令牌桶中移除适当 数量的信用(例如对应于分组长度加上成帧开销,以字节为单位)。
[0138] 因此,信用逻辑被配置为在子端口和管道级别提供业务量整形,可以利用TS令牌 桶来实现该信用逻辑。与分组速率相关的SLA约束可以通过选择桶参数(例如bucket^ate 和/或桶的大小)来实现。
[0139] 在一个实施例中,可根据严格优先级,调度所选定的管道的业务量类别。例如,调 度器253可以被配置为实现严格优先级。业务量类别由以下各项来表征:例如,相关的数 据类型的对延迟、抖动、乱序交付等的敏感性。例如,语音数据对延迟和,或抖动是高敏感 的,而文件传输是最不敏感的。因此,对于具有4个业务量类别(TC0、TC1、TC2、TC3)的实 施例,语音数据可以对应于最高优先级业务量类别(TC0),而"尽力而为"文件传输可以对应 于最低优先级的业务量类别(TC3)。因此,严格优先级调度可以被配置为以升序选择业务 量类别,如TC0第一以及TC3最后。因此,对于具有四种业务量类别和每个业务量类别有四 个队列的配置,队列0, . . .,3可与TC0相关联,队列4, . . .,7与TC1相关联等。因此,队列 0, . . .,3将优先于队列4, . . .,7被调度,并且队列4, . . .,7优先于队列8, . . .,11被调度。
[0140] 管道和子端口级别的业务量类别未被业务量整形,在本上下文中,没有维护令牌 桶。可通过定期重新填充子端口业务量类别信用计数器和管道业务量类别信用计数器(每 一次为该子端口以及与该子端口相关联的管道调度分组时,都消耗其中的信用),实施子端 口和管道级别的业务量类别的分组传输率上限,。与业务量整形不同,业务量类别(TC)信 用计数器的更新是以固定时间间隔执行的,而TC信用更新设置TC信用计数器的值。类似 于业务量整形,TC信用计数器可在出列操期间进行更新,例如图9A中的操作910。
[0141] 可以利用永久性数据结构来实现每个TC信用计数器。数据结构的元素可以包括 tc_time、tc_period、tc_credits_per_pefiod和tc_credits〇Tc_time,以字节为单位,对 应于当前子端口和与当前子端口相关联的当前管道的业务量类别(TC)的下一次更新(即 配置为实现上限的重新填充)的时间。Tc_peri〇d对应于当前子端口和当前管道的TC的 连续两次更新之间的时间。Tc_pefiod-般比令牌桶的典型值tb_period大。例如,tc_ period可能比tb_period大几倍。
[0142] tc_credits_per_period对应于可以由当前TC在每个实施时间段tc_pefiod期间 消耗的TC信用数量的上限。tc_credits对应于被当前业务量类别在当前实施时间段的剩 余时间消耗的TC信用的当前上限。
[0143] 子端口 /管道业务量类别上限实施操作通常包括初始化、TC信用更新和TC信用 消耗(例如在分组调度时)。表2示出了包括与本发明一致的子端口 /管道业务量类别上 限实施操作的示例性伪代码。
[0144]表2
[0145] /*Initializationa*/
[0146] tc_credits = tc_credits_per_pefiod ;
[0147] tc_time = tc_period ;
[0148] /^creditupdate*/
[0149] if (time >= tc_time) {
[0150] tc_credits = tc_credits-per-period ;
[0151] tc_time = time+tc_period ;
[0152] }
[0153] /氺creditconsumption*/
[0154] pkt_credits = pkt_len+flame_overhead ;
[0155] if (tc_credits >= pkt_credits) {tc_credits- = pkt_credits ;}
[0156] 作为分组调度的结果,所选择的业务量类别上限可以减少对应于以字节为单位的 分组长度和报头长度的TC信用的数量。如果在TC的限制(即TC信用计数器)中,当前有 足够的TC信用以发送完整的分组信用(分组字节和分组成帧开销),则可以发送分组。
[0157] 因此,利用TS令牌桶在子端口和管道级别来实现业务量整形是可以的,并且使用 TC信用计数器在子端口和管道级别为每个业务量类别实施上限。当管道被例如管道磨机选 中时,在出列操作期间,信用可以被更新(即,添加),例如在图9A的操作910中。当分组被 选择(即调度)以进行传输时,信用可被消耗掉,例如在图9B的操作924中。
[0158] 在一个实施例中,可以根据轮叫技术来调度选定的业务量类别内的队列,例如在 图9A的操作913中。例如,调度器253可以被配置为实现轮叫技术。轮叫可在字节级、分 组的长度相关的字节级实现和/或可以进行加权。字节级轮叫可称为"公平排队",而字节 级加权轮叫可称为"加权公平排队"。所使用的技术至少部分地基于所选择的业务量类别的 队列的一个或多个特性,例如,在所选择的业务量类别中的所有队列是否为活动的(即不 为空)、队列是否为得到同等的权重和/或所有的分组是否相等(即具有相等的长度)。
[0159] 如果所选择的业务量类别中的所有队列是活动的并且被平均加权,且所有的分组 长度相等,则可以根据字节级轮叫来调度队列。例如,可以根据队列#1,i= (i+1) %n,选 择下一队列,其中的队列索引为i,%是模整数余数运算符,n是队列的数量。换句话说,四 个队列的顺序可以被选择为队列#〇、队列#1、#队列2、队列#3、队列#0等。
[0160] 如果所选择的业务量类别中的所有队列是活动的并且被平均加权,但不是所有的 分组长度都相等,则可以根据分组的长度相关的字节级轮叫来调度队列。在这种情况下,从 队列#i中消耗一个字节对应于正好消耗队列#i的一个令牌。以前从队列#i中消耗的令 牌的累积数,T(i)可以被维护。每次从队列#i中消耗分组时,T(i)都被更新为:T(i)+ = pkt_len。换句话说,所消耗的分组的以字节为单位的长度被添加到T(i)。然后可以选择下 一队列,下一所选择的队列是具有最小的T值的队列。
[0161] 如果所选择的业务量类别的所有队列都是活动的,但是不是所有的队列都被平均 加权,且不是所有的分组长度都相等,则可以根据分组的长度相关的字节级加权轮叫来调 度队列。,可以通过使用每个字节的成本(其对每个队列都是不同的),使分组的长度相关 的字节级加权轮叫对应于分组长度相关的字节级轮叫。有较低权重的队列的每字节成本较 高。如此,可以促进不同的队列的消耗之间的比较,以便选择下一队列。例如,w⑴可以被 定义为队列#i的权重,t(i)被定义为队列#i的每字节的令牌,并且等于队列#i的权重值 的倒数。例如,如果对于四个队列(即i= 〇,l,2,3),W[0. . . 3 = [1 :2 :4 :8],则t[0. . . 3] =[8 :4 :2 :1],并且如果W[0... 3] = [1 :4 :15 :20],则t[0... 3] = [60 :15 :4 :3]。在第 二个例子中,权重倒数已被缩放,使得所得到的令牌是整数。从队列#i消耗一个字节对应 于消耗队列#1的1(1)令牌。T(i)是先前从队列料所消耗的令牌的累加数。每次从队列 #i消耗分组时,T(i)被更新为:T(i) + =pkt_len*t(i)。换句话说,分组长度与每个字节的 令牌数的乘积被加到令牌的累积数。下个所选择的队列是带有最小的T值的队列。
[0162] 如果不是所选择的业务量类别的所有队列都是活动的,并且不是所有的队列都 被平均加权,且不是所有的分组长度都相等,则可以根据具有可变队列状态的分组的长度 相关的字节级加权轮叫来调度队列。可通过将非活动的队列的消耗设置为高值,使具有可 变队列状态的分组的长度相关的字节级加权轮叫对应于分组的长度相关的字节级加权轮 叫,,从而使非活动队列将不会被最小T逻辑选择。
[0163] 为了防止由于连续累加而导致T(即队列的令牌的累计数)溢出,对于所有的队 列,在每一个分组消耗之后,可以截断T(i)。例如,通过从T(i),i=0...n中减去最小值 T(例如 1000),T[0. ? ? 3] = [1000,1100,1200,1300]可以被截断为T[0. ? ? 3] = [0,100, 200,300]。
[0164] 具有可变队列状态的分组的长度相关的字节级加权轮叫假设在一组输入队列中 至少有一个活动队列。这种假设通常是被满足的,因为出列状态机被配置为选择活动队列。 队列#i的饱和掩码可以定义为:掩码(i)=(队列#i为激活状态)? 0 :〇xFFFFFFFF,其 中,?是条件运算符。因此,如果队列#1是活动的,则掩码(i)是零,并且如果队列#1是 不活动的,则掩码(i)是OxFFFFFFFF。类似于分组长度有关的字节级加权轮叫,w(i)对应 于队列#i的权重,t(i)对应于队列#i的每字节的令牌,并被定义为队列#i的权重的倒数, T(i)是以前从队列#i所消耗的令牌的累加数,并且下一队列是具有以前从队列#i所消耗 的令牌的最小累加数的队列。在从队列#1消耗分组之前,T(i)为掩码(i)的逐位或运算: T(i) | =掩码(i),并且T(i)的值被保存为T(j),其中j对应于队列索引。在从队列料消 耗分组之后,T(j)和T(i)被更新为:T(j) - =T(i),j辛i并且T(i) =pkt_len*t(i)。换 句话说,对于每个队列索引j,新的(即消耗分组后)T(j)被确定为旧的(即消耗分组之前) T(j)和刚从其消耗了分组的队列(即队列#i)之外的队列的当前的T(i)之间的差值。随 后,队列#i的令牌累加数(即T(i))是分组长度和队列#i的每字节的令牌数的乘积。利 用掩码(i)、T(j),并将T(j)更新为:T(j) - =T(i),j辛i被配置为对于不活动的队列,使 T(i)变成相对较大,以使非活动队列不被最小T逻辑选择。
[0165] 因此,轮叫可以用于选择下一队列。轮叫可以被加权并且可以在字节级和/或在 分组的长度相关的字节级实现。轮叫可以被配置为接纳非活动队列、至少一个队列的不等 的权重和/或不同长度的分组。响应于分组的调度(例如操作922),令牌T(i)的累积数量 可在出列操作中(例如操作924)被更新。
[0166] 在某些情况下,子端口业务量类别,如业务量类别X,可能被在子端口成员管道级 别被分配给业务量类别X比在父子端口级上分配给业务量类别X更多的带宽超额订购。子 端口业务量类别超额订购可以允许更高优先级的业务量类别没有使用的带宽被低优先级 业务量类别使用(即共享)。在配置时间,对于所选的业务量类别,子端口业务量类别超额 订购可以被启用,并且通常对于最低优先级的业务量类别(例如尽力而为业务量类别)启 用。对于特定子端口和业务量类别的超额订购的存在是管道和子端口级别配置的结果,而 不是由于业务量量负荷在运行时的动态演变而发生(如拥塞)。在操作中,当当前子端口的 对业务量类别X的总需求低时(即比子端口级别的业务量类别X的分配要小),则对于所有 成员管道,对业务量类别X的需求完全被满足。然而,当所有子端口成员管道的对业务量类 别X的累加需求超过了在子端口级别所配置的限制时,可能不能满足所有的管道的需求。
[0167] 在一个实施例中,与本发明相一致的系统和方法被配置成动态地管理子端口的业 务量类别的超额预订。例如,调度器模块253可以被配置为管理子端口业务量类别超额预 订。在本实施例中,对
当前第4页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1