本发明涉及一种分层的加权轮询调度装置及方法,属于通信技术领域。
背景技术:
随着互联网与物联网新功能、新场景的增加,各种网络应用广泛兴起,交换网络需要能够提供多优先级业务的服务,传统的负载均衡交换第一级交换单元采用输入排队(iq,inputoueued)结构,通常认为队列可以是无限长度,这与实际情况不符,当输入队列为有限长度时,将出现丢包现象,这一问题在多优先级业务调度时,更为明显,传统的轮询调度难以提供优先级区分,如rr(round-robin)算法;若始终优先调度高优先级业务,会造成低优先级业务难以及时获得服务,如err(exhaustiveround-robin)算法;而lqf(longestqueuefirst)算法没有考虑到不同优先级业务之间的影响,会造成大流量的低优先级业务获得比高优先级的业务更优的服务,且复杂度更高;当某个优先级的业务量较大时,如何尽快调度这个优先级的业务以减少丢包,同时不影响其它优先级的服务,尤其是不侵占高优先级业务的权益,是需要解决的问题。
队列调度技术广泛应用于路由器和交换机中,它按照一定的服务规则对交换节点的不同输入业务流分别进行调度和服务,使所有的输入业务流能按预定的方式共享交换节点的输出链路带宽,是实现网络服务质量qos保证和提高网络性能的一项关键技术。
目前现有的队列调度方法中,主要包括轮询调度(rr),加权轮询调度(wrr),尽力轮询调度(err),最长队列优先调度(lqf)等;其中:
rr方法,该方法以公平的方式轮询所有的队列,用户公平使用共享资源,无法体现出不同优先级队列之间服务等级的不同;
wrr方法,根据每个队列的优先级,为每个队列分配不同的权值,使得高优先级的队列能够得到更好的服务,避免低优先级队列占用过多的网络带宽;但是wrr中各队列的权重值是固定分配的,无法随着业务到达情况动态调整,因此可能会导致链路利用率较低的情况,灵活性较差。
err方法,始终优先调度高优先级队列,会造成低优先级队列业务难以获得及时的服务;lqf方法,没有考虑到不同优先级业务之间的影响,会造成大量低优先级的业务获得比高优先级业务更优的服务,且复杂度更高;以上现有的队列调度方法,均存在占用输出链路带宽较多、链路利用率较低的缺点,这些缺点直接导致了对网络硬件设施的高要求,加大了网络建设成本,严重限制了网络服务质量网络性能的提升。
本发明根据voq(虚拟输出队列)的形式来缓存不同优先级的分组;权重系数可按照各队列统计到的实时业务到达速率或者各优先级业务的指定服务带宽计算得出;按照优先级从高到低的顺序轮询不同优先级的队列,并且根据分配到的权重将队列中相应比例的分组调度输出。
当各优先级业务分布均匀时,基于权重系数轮询调度各优先级业务;若出现某个优先级业务其积压的分组数超过一定数值(比如,积压分组占总积压数一半以上时),将优先调度不低于该优先级的业务;即首先对于最高优先级到该优先级的业务进行基于权重的轮询调度,当这些业务的权重系数为0后,再对低优先级业务进行基于权重的轮询调度。
技术实现要素:
本发明提出的是一种分层的加权轮询调度装置及方法,其目的旨在根据各优先级的业务量和业务分布的特点,及时调整权重和调度顺序,在降低丢包率的同时满足不同优先级队列的服务要求,降低网络建设成本,提高网络性能和网络服务质量。
本发明的技术解决方案:一种分层的加权轮询调度装置,其结构包括先入先出缓存队列模块、流量统计模块、权重管理模块、调度控制模块;其中,权重管理模块包括权重系数计算子模块、权重系数存储与更新子模块。
分层的加权轮询调度方法,具体包括以下步骤:
1)计算每个队列的权重系数;
2)选择轮询调度方案;
3)基于权重系数的轮询调度;
4)基于权重系数的分层轮询调度。
本发明的优点:
1)本发明的调度方法通过统计各优先级队列的积压分组数目,计算得出调度的权重系数,然后采用优先级由高到低轮询的方式对队列进行调度,能够根据各优先级业务量实时调整调度权重;
2)本发明在某个优先级业务积压分组数超过一定值时调整调度顺序,增加该优先级业务被集中调度的机会,且不影响优先级高于该优先级的业务,使得本发明能够适应不同的业务分布和业务到达速率,能够保证服务质量,降低高优先级业务的丢包率;
3)降低了网络建设成本,提高网络性能和网络服务质量,能有效避免网络堵塞和数据丢失。
附图说明
附图1是本发明的方框示意图。
附图2是实施例1的实现流程图。
附图3是本发明实施例2的队列调度示意图。
附图4是本发明实施例3的队列调度示意图。
具体实施方式
对照附图1,一种分层的加权轮询调度装置,其结构包括先入先出缓存队列模块、流量统计模块、权重管理模块、调度控制模块;其中,权重管理模块包括权重系数计算子模块、权重系数存储与更新子模块。
所述先入先出缓存队列模块,用于为每个业务流维护一个先入先出(fifo)队列,缓存各业务流到达的分组。
所述流量统计模块用于在每一个调度周期开始时,通过计数器统计各业务流的分组到达和分组积压情况,对各个队列到达的实时业务量或者积压分组量进行计数。
所述权重管理模块包含两个子模块:权重系数计算子模块、权重系数存储与更新子模块;其中,权重系数计算子模块用于在每一个调度周期开始时,通过各队列统计到的实时业务到达速率和分组积压情况计算相应的权重系数;权重系数存储与更新子模块用于存储为每个先入先出队列分配的权重系数、并根据调度进程实时更新相应队列的权重系数。
权重管理模块,在每个调度周期内,接收流量统计模块产生的数据,计算权重系数值;以存储的权重系数协助调度控制模块制定调度决策;根据调度结果更新权重系数计数器。
所述权重系数计算子模块依据流量统计模块的统计结果,综合各优先级分配带宽,计算各优先级的服务权重系数,权重系数反映了一个队列在一个调度周期内获得调度的比例,所述权重系数指被服务的分组数。
所述权重系数存储与更新子模块将权重系数计算子模块计算得到的系数存储进计数器,并在每次调度后,更新相应调度器的值,一旦权重系数为0,表明该队列在本调度周期内的服务已经完成。
所述调度控制模块,主要功能是根据权重系数的分布情况判断是否启用分层的加权轮询调度、按照权重系数从各队列中调度出相应数量的分组。
采用分层的加权轮询调度方法时,根据权重系数存储与更新子模块所存储的权重系数分布,获得分层调度的边界优先级j,首先对优先级不低于j的队列,按照优先级从高到低进行加权轮询调度;在上述队列的权重系数计数器都为0之后,再对优先级低于j的队列按照优先级从高到低进行加权轮询调度,直到完成一个调度周期。
采用未分层的加权轮询调度方法时,根据权重系数存储与更新子模块所存储的权重系数,对每个队列按照优先级从高到低进行加权轮询调度,直到完成一个调度周期。
分层的加权轮询调度方法,具体包括以下步骤:
1)计算每个队列的权重系数;
2)选择轮询调度方案;
3)基于权重系数的轮询调度;
4)基于权重系数的分层轮询调度。
所述步骤1)计算每个队列的权重系数:
1a)设共有p个优先级,则每个优先级对应一个队列,则一对输入输出流共有p个队列;
1b)设一个调度周期为n个时隙,令优先级为i的分组进入队列qi,每n个时隙统计该队列积压的分组数目为ni;
1c)计算p个队列中积压分组的总数目为nall,即
1d)计算各优先级的权重系数wi,
1e)每个优先级队列qi维护一个权重系数计数器dci,每个调度周期初始时dci=wi。
所述步骤2)选择轮询调度方案:
若存在队列qj,其积压分组数为nj,使得
所述步骤3)基于权重系数的轮询调度:
3a)初始化队列编号i=0,本周期内已获调度的分组数cnt=0;
3b)轮询优先级队列qi,根据权重系数计数器dci的值决定队首分组是否出队;
若队列qi的权重系数dci不为0,则将该队列中的分组调度输出,相应的权重系数dci减1;更新该周期内已获得调度的分组数:cnt=cnt+1,执行步骤3c;
若队列qi的权重系数dci=0,执行步骤3c;
3c)若cnt=n,则表明当前所有队列调度都已经结束;
若cnt<n,i<p-1,将当前的队列编号i加1,得到下一个优先级队列的编号,执行3b;
若cnt<n,i=p-1,将当前的队列编号i设置为0,执行3b。
所述步骤4)基于权重系数的分层轮询调度:
4a)初始化队列编号i=0,本周期内已获调度的分组数cnt=0;
4b)轮询优先级队列qi,根据权重系数计数器dci的值决定该队列的队首分组是否出队;
若队列qi的权重系数dci不为0,则将该队列中的分组调度输出,相应的权重系数dci减1;更新该周期内已获得调度的分组数:cnt=cnt+1,执行步骤4c;
若队列qi的权重系数dci=0,执行步骤4c;
4c)将i与步骤2)中标记的分层调度边界优先级j进行比较,若i=j,则i=0;若i<j,则i=i+1;
若dci=0,i=0,1,…,j,执行步骤4d;否则执行步骤4b;
4d)令i=j+1,若i<p,则执行4e,则表明当前所有队列调度已经结束;
4e)轮询优先级队列qi,根据dci的值决定队列是否出队;
若队列qi的权重系数dci不为0,则将该队列中的分组调度输出,相应的权重系数dci减1;更新该周期内已出队分组的数目:cnt=cnt+1,执行步骤4f;
若队列qi的权重系数dci=0,执行步骤4f;
4f)若cnt=n,则表明该周期内所有队列调度任务都已经结束;
若cnt<n,i<p-1,将当前的队列编号i加1,得到下一个优先级队列的编号,执行步骤4e;
若cnt<n,i=p-1,将当前的队列编号i设置为0,执行步骤4e。
实施例1
参照附图2,分层的加权轮询调度方法,其实现步骤如下:
步骤1,为每个队列分配权重系数dci:
1a)设共有p个优先级,则每个优先级对应一个队列,共有p个子队列;
1b)令一个调度周期为n个时隙或分组,优先级为i的队列为qi,在每n个时隙统计该队列积压的分组数目为ni;
1c)计算p个子队列中积压分组的总数目为nall,即
1d)计算各优先级的权重系数wi,
1e)将各优先级的权重系数存储在权重系数存储模块,权重系数存储模块为每个优先级队列qi维护一个权重系数计数器dci,每个调度周期初始时dci=wi。
步骤2,通过调度控制模块来确定调度模式:
若存在队列qj,其积压分组数为nj,使得
步骤3,将各优先级队列中的分组进行基于权重系数的调度输出,完成一个调度周期:
3a)初始化队列编号i=0,本周期内已获调度的分组数cnt=0;
3b)轮询优先级队列qi,根据权重系数计数器dci的值决定队首分组是否出队;
若队列qi的权重系数dci不为0,则将该队列中的分组调度输出,相应的权重系数dci减1;更新该周期内已获得调度的分组数:cnt=cnt+1,执行步骤3c;
若队列qi的权重系数dci=0,执行步骤3c;
3c)若cnt=n,则表明当前所有队列调度都已经结束;
若cnt<n,i<p-1,将当前的队列编号i加1,得到下一个优先级队列的编号,执行3b;
若cnt<n,i=p-1,将当前的队列编号i设置为0,执行3b;
步骤4,将各优先级队列中的分组进行基于权重系数的分层调度输出,完成一个调度周期:
4a)初始化队列编号i=0,本周期内已获调度的分组数cnt=0;
4b)轮询优先级队列qi,根据权重系数计数器dci的值决定该队列的队首分组是否出队;
若队列qi的权重系数dci不为0,则将该队列中的分组调度输出,相应的权重系数dci减1;更新该周期内已获得调度的分组数:cnt=cnt+1,执行步骤4c;
若队列qi的权重系数dci=0,执行步骤4c;
4c)将i与分层调度边界优先级j进行比较,若i=j,则i=0;若i<j,则i=i+1;
进一步判断若dci=0,i=0,1,…,j,执行步骤4d;否则执行步骤4b;
4d)令i=j+1,若i<p,则执行4e,则表明当前所有队列调度已经结束;
4e)轮询优先级队列qi,根据dci的值决定队列是否出队;
若队列qi的权重系数dci不为0,则将该队列中的分组调度输出,相应的权重系数dci减1;更新该周期内已出队分组的数目:cnt=cnt+1,执行步骤4f;
若队列qi的权重系数dci=0,执行步骤4f;
4f)若cnt=n,则表明该周期内所有队列调度任务都已经结束;
若cnt<n,i<p-1,将当前的队列编号i加1,得到下一个优先级队列的编号,执行4e;
若cnt<n,i=p-1,将当前的队列编号i设置为0,执行4e。
实施例2
参照附图3,在本实施例中,系统提供的优先级共有4种,为每个优先级业务维护一个fifo队列,调度周期n=8,优先级0最高,优先级1次之,以此类推;本实施例中,第0优先级队列中的积压分组数为4,第1优先级队列的积压分组数为8,第2优先级队列的积压分组数为2,第3优先级队列的积压分组数为2,具体步骤如下:
步骤1,为每个队列分配权重系数dci:
通过统计得到各优先级队列中的积压分组数,根据权重系数计算方法得到各优先级业务的权重系数分别为:w0=2,w1=4,w2=1,w3=1;获得的权重系数赋值给权重系数计数器,dc0=2,dc1=4,dc2=1,dc3=1。
步骤2,通过调度控制模块选择合适的调度模式:
由业务统计模块得到各队列积压的分组数目分别为4、8、2、2,优先级为1的队列积压分组数n1≥nall/2,所以将优先级1标记为分层调度的边界优先级,执行分层的加权轮询调度,首先对优先级不低于优先级1的业务进行基于权重的轮询调度,随后再对优先级低于优先级1的业务进行基于权重的轮询调度;
步骤3,将各优先级队列中的分组进行基于权重系数的集中调度输出,完成一个调度周期:由于dc0>0,dc1>0,可进行轮询调度操作;
首先令cnt=0,轮询优先级为0的队列,其权重系数计数器dc0=2,所以可以进行出队操作,然后其权重系数计数器减1,即dc0=1,同时更新已出队分组数:cnt=1;
接下来,轮询到优先级为1的队列,其权重系数计数器dc1=4,可以进行出队操作,然后其权重系数计数器减1,即dc1=3,同时更新已出队分组数:cnt=2;
由于此时dc0>0,dc1>0,继续进行轮询操作;
轮询优先级为0的队列,此时权重系数计数器dc0=1,进行出队操作,然后其权重系数计数器减1,即dc0=0,同时更新已出队分组数:cnt=3;
接下来,轮询优先级为1的队列,其权重系数计数器dc1=3,进行出队操作,将其权重系数计数器减1,即dc1=2,同时更新已出队分组数:cnt=4;
由于dc1>0,继续进行轮询操作;
优先级为0的队列权重系数计数器为0,该队列不做分组调度操作;
接下来,轮询优先级为1的队列,其权重系数计数器dc1=2,进行出队操作,将其权重系数计数器减1,即dc1=1,同时更新已出队分组数:cnt=5;
由于dc1>0,接着进行轮询操作;
优先级为0的队列权重系数计数器为0,该队列不做分组调度操作;
接下来,轮询优先级为1的队列,其权重系数计数器dc1=1,进行出队操作,将其权重系数计数器减1,即dc1=0,同时更新已出队分组数:cnt=6;
至此,dc0=dc1=0,开始服务优先级为2和3的队列;
轮询优先级为2的队列,其权重系数计数器dc2=1,进行出队操作,将其权重系数计数器减1,即dc2=0,同时更新已出队分组数:cnt=7;
接着轮询优先级为3的队列,其权重系数计数器dc3=1,可以进行出队操作,将其权重系数计数器减1,即dc3=0,同时更新已出队分组数:cnt=8;
由于cnt=8=n,表明该调度周期需要服务的分组已完成调度输出。
实施例3
参照附图4,在本实施例中,系统提供的优先级共有4种,为每个优先级业务维护一个fifo队列,优先级0最高,优先级1次之,以此类推;调度周期n=8,本实施例中,第0优先级队列中的积压分组数为2,第1优先级队列的积压分组数为6,第2优先级队列的积压分组数为6,第3优先级队列的积压分组数为2,具体步骤如下:
步骤1,为每个队列分配权重系数dci:
通过统计得到各优先级队列中的积压分组数,根据权重系数计算方法得到各优先级业务的权重系数分别为:w0=1,w1=3,w2=3,w3=1;获得的权重系数赋值给权重系数计数器,dc0=1,dc1=3,dc2=3,dc3=1。
步骤2,通过调度控制模块选择合适的调度模式:
由业务统计模块得到各队列积压的分组数目分别为2、6、6、2,没有队列加压分组数大于等于总积压分组数的一半以上,表明暂时没有大流量业务急需调度,选择执行加权轮询调度。
步骤3,将各优先级队列中的分组进行基于权重系数的轮询调度输出,完成一个调度周期:
初始化令cnt=0,首先轮询优先级为0的队列,由于其权重系数大于0,因此进行队首分组出队操作,相应队列的权重系数计数器减1,dc0=0,同时更新已出队分组数:cnt=1;
轮询到优先级为1的队列,其权重系数计数器值为3,进行队首分组出队操作,相应队列的权重系数计数器减1,dc1=2,同时更新已出队分组数:cnt=2;
轮询到优先级为2的队列,其权重系数计数器值为3,进行队首分组出队操作,相应队列的权重系数计数器减1,dc2=2,同时更新已出队分组数:cnt=3;
轮询到优先级为3的队列,其权重系数计数器值为1,进行队首分组出队操作,相应队列的权重系数计数器减1,dc3=0,同时更新已出队分组数:cnt=4;
截至此时cnt<n,所以继续从优先级0业务开始轮询调度;
优先级为0的队列权重系数计数器值为0,该队列不做分组调度操作;
优先级为1的队列权重系数计数器值为2,调度队首分组,更新权重系数计数器值,dc1=1,同时,更新已出队分组数:cnt=5;
优先级为2的队列权重系数计数器值为2,调度队首分组,更新权重系数计数器值,dc2=1,同时,更新已出队分组数:cnt=6;
优先级为3的队列权重系数计数器值为0,该队列不做分组调度操作;
截至此时cnt<n,所以继续从优先级0业务开始轮询调度;
优先级为0的队列权重系数计数器值为0,该队列不做分组调度操作;
优先级为1的队列权重系数计数器为1,调度队首分组,更新权重系数计数器值,dc1=0,同时,更新已出队分组数:cnt=7;
优先级为2的队列权重系数计数器为1,调度队首分组,更新权重系数计数器值,dc2=0,同时,更新已出队分组数:cnt=8;
优先级为3的队列权重系数计数器值为0,该队列不做分组调度操作;
此时,cnt=8,该调度周期结束。