我正在使用tc在星号服务器上执行QOS。我想优先考虑语音和啜饮流量,但也要将其余部分限制在一个固定的限制内。
这是我的剧本:
#!/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。
任何?
答案 0 :(得分:2)
将mtu 100000
添加到tc qdisc
创建命令中。有关详细信息,请参阅this post。
引用帖子,以防它消失:
基本上,如果您的界面启用了TSO/GSO(使用
ethtool -k ethX
检查),或者您正在使用环回界面 - 那么您可能会遇到问题。事实证明,环回接口默认启用GSO / TSO,此外它是一个软件接口,其默认mtu为16384(而普通以太网接口为1500)。这很重要,因为tbf队列检查传入的“数据包”的大小 - 在GSO / TSO的情况下,它比正常的在线数据包大得多 - 而不是它们高达9 x iface的mtu。所以对于普通接口来说它大约是12K,但对于环回来说它大约是100k!
这似乎也适用于Xen接口:
# ethtool -k eth0 Features for eth0: rx-checksumming: on [fixed] tx-checksumming: on tx-checksum-ipv4: on tx-checksum-unneeded: off [fixed] tx-checksum-ip-generic: off [fixed] tx-checksum-ipv6: off [fixed] tx-checksum-fcoe-crc: off [fixed] tx-checksum-sctp: off [fixed] scatter-gather: on tx-scatter-gather: on tx-scatter-gather-fraglist: off [fixed] tcp-segmentation-offload: on # THIS IS TSO tx-tcp-segmentation: on tx-tcp-ecn-segmentation: off [fixed] tx-tcp6-segmentation: off [fixed] udp-fragmentation-offload: off [fixed] generic-segmentation-offload: on # THIS IS GSO generic-receive-offload: on large-receive-offload: off [fixed] rx-vlan-offload: off [fixed] tx-vlan-offload: off [fixed] ntuple-filters: off [fixed] receive-hashing: off [fixed] highdma: off [fixed] rx-vlan-filter: off [fixed] vlan-challenged: off [fixed] tx-lockless: off [fixed] netns-local: off [fixed] tx-gso-robust: on [fixed] tx-fcoe-segmentation: off [fixed] fcoe-mtu: off [fixed] tx-nocache-copy: on loopback: off [fixed]
答案 1 :(得分:1)
我有同样的问题。关闭分段卸载将解决问题(并且您不再需要将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