我想知道为什么 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
在两个进程上使用了命令A
。B
在过程中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 冲突。