tc 命令不会影响同一台机器上的两个进程

tc 命令不会影响同一台机器上的两个进程

我想知道为什么 tc 命令不能按预期工作。我设置了以下命令

tc qdisc add dev eno0 root handle 1:0 tbf rate 50mbit burst 25kb limit 250kb

我期望通过 50Mbps 带宽模拟出站通信。现在,我尝试让两个进程使用与 关联的本地 IP 地址(例如 192.168.0.4)在同一台机器上相互通信eno0

为了了解tc命令的影响。我iperf在两个进程上使用了命令AB

在过程中A,我跑了iperf -s

在过程中B,我跑了iperf -c 192.168.0.4

但是,观察到的带宽速率约为300Mbit/sec。(不是左右50Mbit/sec!)。机器位于最多可以处理 1Gbps 的路由器下方。并且,LAN 电缆能够处理足够的带宽速率。

当我尝试使用同一路由器下的两台不同的机器做同样的事情时,其中进程 A 的角色在另一台机器上,而进程 B 的角色在具有 IP 地址的机器上192.168.0.4,观察到的带宽大约为50Mbit/s

我怎样才能50Mbps在同一台机器上进行模拟?这不可能吗?非常感谢!

答案1

同一台机器使用接口在本地将流量从自身路由到自身lo。它不会在线上 ( eno0) 发送此流量的任何数据包。您可以使用相同的规则,但lo改为在接口上使用,但需要进行更多调整:例如,默认 MTU 65536 会更改 tbf 行为(在日志中找到:sch_tbf: burst 25600 is lower than device lo mtu (65550) !):

# ip link set lo mtu 1500
# tc qdisc add dev lo root handle 1:0 tbf rate 50mbit burst 25kb limit 250kb

无论如何,还是会存在一些细微的差别。例如,lo是第 3 层接口,因此没有以太网开销,这会改变结果。

您可以使用网络命名空间来进行更多隔离模拟,例如:

# ip netns add host1
# ip netns add host2
# ip -n host1 link add dev eno0 type veth peer netns host2 name eno0
# ip -n host1 link set lo up; ip -n host2 link set lo up
# ip -n host1 link set eno0 up; ip -n host2 link set eno0 up
# ip -n host1 address add 192.168.0.4/24 dev eno0
# ip -n host2 address add 192.168.0.5/24 dev eno0

# tc -n host2 qdisc add dev eno0 root handle 1:0 tbf rate 50mbit burst 25kb limit 250kb

期限1:

# ip netns exec host1 iperf -s

第二期:

# ip netns exec host2 iperf -c 192.168.0.4

如果你的目标是涉及实际的外部硬件,那么可能可以使用VEPA 模式下的 macvlan 接口代替韦特接口,仍在网络命名空间中。这可能还需要在外部交换机(或路由器)上进行配置,并且不要发生 IP 冲突。

相关内容