Мне интересно, почему команда 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 Гбит / с. И кабель LAN способен работать с достаточной пропускной способностью.
Когда я пытался сделать то же самое, используя две разные машины под одним и тем же маршрутизатором, где роль процесса A находится на другом компьютере, а роль процесса B - на машине с IP-адресом 192.168.0.4
, наблюдаемая пропускная способность составляет около 50Mbit/s
.
Как я могу получить 50Mbps
симуляция на одной машине ?? Неужели это невозможно? Большое спасибо!
Та же машина направляет трафик от себя к себе локально, используя 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.