首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux 高级流控-2

Linux 高级流控-2

清单 3. 在网卡建立 PRIO
1
2
3
4
5
6
#tc qdisc add dev eth0 root handle 1: prio
# 此命令立即创建了类 : 1:1, 1:2, 1:3 ( 缺省三个子类 )
#tc qdisc add dev eth0 parent 1:1 handle 10: sfq
#tc qdisc add dev eth0 parent 1:2 handle 20: tbf rate 20kbit buffer 1600 limit 3000
   注 : 此为 TBF 限速的另一写法 , 前文有讲解 .
#tc qdisc add dev eth0 parent 1:3 handle 30: sfq




主要参数有 后续有实例 )
   bands 创建频道的数目 . 每个频道实际上就是一个类 跟 priomap 参数配合使用
     注 : 频道是类 , 缺省情况下命名为主标号 :1 到主标号 :3. 如果你的 PRIO 队列规定是 12:, 把数据包过滤到
       12:1 将得到最高优先级 . 0 频道的次标号是 1!1 频道的次标号是 2, 以此类推 .
   priomap 给 tc 提供过滤器 , 如不提供 PRIO 队列规定将参考 TC_PRIO 的优先级来决定如何给数据包入队 .
b. 流量整形的分类算法 CBQ
CBQ 的工作机制是确认链路的闲置时间足够长 , 以达到降低链路实际带宽的目的 . 为此 , 它要计算两个数据包的平均发送间隔 . 操作期间 , 有效闲置时间的测量使用 EWMA(exponential weighted moving average, 指数加权移动均值 ) 算法 , 也就是说最近处理的数据包的权值比以前的数据包按指数增加 .UNIX 的平均负载也是这样算出来的 . 计算出来的平均时间值减去 EWMA 测量值 , 得出的结果叫做"avgidle". 最佳的链路负载情况下 , 这个值应当是 0: 数据包严格按照计算出来的时间间隔到来 . 在一个过载的链路上 ,avgidle 值应当是负的 . 如果这个负值太严重 ,CBQ 就会暂时禁止发包 , 称为"overlimit"( 越限 ). 相反地 , 一个闲置的链路应该有很大 avgidle 值 , 这样闲置几个小时后 , 会造成链路允许非常大的带宽通过 . 为了避免这种局面 , 我们用 maxidle 来限 avgidle
的值不能太大 .
理论上讲 , 如果发生越限 ,CBQ 就会禁止发包一段时间 ( 长度就是事先计算出来的传输数据包之间的时间间隔 ), 然后通过一个数据包后再次禁止发包 .
清单 4. WEB 服务器的流量控制为 5Mbps,SMTP 流量控制在 3Mbps 上 . 而且二者一共不得超过 6Mbps, 互相之间允许借用带宽
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#tc qdisc add dev eth0 root handle 1:0 cbq bandwidth 100Mbit avpkt 1000 cell 8
#tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 100Mbit rate 6Mbit weight  
   0.6Mbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
   这部分按惯例设置了根为 1:0, 并且绑定了类 1:1. 也就是说整个带宽不能超过 6Mbps.
#tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 100Mbit rate 5Mbit weight
   0.5Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000
#tc class add dev eth0 parent 1:1 classid 1:4 cbq bandwidth 100Mbit rate 3Mbit weight
   0.3Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000
   建立了 2 个类 . 注意我们如何根据带宽来调整 weight 参数的 . 两个类都没有配置成"bounded", 但它们都连
接到了类 1:1 上 , 而 1:1 设置了"bounded". 所以两个类的总带宽不会超过 6Mbps. 别忘了 , 同一个 CBQ 下面的子
类的主号码都必须与 CBQ 自己的号码相一致 !
#tc qdisc add dev eth0 parent 1:3 handle 30: sfq
#tc qdisc add dev eth0 parent 1:4 handle 40: sfq
   缺省情况下 , 两个类都有一个 FIFO 队列规定 . 但是我们把它换成 SFQ 队列 , 以保证每个数据流都公平对待 .
#tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport 80 0xffff flowid
   1:3
#tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport 25 0xffff flowid
   1:4




CBQ 流量整形算法相对比较复杂 , 工作中还常用 ... 示例中的各参数请参阅 :HOWTO 中文文档 ..Linux 流量控制 II--- 分类算法 PRIO/CBQ/HTB
c. 流量整形的分类算法 HTB
HTB(Hierarchical Token Bucket) 分层的令牌桶一个分类的令牌桶过滤器 , 工作原理和相关配置同于 TBF.. 拥有 TBF 的各项性能 , 可参阅 TBF 的工作细节 ...
清单 5. 环境与要求同上述 CBQ 的例子
1
2
3
4
5
6
7
8
9
10
11
12
#tc qdisc add dev eth0 root handle 1: htb default 30
  #tc class add dev eth0 parent 1: classid 1:1 htb rate 6mbit burst 15k
  #tc class add dev eth0 parent 1:1 classid 1:10 htb rate 5mbit burst 15k
  #tc class add dev eth0 parent 1:1 classid 1:20 htb rate 3mbit ceil 6mbit burst 15k
  #tc class add dev eth0 parent 1:1 classid 1:30 htb rate 1kbit ceil 6mbit burst 15k
  #tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
  #tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10
  #tc qdisc add dev eth0 parent 1:30 handle 30: sfq perturb 10
  # 添加过滤器 , 直接把流量导向相应的类 :
  #U32="tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32"
  #$U32 match ip dport 80 0xffff flowid 1:10
  #$U32 match ip sport 25 0xffff flowid 1:20

三 . Linux 流量控制之 U32 过滤规则 过滤器是对数据包进行分类工具 , 过滤器用与把数据包分类并放入相应的子队列 , 这些过滤器在分类的队列规定内部被调用 . 为了决定用哪个类处理数据包 , 必须调用所谓的"分类器链" 进行选择 . 这个链中包含了这个分类队列规定所需的所有过滤器 . 常用到的为 U32 过滤器
分类的一示例图: 当一个数据包入队的时候 , 每一个分支处都会咨询过滤器链如何进行下一步 . 典型的配置是在 1:1 处有一个过滤器把数据包交给 12:, 然后 12: 处的过滤器在把包交给 12:2. 你可以把后一个过滤器同时放在 1:1 处 , 而得到效率的提高 .
另外 , 你不能用过滤器把数据包向"上"送 . 而且 , 使用 HTB 的时候应该把所有的规则放到根上 ..
   注 : 数据包只能向"下"进行入队操作 ! 只有处队的时候才会上到网卡所在的位置来 . 他们不会落到树的最
底层后送到网卡 ...
清单 6. 过滤器过滤示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match ip dport 22 0xffff flowid 10:1
    在 10: 节点添加一个过滤规则 , 优先权 1: 凡是去往 22 口 ( 精确匹配 ) 的 IP 数据包 , 发送到频道 10:1..
  #tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match ip sport 80 0xffff flowid 10:1
    在 10: 节点添加一个过滤规则 , 优先权 1: 凡是来自 80 口 ( 精确匹配 ) 的 IP 数据包 , 发送到频道 10:1..
  #tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2
    在 eth0 上的 10: 节点添加一个过滤规则 , 它的优先权是 2: 凡是上二句未匹配的 IP 数据包 , 发送到频道 10:2..
  #tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip dst 4.3.2.1/32 flowid 10:1
    去往 4.3.2.1 的包发送到频道 10:1 其它参数同上例
  #tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 1.2.3.4/32 flowid 10:1
    来自 1.2.3.4 的包发到频道 10:1
  #tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2
    凡上二句未匹配的包送往 10:2
  #tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 4.3.2.1/32 match
ip sport 80 0xffff flowid 10:1
    可连续使用 match, 匹配来自 1.2.3.4 的 80 口的数据包




常用到的过滤命令一览
1
#tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 -------




根据源 / 目的地址
源地址段 'match ip src 1.2.3.0/24'
目的地址段 'match ip dst 4.3.2.0/24'
单个 IP 地址 'match ip 1.2.3.4/32'
根据源 / 目的端口 , 所有 IP 协议
源 'match ip sport 80 0xffff' 0xffff 表所有数据包
目的 'match ip dport 80 0xffff'
根据 IP 协议 (tcp, udp, icmp, gre, ipsec)
icmp 是 1:'match ip protocol 1 0xff' 1 是根据 /etc/protocols 协议号来定
根据 fwmark
1
2
#iptables -A PREROUTING -t mangle -i eth0 -j MARK --set-mark 6
      #tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle 6 fw flowid 1:1




注 :handle 根据过滤器的不同 , 含义也不同
按 TOS 字段
1
#tc filter add dev ppp0 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff




flowid 1:4  选择交互和最小延迟的数据流 匹配大量传输 , 使用"0x08 0xff".
1
#tc filter add dev eth0 protocol ip parent 1:0 pref 10 u32 match u32 00100000 00ff0000




at 0 flowid 1:10 匹配那些 TOS 字段带有'最小延迟'属性的数据包


返回列表