Команда tc не влияет на два процесса на одном компьютере
Мне интересно, почему команда tc не работает, как ожидалось. Я установил команду следующим образом
tc qdisc add dev eno0 root handle 1:0 tbf rate 50mbit burst 25kb limit 250kb
где я ожидаю, что исходящая связь моделируется с пропускной способностью 50 Мбит / с. Теперь я пытаюсь разрешить двум процессам взаимодействовать друг с другом на одном компьютере, используя локальный IP-адрес (скажем, 192.168.0.4), связанный с eno0
,
Чтобы узнать влияние tc
команда. я использовал iperf
команда на два процесса A
а также B
,
В процессе A
Я побежал iperf -s
,
В процессе B
Я побежал iperf -c 192.168.0.4
,
Тем не менее, наблюдаемая пропускная способность составляет примерно 300Mbit/sec
, (Не рядом 50Mbit/sec
!). Машина находится под маршрутизатором, который может обрабатывать не более 1 Гбит / с. И кабель локальной сети способен справиться с достаточной пропускной способностью.
Когда я пытался сделать то же самое, используя две разные машины под одним и тем же маршрутизатором, где роль процесса A находится на другой машине, а роль процесса B - на машине с IP-адресом 192.168.0.4
наблюдаемая пропускная способность составляет около 50Mbit/s
,
Как я могу получить 50Mbps
симуляция на одной машине?? Разве это невозможно сделать? Большое спасибо!
0 ответов
Та же машина направляет трафик от себя к себе локально, используя
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 и, следовательно, не имеет накладных расходов Ethernet, которые могут повлиять на результаты.
Вместо этого вы можете использовать сетевые пространства имен для более изолированного моделирования, например:
# 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
Term2:
# ip netns exec host2 iperf -c 192.168.0.4
Если ваша цель - задействовать реальное внешнее оборудование, вероятно, можно использовать интерфейсы macvlan в режиме VEPA вместо интерфейсов veth, все еще находящихся в сетевых пространствах имен. Вероятно, это также требует настройки внешнего коммутатора (или маршрутизатора) и не вызывает конфликтов IP.