我有 2 个服务,它们都通过相同的接口运行。
服务目标是在发送大量数据的同时保持高带宽。
服务 B 的目标是低延迟。
服务B数据包应该总是支持服务的 A 数据包。
我需要一个 TC 结构才能:
- 对服务 A 和 B 进行速率限制
- 为服务 B 数据包提供优先级,服务 A 数据包对延迟的影响为 0%。
- 如果其他服务未进行传输,则让每个服务利用整条线路(或达到其限制)。
我尝试了一个 htb 结构,其中我class htb classid x
可能有速率/上限限制,并且qdisc prio
(例如处理 y:0)作为子项(它将自动创建 ie 类 y:1、y:2 和 y:3)并使用过滤器src ip 将数据包重定向到 y:1 / y:2。
然而,它似乎不起作用。
两者class x
及其子流量似乎都是 0。(用于tc -s class/qdisc/filter show dev dev
查看)
当观看过滤器时,我可以清楚地看到“点击”,因此数据应该正确重定向。
这是我执行的命令:
tc qdisc add dev dev root handle 1: htb
tc class add dev dev parent 1:0 classid 1:1 htb rate 10gbit ceil 10gbit
# class x
tc class add dev dev parent 1:1 classid 1:2 htb rate 10gbit ceil 10gbit
# auto creates classes 21:1, 21:2 and 21:3
tc qdisc add dev dev parent 1:2 handle 21: prio
# example for service b filter (latency driven)
tc filter add dev dev parent 1:0 prio 2 u32 match ip src x.x.x.x/32 flowid 21:1
# example for service a filter
tc filter add dev dev parent 1:0 prio 2 u32 match ip src x.x.x.x/32 flowid 21:2
答案1
已经很长时间没有这样做了......对我的回答持保留态度。
过滤器父级可能必须是 PRIO qdisc 本身(因此您有 HTB 过滤器和 PRIO 过滤器,...)。否则 PRIO 可能会根据 priomap 自行重新分类数据包。
这就是我的旧脚本(FairNAT,你可以在 GitHub 上找到整个内容)的样子,我很确定它当时可以工作......数据包没有被 IP 过滤,而是被 iptables 标记这种情况(如果您怀疑 ip 过滤器不可靠,也值得一试)。
# Create a prio qdisc with 4 classes. All P2P traffic goes into class 4.
$BIN_TC qdisc add dev $UC_DEV parent 1:$UC_MARK handle $UC_MARK: prio \
bands 4
# Add a filter for IPP2P to this qdisc. The rest depends on TOS.
$BIN_TC filter add dev $UC_DEV parent $UC_MARK: protocol ip \
handle $(($UC_MARK+1)) fw flowid $UC_MARK:4
PRIO
大多数时候并不是一个好的选择。它太激进了,可能会完全耗尽所有其他流量。
仅具有单一 HTB 类别也可能无法达到预期效果。限制为 10GE 对我来说也听起来有点奇怪,如果这是理论上的链接速度而在实践中从未达到,它就不会做任何事情。
HFSC
可能更适合这项任务。文档甚至比 HTB 更糟糕,但它能够更好地限制速率并确定优先级(HTB 根本不区分任何事情的优先级)。