Linux下的带宽控制心得
Linux下的带宽控制通过队列实现,原理有通过延时和令牌的。而且广泛使用的是cbq队列。可笑的是这个恰恰是最复杂最难搞的一种队列,而且文档比较难懂。现在有一种新的htq队列相对配置比较简单,但是需要手工编译内核才能支持。
其实cbq如果有中文的文档,或许会比较好懂一点。:o
cbq基本使用步骤为:
1) 针对网络物理设备(如以太网卡eth0)绑定一个CBQ队列
2) 在该队列上建立分类
3) 为每一分类建立一个过滤器
给出偶的配置和注释,大家可能就会清楚了。偶的网络是用adsl拨号上网的,单网卡。
tc qdisc del dev eth0 root#删除从前的队列
tc qdisc add dev eth0 root handle 100: cbq bandwidth 10Mbit avpkt 1000
#在eth0上绑一个队列,物理带宽为10Mbit
tc class add dev eth0 parent 100:0 classid 100:1 cbq bandwidth 10Mbit rate 10Mbit allot 1514 weight 2Kbit prio 8 maxburst 8 avpkt 1000 bounded
#建立根类,根类不限速,所以偶没有指明adsl的实际速度,而是用网卡的速度来代替
tc class add dev eth0 parent 100:1 classid 100:2 cbq bandwidth 10Mbit rate 10Mbit allot 1513 weight 1Mbit prio 5 maxburst 8 avpkt 1000 bounded
#第一个子类,是为那些要全速的ip建立,比方偶:p
tc class add dev eth0 parent 100:1 classid 100:3 cbq bandwidth 10Mbit rate 1000Kbit allot 1513 weight 100Kbit prio 6 maxburst 8 avpkt 1000 bounded
#第二个子类,给网段中其他的人用
tc qdisc add dev eth0 parent 100:2 sfq quantum 1514b perturb 15
tc qdisc add dev eth0 parent 100:3 sfq quantum 1514b perturb 15
#sfq是另外一种队列,这两句的意思是让经过100:2和100:3两个子类的数据包的顺序是#随机的,而不是默认的fifo,实际效果比如你先下载,后打开ie,ie的页面显示不会在下#载完再显示出来。
tc filter add dev eth0 parent 100:0 protocol ip prio 25 u32 match ip dst 192.168.202.219/32 flowid 100:2
tc filter add dev eth0 parent 100:0 protocol ip prio 25 u32 match ip dst 192.168.202.245/32 flowid 100:2
tc filter add dev eth0 parent 100:0 protocol ip prio 25 u32 match ip dst 192.168.202.216/32 flowid 100:2
tc filter add dev eth0 parent 100:0 protocol ip prio 25 u32 match ip dst 192.168.202.218/32 flowid 100:2
tc filter add dev eth0 parent 100:0 protocol ip prio 25 u32 match ip dst 192.168.202.0/24 flowid 100:3
#针对分类建立过滤器,按目的ip建立。
在linux下,要控制带宽,你只能控制发出的包,而不能控制接收包。因为别人发包给你的速度是不能由你控制的。所以偶要限制adsl的下载速度,不是在ppp0接口上,而是在eth0的接口上,即内网数据发送接口上。
令偶有点困惑的是,rate的标识速度并不是准确。当偶设到10Kbps或10Kbit时,下载速度是维持在10kb/s左右,按理说,应该是10kbit/8/1024 kb/s的。所以偶干脆用带宽指数来确定rate。
重要的参数是bounded,表明限制此类带宽。如果没有,则线路空闲时,那个分类会占所有的带宽。
除了bounded,你还可以设borrow,Isolated,sharing。borrow可以借用其他分类的带宽,Isolated划定某一部分带宽给指定的分类,即使那个分类没有数据传送,这部分带宽也不会分给别人。sharing和Isolated正好相反。