我尝试在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
dos不是导致问题(正如我之前所说)。我花了几天时间阅读我能找到的所有提到tc
和qdisc
“10G”的内容。 6-10 年前似乎有很多邮件列表活动(可能是在 10G 开始普及、取代 1G 的风口浪尖),但没有解决方案。我错过了什么吗?在 Linux 上塑造每秒千兆比特是不可能的吗?
答案1
这是由于 qdisc 锁定问题造成的(默认情况下它坚持一个 CPU 核心)。已知的解决方案有 XDP-redirect、XPS 和HTB 卸载。
XDP重定向解决方案是xdp-cpumap-tc它为每个 CPU 核心创建一个独立的 HTB qdisc,然后使用 XDP 重定向将 IP 流量过滤到相应的 CPU/顶级 HTB。
我们开发了一个名为自由QoS它使用 xdp-cpumap-tc,我们发现 XDP 至少对于我们的用例来说是一个非常好的解决方案。有一些显着的限制,例如您需要能够将流量划分为每个 CPU 核心约 4-6 Gbps。这可能是一个很大的总吞吐量(很容易达到 20+ Gbps),但如果您需要单个 HTB 叶子来形成超过 4 Gbps 的吞吐量,则在内核中解决 HTB 的 qdisc 锁定问题之前这是不可能的。
HTB 卸载也是一个潜在的解决方案。吞吐量非常好。缺点是只有 Mellanox/Intel 网卡支持它,并且它的最大叶深度为 3 级。