Команда 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 .

Однако наблюдаемая скорость полосы пропускания составляет приблизительно 300 Мбит / с . (Не около 50Мбит / сек !). Машина расположена под маршрутизатором, который может обрабатывать не более 1 Гбит / с. И кабель LAN способен работать с достаточной пропускной способностью.

Когда я пытался сделать то же самое, используя две разные машины под одним и тем же маршрутизатором, где роль процесса A - на другой машине, а роль процесса B - на машине с IP-адресом 192.168.0.4 , наблюдаемая полоса пропускания составляет около 50 Мбит / с .

Как мне получить симуляцию 50 Мбит / с на той же машине ?? Неужели это невозможно? Большое тебе спасибо!

0
задан 13 February 2019 в 12:34
1 ответ

Та же машина направляет трафик от себя к себе локально, используя интерфейс 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.

0
ответ дан 28 December 2019 в 16:34

Теги

Похожие вопросы