为什么这个TC脚本不工作

我们的应用程序有三类stream量,每种types的stream量都有三个端口。 我们希望通过端口号来限制stream量,所以我做了一个简单的TC脚本来testing,但是这个脚本并不像我想象的那样工作。

下面是我用来设置TC的shell命令。 预期的结果是,SecureCRT和Apache(SecureCRT使用22端口,Apache使用80端口)的下载速率将被限制在100K / S,但是我们得到的实际结果是下载速率保持不变 – 约5MB / s。

tc qdisc del dev eth0 root tc qdisc add dev eth0 root handle 1:0 cbq bandwidth 1Mbit avpkt 1000 cell 8 tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 1Mbit rate 1Mbit weight 100kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded tc class add dev eth0 parent 1:0 classid 1:2 cbq bandwidth 1Mbit rate 1Mbit weight 100kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded tc class add dev eth0 parent 1:0 classid 1:3 cbq bandwidth 1Mbit rate 1Mbit weight 100kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded tc class add dev eth0 parent 1:1 classid 1:1001 cbq bandwidth 1Mbit rate 800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 tc qdisc add dev eth0 parent 1:1001 handle 1001: sfq tc class add dev eth0 parent 1:1 classid 1:1002 cbq bandwidth 1Mbit rate 800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 tc qdisc add dev eth0 parent 1:1002 handle 1002: sfq tc class add dev eth0 parent 1:1 classid 1:1003 cbq bandwidth 1Mbit rate 800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 tc qdisc add dev eth0 parent 1:1003 handle 1003: sfq tc class add dev eth0 parent 1:2 classid 1:2001 cbq bandwidth 1Mbit rate 800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 tc qdisc add dev eth0 parent 1:2001 handle 2001: sfq tc class add dev eth0 parent 1:2 classid 1:2002 cbq bandwidth 1Mbit rate 800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 tc qdisc add dev eth0 parent 1:2002 handle 2002: sfq tc class add dev eth0 parent 1:2 classid 1:2003 cbq bandwidth 1Mbit rate 800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 tc qdisc add dev eth0 parent 1:2003 handle 2003: sfq tc class add dev eth0 parent 1:3 classid 1:3001 cbq bandwidth 1Mbit rate 800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 tc qdisc add dev eth0 parent 1:3001 handle 3001: sfq tc class add dev eth0 parent 1:3 classid 1:3002 cbq bandwidth 1Mbit rate 800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 tc qdisc add dev eth0 parent 1:3002 handle 3002: sfq tc class add dev eth0 parent 1:3 classid 1:3003 cbq bandwidth 1Mbit rate 800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 tc qdisc add dev eth0 parent 1:3003 handle 3003: sfq tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport 80 0xffff flowid 1:3001 tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport 22 0xffff flowid 1:3002 

您不能对stream量进行分类,然后使用整形或延迟“传入”stream量或ingress经常调用stream量 。 这张图是从LARTC文件中借用的:

  Userspace programs ^ | +---------------+-----------------------------------------+ | Y | | -------> IP Stack | | | | | | | Y | | | Y | | ^ | | | | / ----------> Forwarding -> | | ^ / | | | |/ Y | | | | | | ^ Y /-qdisc1-\ | | | Egress /--qdisc2--\ | --->->Ingress Classifier ---qdisc3---- | -> | Qdisc \__qdisc4__/ | | \-qdiscN_/ | | | +----------------------------------------------------------+ 

Linux有简单的入门级qdisc,但function非常有限,因为没有入口队列。 但是可以通过IMQ device (InterMediate Queuing设备)来“解决”在入口上排队的问题。

此外,当您的服务器充当路由器(打开IP转发)时,您可以调整/延迟传入stream量。 如果服务器有两个networking接口(例如,eth0用于Internet访问,eth1用于本地networking访问),并且本地networking中的客户端正在下载某些内容,则该通信将在eth0接口上传入/传入,在eth1接口上传出/传出。 所以如果你在eth1接口上定义你的QoS策略,它将会起作用。

最后,我build议你从cbq切换到htb ,因为它更准确(它使用TBF或Token Bucket Filter,它不依赖于接口特性)。