0

我正在使用 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。

任何人?

4

2 回答 2

2

添加mtu 100000到您的tc qdisc创建命令。有关更多信息,请参阅此帖子

引用帖子,以防它消失:

基本上,如果您的接口启用了TSO/GSOethtool -k ethX (使用 检查),或者您正在使用环回接口 - 那么您可能会遇到问题。事实证明,环回接口默认启用了 GSO/TSO,而且由于它是一个软件接口,其默认 mtu 为 16384(与普通以太网接口的 1500 相比)。这很重要,因为 tbf 队列检查传入“数据包”的大小 - 在 GSO/TSO 的情况下,它比普通的在线数据包大得多 - 相反,它们最多为 iface 的 9 x mtu。因此,对于普通接口,它大约是 12K,但对于环回,它大约是 100k!

这似乎也适用于 Xen 接口:

# ethtool -k eth0
eth0 的特点:
rx-checksumming: on [fixed]
tx 校验和:开启
    tx-checksum-ipv4: 开启
    tx-checksum-unneeded:关闭 [已修复]
    tx-checksum-ip-generic:关闭 [已修复]
    tx-checksum-ipv6:关闭 [已修复]
    tx-checksum-fcoe-crc:关闭 [已修复]
    tx-checksum-sctp:关闭 [已修复]
分散聚集:开
    tx-scatter-gather:开
    tx-scatter-gather-fraglist:关闭 [已修复]
tcp-segmentation-offload: on # 这是 TSO
    tx-tcp 分段:开启
    tx-tcp-ecn-segmentation:关闭 [已修复]
    tx-tcp6-segmentation:关闭 [已修复]
udp-fragmentation-offload:关闭 [已修复]
generic-segmentation-offload: on # 这是 GSO
通用接收卸载:开启
large-receive-offload:关闭 [已修复]
rx-vlan-offload:关闭 [已修复]
tx-vlan-offload:关闭 [已修复]
ntuple-filters: 关闭 [已修复]
接收散列:关闭 [已修复]
highdma:关闭 [已修复]
rx-vlan-filter:关闭 [已修复]
vlan-challenged:关闭 [已修复]
tx-lockless:关闭 [已修复]
netns-local:关闭 [已修复]
tx-gso-robust:开启 [已修复]
tx-fcoe-segmentation:关闭 [已修复]
fcoe-mtu:关闭 [已修复]
tx-nocache-copy:打开
环回:关闭[固定]
于 2013-08-23T01:11:19.193 回答
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
于 2014-12-26T02:44:14.207 回答