我试图使用tc
在一个拥有10 Gbps NIC的系统上塑造流量,我发现我无法通过任何qdisc获得接近10 Gbps的任何东西。当我这么做时:
tc qdisc add dev $ifc root handle 1: htb default ffff
tc class add dev $ifc parent 1:0 classid 1:1 htb rate 32Gbit
tc class add dev $ifc parent 1:1 classid 1:ffff htb rate 1Gbit ceil 16Gbit burst 1G cburst 1G
我的吞吐量被限制在3 Gbps左右。我试过了CBQ和HFSC的变体。不管我做什么,我似乎都无法回避。
仅仅添加qdisc
并不会导致问题(正如我前面所说的)。我花了好几天的时间阅读所有我能找到的提到tc
、qdisc
和"10G“的东西。在6-10年前,似乎有很多邮件列表活动(也许是在10G变得普遍,取代1G之后),但没有解决问题。我是不是遗漏了什么?在Linux上不可能形成多个千兆位/秒吗?
发布于 2022-09-13 12:43:18
这是由于qdisc锁定问题造成的(默认情况下它会附着在一个CPU核心上)。已知的解决方案是XDP-重定向、XPS和HTB卸载。
XDP重定向解决方案是xdp-cpumap-tc,它为每个CPU核创建一个独立的HTB,然后使用XDP-重定向将IP通信过滤到适当的CPU /顶层HTB中。
我们开发了一个名为LibreQoS的应用程序,它使用XDP,我们发现XDP至少是一个非常好的用例解决方案。有一些值得注意的限制,例如您需要能够将您的通信量划分为每个CPU核心的4-6 Gbps。这可能是一个很大的吞吐量总量(20+ Gbps很容易),但是如果您需要一个HTB叶来形成超过4 Gbps的数据,那么在HTB的qdisc锁定问题在内核中得到解决之前,这是不可能的。
HTB卸载也是一个潜在的解决方案。吞吐量非常好。缺点是只有Mellanox/Intel NIC支持它,它的最大叶深度为3级。
https://unix.stackexchange.com/questions/704918
复制相似问题