ROS的队列类型(Queue Type)

操作路径:

1
/queue type

在这个子目录你可以创建自己的客户队列类型。之后,将可以在 /queue tree/queue simple/queue interface 使用了

PFIFO 及 BFIFO

这些队列规则是基于先进先出算法的(FIFO: First-In First-Out)。 PFIFO 和 BFIFO 的区别在于一个是以数据包为单位衡量的,而另一个是以字节为单位。其中只有一个叫做 pfifo-limit (bfifo-limit)的参数,它是用来定义一个 FIFO 队列可以容纳多少数据的。每一个不能排队(如果队列满了)的包都要被丢弃,队列长度过大会增加执行时间

如果你的连接不拥塞的话,建议使用 FIFO 队列规则。


SFQ:

随机公平排序( SFQ)不会一开始就对流量限制。它的主旨是当你的连接完全满的时候均衡业务流( TCP 会话或者 UDP 流)。 SFQ 的公平性是由散列法和 round-robin 算法保证的。散列算法把会话流分成一个有限数量的子队列。在sfq-perturb 时间之后散列算法改变并划分会话流为其他子队列。 Round-robin 算法把从每个子队列的pcq-allot 字节按照顺序出队列。

整个 SFQ 队列可以容纳 128 个数据包并且对这些包有 1024 个子队列可用。对拥挤的连接使用 SFQ 可以保证一些连接不至于空等待( starve)。


PCQ:

为了解决 SFQ 的不完美,每次连接排序 Per Connection Queuing (PCQ)便产生了。它是唯一一种能限流的无等级排序类型。它是一种去掉了随机特性的进化版 SFQ。 PCQ 也会根据 pcq-classifier 参数产生子队列。每个子队列都有一个 pcq-rate 的数据率限制和 pcq-limit 大小的数据包。 PCQ 队列的总大小不能大于pcq-total-limit 包。 以下实例说明了 PCQ 对数据包的用法,以它们的源地址分类。

如果你以 src-address 对包分类那么所有带有不同源 IP 地址的包将被集合在不同的子队列中。现在你可以使用 pcq-rate 参数对每一个子队列进行限制或均衡。或许最重要的部分是决定我们到底应该把这个队列附属到哪个接口上。如果我们把它依附在本地接口上,那么所有来自公网接口的数据流都将以 src-address(很可能这不是我们想要的)地址分组;相反地如果我们把它依附到公共接口,所有来自我们客户的数据都会以 src-address分组——于是我们可以很容易的限制或者均衡客户的上载。 用 pcq-classifier 分类后为了在子队列中均衡速率,设置 pcq-rate 为 0 几乎不用管理, PCQ 也可以用来对多用户动态均衡或者形成流量,


RED:

随机早先探测( RED)是一种通过控制平均队列长度避免网络拥塞的排序机制。当平均队列长度达到red-min-threshold 时, RED 随机选择该丢弃哪个包。当平均队列长度变长时,堆砌多少包数的可能性会增加。如果平均队列长度达到 red-max-threshold, 则丢弃该包。尽管如此,也存在真实队列长度(非平均的)远大于 red-max-threshold 时,丢弃所有超过 red-limit 的数据包的情况。

注: RED 应用在高数据率的拥挤的连接上,它在 TCP 协议上工作的很好,但在 UDP 上就没那么理想了。

属性描述
bfifo-limit (整数; 默认: 15000) BFIFO 队列可以容纳的最大字节数
kind (bfifo pcq
bfifo 字节先进先出
pcq 每次连接队列
pfifo 数据包先进先出
red 随机早先探测
sfq 随机公平队列
name (名称) 队列类型相关名称
pcq-classifier (dst-address | dst-port | src-address | src-port; 默认: “”) PCQ 对其子队列进行分组的分类器。可以同时被数个分类器使用。例如: src-address, src-port 可使用不同源地址和源端口把所有包分为独立的子队列
pcq-limit (整数; 默认: 50) 可以容纳一个单个 PCQ 子队列的包的数目
pcq-rate (整数; 默认: 0) 对每个子队列允许的最大数据率。 0 值指的是没有任何限制
pcq-total-limit (整数; 默认: 2000) 可以容纳整个 PCQ 队列的包的数目
pfifo-limit (整数) PFIFP 队列可以容纳包的最大数目
red-avg-packet (整数; 默认: 1000) 被 RED 用来对平均队列长度计算
red-burst (整数) 用来决定平均队列长度被真实队列长度影响的快慢的字节值。较长的值将减慢 RED 的计算速度——较长的脉冲串也是允许的
red-limit (整数) 以字节计算。如果真实队列长度(非平均值)超过了这个值那么所有大于这个值的包都将被丢弃。
red-max-threshold (整数) 以字节计算。数据包标记概率最高的平均队列长度
red-min-threshold (整数) 当平均 RED 队列长度达到这个值时,数据包标记才有可能
sfq-allot (整数; 默认: 1514) 在一个 round-robin 循环中从子队列发出的字节数
sfq-perturb (整数; 默认: 5) 以秒计时。指定改变 SFQ 的散列算法的频率

Bursts:

脉冲串用来在一段很短的时间允许更高数据率。每 1/16 burst-time 时间,路由器都会计算每个类在上一个 burst-time时间的平均数据率。如果这个平均数据率小于 burst-threshold,脉冲串就会被启用且实际数据率达到 burst-limit bps,否则实际数据率将跌至 max-limit 或 limit-at。

让我们考虑如果我们有个 max-limit=256000, burst-time=8, burst-threshold=192000 以及burst-limit=512000 的设置情况。当一个用户通过 HTTP 下载一个文件,我们可以观察到这样的现象:

在最开始的 8 秒中平均数据率是 0bps 因为在应用队列规则前没有流量通过。由于这个平均数据率小与 burst-threshold(192kbps),所以脉冲串会被使用。在第一秒之后,平均数据率为(0+0+0+0+0+0+0+512)/8=64kbps, 低于burst-threshold。 在第二秒后,平均数据率为(0+0+0+0+0+0+512+512)/8=128kbps。 在第三秒之后达到临界点。 此时平均数据率变得大于 burst-threshold。 这个时候脉冲串将被禁用且当前数据率降至 max-limit (256kbps)。