RouterOS PCQ流控原理
最近有人在问我PCQ流控问题,我重新把RouterOS入门到精通的PCQ内容整理了下,在RouterOS入门到精通v6.7版本发布,让内容更加清晰,希望大家从原理上理解PCQ流控。
PCQ(Per Connection Queue)算法比较简单,首先利用pcq-classifier(分类器)从相应数据流中区分一个sub-stream(子数据流),然后在每一个sub-stream上建立独立的FIFO队列长度和限制,再归类所有的sub-stream在一起,通过全局的Total FIFO队列作总体的流控。
如上图,假设有100个队列需要限制1000kbps下载时,可以使用1个PCQ队列和该PCQ队列包含的100子数队列进行处理。
pcq-classifier分类器
为更好的理解PCQ工作,需要了解分类器,用一组IP地址和端口到对应的地址和端口数据流的实例,这时将选择一种分类器,并通过PCQ将18个数据流从中分离到PCQ的子数据流中进行分类。
PCQ的目标和源地址分类原理图:
端口分类
Classifier分类器会根据参数设置来匹配连接会话中的源和目标IP或者是源和目标端口,如图的配置界面:
这样就把相同类型的数据归纳为一类,分配到一个sub-stream的FIFO队列中,然后所有的sub-stream子队列放到一个Total队列中进行总的流控。
PCQ动态分配
在局域网中因为网络带宽的问题,需要对网络流做控制,但又因为做固定的流量控制时,会造成空闲带宽的浪费,这里我们可以同RouterOS的PCQ算法完成对内部局域网流量的动态分配。
如上图,最大带宽Max-limit=12M,我们可以看到当PCQ-rate设定为4M的时候,小于等于3个用户在线时会分配固定4M带宽给每个用户,一旦大于3个用户时,PCQ会做带宽平均分配的操作,会对在线用户进行平均的带宽分配。(Max-limit就是Total FIFO全局队列带宽,PCQ-rate就是sub-stream的FIFO子队列带宽)
如上图,最大带宽Max-limit=12M,PCQ-rate设定为0,这样在一个用户的时候就可以得到全部带宽,之后是2个用户平均分配,依次类推。
注意:Max-limit总带宽是需要被设置的,这样PCQ能知道全局用户的带宽容量,并能为每个用户进行带宽分配。在实际使用中Max-limit最好略小于总带宽,例如总带宽是100Mbps,Max-limit设置为90-95Mbps预留一部分作为突发缓冲。
V5.0后,PCQ还允许使用不同大小的IPv4和IPv6子网或前缀作为sub-stream标识。之前它被锁定为一个/32子网的主机IP地址。这主要是为IPv6在运营商的角度考虑,因为运营商分配给客户的IPv6地址可能是/64前缀,也存在/128的主机IP地址
PCQ在v5.0rc4被重新编写,以优化在Mbps和pps的高吞吐量。有效的利用了新Linux内核特性,这使得PCQ更快,更少的资源需求。V5.0rc5后又加入了一项新特性,一旦新的数据流被激活,它将获得1/4的最高优先级,但如果rate设置为“0”,sub-stream子流将不具有获取1/4优先级特性(因为算法是“rate*1/4”,即“0”的1/4为“0”)
假设sub-stream的rate是10Mbps,那么当新的sub-stream请求流量时,将无限制地获得前2.5Mbps的流量。如果在使用类似Speedtest.net这样的带宽测试网站,得到的结果比预期更高。