我正在使用 macvlans 设置虚拟网络,并且已将流量控制 tc 连接到每个网络。我将每个延迟设置为 90 毫秒。但在 ping 上我得到的时间是 0.02 秒。为什么 tc 不能在 macvlan 上工作?
我正在使用以下命令:
tc qdisc add dev m1 root netem delay 90ms
tc qdisc add dev m2 root netem delay 90ms
然后从m1的ip ping到m2的ip。 m1 和 m2 是 macvlan。
答案1
您的问题与路由的完成方式有关,而不是与TC,内特姆或者麦克夫兰。
当从属于主机的 IP 地址到达属于主机的其他 IP 地址时,路由lo
通过查询本地路由表(隐藏,尝试ip route show table local
)使用(环回)接口,并且从不使用 IP 地址所在的实际接口分配给。
您可以通过询问内核它将选择的路由来验证这一点。例如,如果地址米1和平方米分别是 192.0.2.2/24 和 192.0.2.3/24:
# ip route get from 192.0.2.2 to 192.0.2.3
local 192.0.2.3 from 192.0.2.2 dev lo table local uid 0
cache <local>
如果您需要使用这些接口进行测试,那么您需要一个具有自己的路由堆栈的其他系统来测试它们。该系统可以是真实的主机、虚拟机、容器,或者只是使用一个(或多个)附加网络命名空间,就像您可能开始做的那样。
在我上面假设的情况下,如果 192.0.2.1 位于米1的 LAN(以及平方米接口被关闭以避免可能的不相关的 ARP 问题),ping 192.0.2.1
会显示延迟,因为米1将使用:
# ip route get from 192.0.2.2 192.0.2.1
192.0.2.1 from 192.0.2.2 dev m1 uid 0
cache
第一次 ping 通常会造成两倍的延迟损失,因为之前还完成了 ARP 请求来解析 IP 链接,这也会延迟。