Назад | Перейти на главную страницу

Команда 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 Гбит / с. И кабель 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.