【问题标题】:Unable to set speed limit using tc tbf无法使用 tc tbf 设置速度限制
【发布时间】:2013-01-30 18:00:50
【问题描述】:

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

有人吗?

【问题讨论】:

    标签: linux shell networking asterisk qos


    【解决方案1】:

    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 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:打开 环回:关闭[固定]

    【讨论】:

      【解决方案2】:

      我有同样的问题。关闭分段卸载将解决问题(您不再需要将 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-04
        • 2014-08-21
        • 2018-06-14
        • 1970-01-01
        • 1970-01-01
        • 2011-04-29
        • 2016-04-20
        相关资源
        最近更新 更多