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

Другие вопросы по тегам