深入理解RouterOS v6.0对Queue流控改动
为了提升Queue的处理性能,RouterOS v6.0对Queue流控进行了大改动,即将simple queue 从queue tree中独立出来,我们需要关心的是simple queue和queue tree在分离后,实际网络环境中的处理流程,由于v6版本对QoS的重新设计,从v3,v4,v5等版本如果直接升级到v6,会导致simple queue和queue tree的一些参数将无法识别,因此从v6之前的版本升级,涉及queue配置时需谨慎,可能会重新配置queue参数。
RouterOS v6.0前
看看在v6.0之前的链表结构图,可以看到global-in属于prerouting链表,global-out属于postrouting,但v6.0重新设计后被取消。
再看看,下面的v6.0前的流程图,global-in包含在prerouting中,global-in会处理通过路由(forward)和进入路由器(input)的数据,对于处理进入路由器(input)的数据被笼统的放在Prerouting链表中,造成Prerouting中的Queue模块究竟负责处理进入路由器(input)的数据,还是处理经过路由器(forward)的数据,并不明确。
global-out会在Postrouting中,再一次处理通过路由器(forward)后的数据,Queue队列会把一个IP数据重复处理2次。
如下图,我们可以看到,当数据流通过路由器的in-interface进入后,在从out-interface转发出去,会被Global-in和Global-out先后处理两次,造成CPU过多的开销。
RouterOS v6.0后
v6.0后的数据流,将global-in和global-out合并为global,并将prerouting的queue位置调整到input链表:
在RouterOS新的处理架构上Queue tree和simple queue会出现在Input和Postrouting两个链表中,且Queue tree会首先获得IP数据流,处理后再给Simple Queue,但他们之间互相独立没有联系。
这样simple queue完全从queue tree分离,对于simple queue和Global queue tree传输流量能被两者分别独立的获取到,这样提供了建立双重QoS策略方案。
如下图所见,通过路由器的流量不会再被Queue重复处理,因为Queue模块被放到了input链表,而不是Prerouting链表中,明确了是控制进入路由器的IP数据流,而通过路由器的IP数据流会被Postrouting链表处理,这样减少了CPU的开销,这就是为什么RouterOS v6的流控处理性能比v5版本的高
现在Queue模块被放置到了src-nat之后,对于PCQ策略在src-nat后更明确,能从connection tracking进行匹配。
可以总结以下:
- Simple queues现在完全从queue tree中分离,因此我们可以称他为另一个queue tree “global-2”。
- Simple queues你可以同样建立queue tree结构,父级和子级实现HTB,但仍然采用FIFO顺序执行的优先级处理。
- 虽然Queue tree和simple queue被分离,但IP数据流首先经过Queue tree被处理,接下来是simple queue,你可以只选择一个模块进行流控设置。