1. 无类算法 SFQa. 队列控制的无类算法 SFQ
SFQ(Stochastic Fairness Queueing 随机公平队列 ) 是公平队列算法家族中的一个简单实现 . 它的精确性不如其它的方法 , 但实现了高度的公平 , 需要的计算量亦很少 .
SFQ 算法主要针对一个 TCP 会话或者 UDP 流 . 流量被分成相当多数量的 FIFO 队列中 , 每个队列对应一个会话 . 数据按照简单轮转的方式发送 , 每个会话都按顺序得到发送机会 . 这种方式非常公平 , 保证了每一个会话都不会没其它会话所淹没 .
SFQ 之所以被称为"随机", 是因为它并不是真的为每一个会话创建一个队列 , 而是使用一个散列算法 , 把所有的会话映射到有限的几个队列中去 . 因为使用了散列 , 所以可能多个会话分配在同一个队列里 , 从而需要共享发包的机会 , 也就是共享带宽 . 为了不让这种效应太明显 ,SFQ 会频繁地改变散列算法 , 以便把这种效应控制在几秒钟之内 ( 时间由参数设定 ).
注 :SFQ 只会发生在数据发生拥堵 , 产生等待队列的网卡上 .. 出口网卡若无等待队列 ,SFQ 亦不起作用 ...
清单 1. 在网卡上建立 SFQ1
2
3
4
5
| #tc qdisc add dev eth0 root handle 1: sfq
SFQ 参数有 perturb( 重新调整算法间隔 ) quantum 基本上不需要手工调整 :
handle 1: 规定算法编号 .. 可以不用设置由系统指定 ..
#tc qdisc sh dev eth0 显示算法
#tc qd del dev eth0 root 删除 注 : 默认 eht0 支持 TOS
|
SFQ 队列一般用在树叶级 , 配合其它流量整形算法一并使用……
b. 流量控制的无类算法 TBF
令牌桶过滤器 (TBF) 是一个简单的队列规定 : 只允许以不超过事先设定的速率到来的数据包通过 , 但可能允许短暂突发流量朝过设定值 .
TBF 很精确 , 对于网络和处理器的影响都很小 , 实现是针对数据的字节数进行的 , 而不是针对数据包进行 , 常用于网关限速 .
TBF 的实现在于一个缓冲器 ( 桶 ), 不断地被一些叫做"令牌"的虚拟数据以特定速率填充着 . (token rate). 桶最重要的参数就是它的大小 , 也就是它能够存储令牌的数量 . 每个到来的令牌从数据队列中收集一个数据包 , 然后从桶中被删除 . 这个算法关联到两个流上——令牌流和数据流 , 于是我们得到 3 种情景 :
A. 数据流以等于令牌流的速率到达 TBF. 这种情况下 , 每个到来的数据包都能对应一个令牌 , 然后无延迟地通过队列 .
B. 数据流以小于令牌流的速度到达 TBF. 通过队列的数据包只消耗了一部分令牌 , 剩下的令牌会在桶里积累下来 , 直到桶被装满 . 剩下的令牌可以在需要以高于令牌流速率发送数据流的时候消耗掉 , 这种情况下会发生突发传输 .
C. 数据流以大于令牌流的速率到达 TBF. 这意味着桶里的令牌很快就会被耗尽 . 导致 TBF 中断一段时间 , 称为"越限". 如果数据包持续到来 , 将发生丢包 . 此种情况最重要 , 因为它可以用来对数据通过过滤器的速率进行整形 . 令牌的积累可以导致越限的数据进行短时间的突发传输而不必丢包 , 但是持续越限的话会导致传输延迟直至丢包 .
清单 2. 在网卡建立 TBF1
2
3
4
| #tc qd add dev eth1 root handle 1: tbf rate 256kbit burst 10000 latency 50ms
速率 256kbit 突发传输 10k 最大延迟 50ms
#tc -s qd sh dev eth1 统计
#tc qd del dev eth1 root 删除
|
rate 限制的传输速率 用位来计算
latency 确定了一个包在 TBF 中等待传输的最长等待时间 .
burst 桶的大小 , 以字节计 . 指定了最多可以有多少个令牌能够即刻被使用 .
注 : 管理的带宽越大 , 需要的缓冲器就越大 . 在 Intel 体系上 ,10 兆 bit/s 的速率需要至少 10k 字节的缓冲区
才能达到期望的速率 . 缓冲区太小导致潜在的丢包 .
c. 无类算法除这二种队列以外 , 另有 pfifo_fast( 网卡出口默认根队列规定 )
经常使用的也就是 SFQ/TBF ……
这二种用法如下:
单纯地降低出口速率 , 使用令牌桶过滤器 . 调整桶的配置后可用于控制很高的带宽 .
链路已经塞满 , 保证不会有某一个会话独占出口带宽 , 使用随机公平队列 .
当然最要的还是工作中得来的经验 , 就其应用方面只要能满足需求即可 .. 要做到灵活应用还得大量的实践 |