Задать вопрос
@e1ferapontov
Админю всякую виртуализацию

Почему при балансировке нагрузки через один шлюз идет больше трафика, чем через другой?

Выдержка из скрипта:
# Multi-wan routing settings
# ByFly routing settings

ip route add 192.168.111.0/30 dev eth1 src 192.168.111.2 table byfly
ip route add default via 192.168.111.1 table byfly

# BN routing settings

ip route add 192.168.110.0/30 dev eth2 src 192.168.110.2 table bn
ip route add default via 192.168.110.1 table bn

# Creating rules

ip rule add from 192.168.111.2 table byfly prio 1000
ip rule add from 192.168.110.2 table bn prio 1000

# Here's round robin to ensure that system started with at least one gateway

ip route add default scope global nexthop via 192.168.111.1 dev eth1 weight 1 nexthop via 192.168.110.1 dev eth2 weight 1

# GWPING call

nohup /usr/sbin/gwping &

Приоритеты одинаковые, вес маршрутов одинаковый, метрики у созданных маршрутов одинаковые. GWPING только переключает все на один шлюз в случае дисконнекта и возвращает все как было. Через eth1 всегда передается по меньшей мере в два раза больше трафика, чем по eth2. Куда копать?
P. S. попытался поменять их местами в round robin -- результат тот же.
  • Вопрос задан
  • 3191 просмотр
Подписаться 5 Оценить Комментировать
Решения вопроса 1
@throughtheether
human after all
Сразу отмечу, я невеликий специалист в сетевой подсистеме Linux. Я исхожу из следующих положений:
1) у вас, судя по всему, реализована схема Equal cost multi-path.
2) я предполагаю, что сетевую подсистему Linux реализовывали разумные люди, поэтому выбор исходящего маршрута производится per-flow, т.е. для каждого 'потока' данных ('поток' характеризуется IP-адресами источника назначения, типом протокола (IP protocol number), портами источника и назначения)

Почему при балансировке нагрузки через один шлюз идет больше трафика, чем через другой?
Вкратце, потому что балансировки трафика не наблюдается. В моем понимании балансировка - это когда мы отслеживаем один параметр ('нагрузку', будь то утилизация линка, количество соединений, что угодно) и соответственно изменяем другой параметр (исходящий маршрут, интерфейс, и т.д.), чтобы выровнять (привести в баланс) изменения, реализуя обратную связь. В этом смысле балансировка наблюдается в различных балансировщиках нагрузки (load balancers), типа F5, haproxy и прочая.

В вашем случае, скорее всего, трафик разделяется (load sharing) на основании того, к какому flow он принадлежит. Соответственно, повышенная утилизация одного из линков говорит о том, что есть flow высокой интенсивности (Elephant flow), т.е. большое количество пакетов имеет один и тот же хэш и направляется в один и тот же линк. Также могут быть нюансы с разделением трафика, порожденного самим хостом. Ну и всегда есть вероятность багов в ПО.

Куда копать?
Чтобы удостовериться правильности гипотезы, вы можете снять дамп трафика (в точке до разделения на линки) и изучить его при помощи wireshark (Statitics -> Conversations -> вкладки TCP, UDP, две правые колонки в bps). Если гипотеза верна, вы обнаружите пару сокетов, утилизирующих значительную долю пропускной способности линка.

Я также исходил из того, что вы показали актуальные настройки и у вас ровно два маршрута по умолчанию. Если вдруг затесался еще один, с тем же весом (с той же метрикой), то даже в идеальном случае разделение будет, скорее всего 1:1:2. Это обусловлено особенностями реализации ECMP.

TL;DR: Это не балансировка, это разделение трафика. Идеального разделения трафика пополам в общем случае добиться крайне затруднительно.

UPD:
Сейчас машина стоит на тестовом стенде. Здесь нет вообще никакого трафика, кроме двух пингов, запускающихся для теста.
Приведите, пожалуйтса, точные команды, которые вы запускаете. Уточните, запускаете ли вы их на самом сервере-маршрутизаторе с длвумя линками или на сторонней машине. Цели для пингов - отвечают ли они на пинги. Каковы точные количественные характеристики трафика на линках (интерфейс такой-то, столько-то входящего, столько-то исходящего), как вы его меряете (среднее значение за 1,5,10 минут)

Но даже без этих данных можно сказать, что ваш тест не вполне корректен. Per-flow хэширование оптимизировано под UDP и TCP трафик. Поэтому, рекомендую вам на машине за интерфейсов eth0 (и корректно прописанным default gateway) сгенерировать при помощи hping UDP-трафик с рандомизированными адресами источника и назначения, портами источника и назначения. Если в этом случае трафик распределится примерно равномерно, то все работает штатно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@tgz
Покажите
ip a
ip ru li
ip r
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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