Linux 的带宽管理系统(3) 为了更清晰起见,我们的类可以用下图表示: 我们已经向内核通知了我们的类,我们还需要告诉内核如何管理队列,如下所示: # tc qdisc add dev eth0 parent 10:100 sfq quantum 1514b perturb 15 # tc qdisc add dev eth0 parent 10:200 sfq quantum 1514b perturb 15 这里,我们使用了随机公平队列(sfq),在消耗 CPU 周期较少的情况下,其性能还是可以接受的。其它一些队列规定可能更好,但要占用较多的 CPU 资源。令牌桶过滤器也经常使用。 下面还有一件事要作:告诉内核网络包和类的映射关系。 # tc filter add dev eth0 parent 10:0 protocol ip prio 100 u32 match ip dst \ 150.151.23.24 flowid 10:200 # tc filter add dev eth0 parent 10:0 protocol ip prio 25 u32 match ip dst \ 150.151.0.0/16 flowid 10:100 这里,我们假定 Office 位于防火墙 150.151.23.24 的后面,其它 IP 地址都属于 ISP。 u32 匹配是一种比较简单的匹配,我们可以使用 netfilter 生成更加复杂的匹配规则。 我们已经分配了下载带宽,下面是上载带宽的分配: # tc qdisc add dev eth1 root handle 20: cbq bandwidth 10Mbit avpkt 1000 # tc class add dev eth1 parent 20:0 classid 20:1 cbq bandwidth 10Mbit rate \ 10Mbit allot 1514 weight 1Mbit prio 8 maxburst 20 avpkt 1000 # tc class add dev eth1 parent 20:1 classid 20:100 cbq bandwidth 10Mbit rate \ 8Mbit allot 1514 weight 800Kbit prio 5 maxburst 20 avpkt 1000 \ bounded # tc class add dev eth1 parent 20:1 classid 20:200 cbq bandwidth 10Mbit rate \ 2Mbit allot 1514 weight 200Kbit prio 5 maxburst 20 avpkt 1000 \