Мне интересно, почему команда 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
.
Однако наблюдаемая скорость полосы пропускания составляет приблизительно 300 Мбит / с
. (Не около 50Мбит / сек
!).
Машина расположена под маршрутизатором, который может обрабатывать не более 1 Гбит / с.
И кабель LAN способен работать с достаточной пропускной способностью.
Когда я пытался сделать то же самое, используя две разные машины под одним и тем же маршрутизатором, где роль процесса A - на другой машине, а роль процесса B - на машине с IP-адресом 192.168.0.4
, наблюдаемая полоса пропускания составляет около 50 Мбит / с
.
Как мне получить симуляцию 50 Мбит / с
на той же машине ??
Неужели это невозможно?
Большое тебе спасибо!
Та же машина направляет трафик от себя к себе локально, используя интерфейс lo
. Он не будет посылать пакеты по сети ( eno0
) для этого трафика. Вы можете использовать то же правило, но вместо этого в интерфейсе lo
, но требуется дополнительная настройка: например, значение MTU по умолчанию 65536 изменяет поведение tbf (найдено в журналах: sch_tbf: burst 25600 is ниже, чем устройство 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
Term1:
# ip netns exec host1 iperf -s
Term2:
# ip netns exec host2 iperf -c 192.168.0.4
Если ваша цель - задействовать реальное внешнее оборудование, возможно, можно использовать интерфейсы macvlan в Режим VEPA вместо veth интерфейсов, все еще в сетевых пространствах имен. Это, вероятно, требует настройки и на внешнем коммутаторе (или маршрутизаторе) и не вызывает конфликтов IP.