我使用tc在星号服务器上执行QOS。我想优先考虑语音和sip流量,但也要将所有其他流量限制在一个固定的限度内。
这是我的脚本:
#!/bin/bash
IFACE=eth1
UPSPEED=1.5mbit
tc qdisc del dev $IFACE root
tc qdisc add dev $IFACE root handle 1: prio priomap 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 0
tc qdisc add dev $IFACE parent 1:1 handle 10: sfq perturb 10
tc qdisc add dev $IFACE parent 1:2 handle 20: sfq perturb 10
tc qdisc add dev $IFACE parent 1:3 handle 30: tbf rate $UPSPEED burst 4kb mtu 1500 latency 100ms
tc filter add dev $IFACE protocol ip parent 1: prio 1 u32 match ip tos 0xb8 0xff flowid 1:1
tc filter add dev $IFACE protocol ip parent 1: prio 1 u32 match ip tos 0x60 0xff flowid 1:2
RTP和SIP流量被很好地管理,被发送到第一和第二频带。所有其他流量也得到了很好的管理,被发送到第三频带。然而,由于某些原因,如果我从服务器下载,它总是以10-16k/sec的速度,而不是脚本中指定的185-190k(1.5mbit)。
最糟糕的是,似乎无论我如何改变tbf变量,速度都保持不变。
使用qdisc-s ls,我设法发现数据包被丢弃了:
qdisc prio 1: bands 3 priomap 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 0
Sent 12610974 bytes 45683 pkt (dropped 1147, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc sfq 10: parent 1:1 limit 126p quantum 1514b perturb 10sec
Sent 7802180 bytes 36590 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc sfq 20: parent 1:2 limit 126p quantum 1514b perturb 10sec
Sent 181620 bytes 283 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
qdisc tbf 30: parent 1:3 rate 1500Kbit burst 4Kb lat 100.0ms
Sent 4627174 bytes 8810 pkt (dropped 1147, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
但我不知道为什么。同样,更改tbf变量不会更改任何内容,数据包不断被丢弃。
请注意,eth1的mtu是1500。
有人吗?
将mtu 100000
添加到tc qdisc
创建命令中。请参阅这篇文章了解更多信息。
引用帖子,以防它消失:
基本上,如果您的接口启用了TSO/GSO(使用
ethtool -k ethX
进行检查),或者您正在使用环回接口,那么您可能会遇到问题。事实证明,环回接口默认启用了GSO/TSO,此外,由于它是一个软件接口,其默认mtu为16384(而普通以太网接口为1500)。这很重要,因为tbf队列检查传入"数据包"的大小——在GSO/TSO的情况下,这些数据包比正常的有线数据包大得多——相反,它们的mtu高达9倍。所以对于普通接口来说,它大约是12K,但对于环回来说,它是大约100k!
这似乎也适用于Xen接口:
#ethtool-k eth0eth0的功能:rx校验和:on[fixed]tx校验和:打开tx-checksum-ipv4:打开tx校验和不需要:off〔fixed〕tx校验和ip通用:off〔fixed〕tx-checksum-ipv6:关闭[已修复]tx校验和fcoe crc:off〔fixed〕tx校验和sctp:off〔fixed〕散射聚集:启用tx散点聚集:打开tx散集碎片列表:off〔fixed〕tcp分段卸载:在#THIS TSO上tx-tcp分段:打开tx-tcp-ecn-segmentation:off〔fixed〕tx-tcp6-分段:关闭[已修复]udp碎片卸载:off〔fixed〕通用分段卸载:关于#THIS GSO常规接收卸载:启用大型接收卸载:关闭[已修复]rx-vlan卸载:关闭[已修复]tx-vlan卸载:off〔fixed〕ntuple过滤器:关闭[已修复]接收哈希:关闭[已修复]highdma:关闭[已修复]rx-vlan过滤器:关闭[已修复]vlan被挑战:关闭[已修复]tx无锁定:关闭[已修复]netns local:关闭[已修复]tx-gso鲁棒:on〔fixed〕tx-fcoe分段:关闭[fixed]fcoe-mtu:关闭[已修复]tx-nocache副本:上环回:关闭[已修复]
我遇到了同样的问题。关闭分段卸载将解决问题(并且您不再需要将mtu传递给tc)。
sudo ethtool -K eth1 tso off
sudo ethtool -K eth1 gso off
sudo ethtool -K eth1 gro off
sudo ethtool --offload eth1 rx off tx off