|
本帖最后由 chq00123 于 2013-10-30 08:54 编辑
一楼是程序设计思路,,二楼是解释程序原理
声明:之前,我提过,优先转发机制和公平转发机制之间,判定切换的方法,存在致命的技术性错误。
具体如下:当流量负载大的时候,10*N≥60%*M,10*N≥40%*M,是必然成立的,那么这时候两种机制运行的时间的一样的,也就是两种机制发送的流量,是各占总带宽的50%,没有达到预期的效果。所以这种判定方法是错误的。
为了满足不同的策略需求,要实现对2种机制的通过的流量来进行限制,可以用其他的方法来实现,具体的方法就不说。方法比较简单(比之前的10*N≥60%*M还要简单),也比较有效。
其实对这种优先转发的思路,给我最大启发的是磊科!(虽然磊科的也没有开源,但可以从他的参数的设置等方面做猜测)~这种方法跟磊科的很类似,同样的,跟X盟也很类似。(X盟跟磊科的QOS是出自同宗,只是后期大家的优化不一样)。但是磊科(X盟)的要做预留(因为识别不准确,而这种方法不需要预留!~不需要预留的前提是L7识别精准!~
下面的2个图,是我之前发过的,第一张是 优先转发的程序设计图,第二张,是在这种优先转发机制下,要解决的2个问题。今天开个帖子,用我的思路来解决第一个问题:如何解决高优先级,一直抢占带宽,导致低优先级饿死的情况。(这种情况比较常见于视频电影的优先级设置比下载高,而且,视频电影,通常会导致带宽占用率达到100%,导致下载等比他低优先的应用饿死。)
为了解决这个问题,我的思路是这样的,加入,公平转发机制。什么是公平转发?顾名思义,就是对5个优先级缓存的数据,进行公平转发,怎么实现呢?类似与优先转发,同样先判断最高优先级的标志位,有数据,就转发一个包,没有数据,就直接判断下个优先级的标志位,以此类推,完成一轮,就从头开始循环。这样,就可以确保,每循环一轮,只要各个优先级的缓存内有数据,就都会被转发一个数据包。
好了。。新的问题来了,,什么时候用公平转发,什么时候用优先转发?
为了解决这个问题,我引入一个参数,暂且命名为 优先系数。以百分比的形式存在。(在UI界面设个对话窗口,网管可以根据自己的需求在1%~100%之间调节)。 这个优先系数的作用是什么呢?他是以网络负载和机制的流量,来对上面的2种转发机制进行切换轮调的。说的这么玄!~要怎么实现呢? 请往下看!~~
优先系数,的百分比,是谁的百分比? 是外网总带宽的!~具体实现的方法如下:
外网总带宽为M KB/S。优先系数为60%
在公平转发对5个优先级的数据都转发一个包之后,开始第二轮循环之前,加入几个指令,用来实现统计5个包的数据大小,N(量)(再循环的话再累加,直到清零)
同理在优先转发程序,每转发出去一个数据包,对数据包大小N(量)统计。(这个N跟上面的N,是同一个,因为,N清零,是在2种转发机制切换的时候)
整个程序,还需要加入一个硬件时间计数器,用来触发中断,比如,设置为100ms,就是100ms执行一次中断,中断子程序的作用是什么呢?,,计算流量!就是计算N/100ms,并转化为秒,,既10*N,这就是,网络中的流量。
在公平转发对5个优先级的数据都转发一个包之后统计完5个数据包大小之后,开始第二轮循环之前,
把10*N跟60%*M进行比较,10*N≥60%*M的话,就把N清零,跳转到优先转发程序执行,10*N<60%*M的话,就继续循环公平转发程序。
同样的在优先转发程序,每转发出去一个数据包,对数据包大小N(量)统计完的后面,把10*N跟(1-60%)*M进行比较
10*N≥(1-60%)*M的话,就把N清零,跳转到公平转发程序执行,10*N<(1-60%)*M的话。就继续循环执行优先转发程序。
更正:刚才吃饭的时候,想到个BUG,那就是,需要在中断子程序中加入对N的清零操作,否则的话,N一直累加下去,就必然会出现10*N>60%*M的情况。具体更改的方法是:把10*N跟60%*M(或40%*M)的比较放在中断子程序中,并设置个判断位P,把比较的结果,存入P(例如大于等于,就把P置1,小于P就置0)并把N清零。转发程序中,就不需要做比较了,只要判断P=1还是0,就可以决定,是切换状态,还是继续循环了。同时,为了帮中断子程序判断,到底是执行10*N跟60%*M比较还是跟40%*M比较,在2个转发程序开头再加入,一个状态标志位Z,(Z置1为公平,Z置0为优先),中断子程序根据Z来选择10*N跟60%*M比较还是跟40%*M比较了。
再次更正:睡了一觉,起来再次发现个问题,特此更正。
BUG就是在高负载情况下,执行优先程序的时候,过了限定值,可以跳转回公平机制,来保障低优先级不被饿死。但是在优先机制中,低负载的情况下,却无法跳回了。。虽然低负载用优先机制,同样可以,但是为了防止一些难以预料的后果,还是决定要把他调回公平机制。具体的方法就是先对高负载判断,要是10*N还没超出40%*M,在把10*N与60%*M进行比较,要是10*N<60%*M,(比较方法同黑色更正,因为中断之后的N,已经被清零了,所以比较都要放到中断子程序内),那么也调回公平机制。
哎。久不摸编程了。一个小程序都七改八改的!~
|
|