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

8

Карьера переполнения стека подается примерно так:

user -> internet -> our fw -> nginx -> haproxy -> web farm
  • FreeBSD - используемая операционная система
  • на этом поле нет брандмауэра или QoS
  • nginx обрабатывает наше SSL-завершение
  • haproxy управляет балансировкой нагрузки
  • nginx / haproxy разгоняются до 15 Мбит / с

Во время нормальной работы nginx получает HTTP-запрос, выполняет свою работу и передает запрос экземпляру haproxy, который привязан к адресу обратной связи (127.0.0.1) в том же блоке.

Чтобы на днях устранить неполадки, я переместил экземпляр haproxy на тот же интерфейс, на котором работал nginx. Это сразу добавило 100 мс задержки ко всем запросам. Этот интерфейс не является настоящим физическим интерфейсом, но интерфейс карпа .

Может кто-нибудь объяснить мне, почему это было так? Возможно, конфликт с очередью пакетов? Или, возможно, петля всегда быстрее, потому что она «мягкая»? Здесь есть кое-что фундаментальное, что я упускаю, и я надеюсь, что кто-то любезно обучит меня.

Михаил Горсух
источник
1
Пакет, отправляемый по адресу, указанному на коробке, независимо от того, адресован ли он через порт lo или через порт e {th, n}, никогда не попадает в аппаратное обеспечение Linux. Я не могу говорить авторитетно в отношении BSD, хотя.
BMDan
Вы уверены, что переключили его на тот же интерфейс? Прошло ли 100 мс, когда вы переключили haproxy обратно в loopback?
Tomjedrz
@tomjedrz - да. как только я переключился обратно, задержка прошла.
Михаил Горсух

Ответы:

2

Постоянная задержка в 100 мс выглядит странно. Похоже, что пакеты буферизуются и не доставляются немедленно. Или, может быть, некоторые из них отброшены и переданы повторно. Можете ли вы запустить tcpdump на этом интерфейсе, чтобы показать проблему? Я не знаю, как стек IP работает во FreeBSD, и как реализован CARP, но возможно ли, например, что ведомое устройство регулярно объявляет свой MAC-адрес с бесплатными ARP и что мастер поочередно отправляет пакеты каждой стороне?

Не могли бы вы также запустить tcpdump на реальном интерфейсе, чтобы ничего не выводилось?

Возможно ли, чтобы система воздерживалась от кэширования записи ARP устройства CARP, тем самым вызывая отправку запроса ARP для каждого пакета сеанса, на который демон CARP должен был бы ответить?

Большинство из них - несколько глупых идей, но это для того, чтобы помочь вам искать в правильном направлении.

Вилли Тарро
источник
Спасибо за идеи, Вилли. Я перенесу конфигурацию обратно в интерфейс в нерабочее время и посмотрю, что вызывает трассировка пакетов.
Михаил Горсух
1

Просто для ясности, вы только изменили способ доступа к нему со 127 адреса на локальный IP; правильный?

Если это так, и это имеет значение, что-то не так. Проверьте таблицу маршрутизации netstat -rnи посмотрите, на что маршрутизируются локальные IP-адреса, она должна быть перенаправлена ​​на интерфейс lo0 (как 127).

Ваш netstat -rnвывод должен быть примерно похож на это:

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            1.2.3.1            UGS       131  2655014   nge1
1.2.3.0/23         link#2             U           0       88   nge1
1.2.3.4            link#2             UHS         0    34848    lo0
127.0.0.1          link#5             UH          0    64678    lo0
192.168.0.0/26     link#1             U           2 41703537   nge0
192.168.0.1        link#1             UHS         0    70088    lo0
Крис С
источник
Я должен был включить это в пост: эти интерфейсы являются интерфейсами карпа. Полностью ускользнуло из головы, пока я не запустил netstat. Это имеет значение?
Михаил Горсух
Да, вот и все. Если используемый вами адрес назначен интерфейсу карпа с использованием этого IP-адреса, он будет проходить через стек карпа до того, как он попадет на устройство обратной связи; 100 мс было бы все еще чрезмерным. Является ли рассматриваемый хост хозяином этого IP, или вы используете балансировку нагрузки? Это может быть отправка трафика другому хосту карпа.
Крис С
Хост является хозяином этого IP.
Михаил Горсух
Я только что закончил создавать похожую среду и тестировать ее. Я не увидел заметной разницы во времени отклика между IP-интерфейсом карпа, 127 IP и физическим IP. У меня есть только один сервер для тестирования, так что нет никаких карпов, но я подозреваю, что что-то не так в других местах вашей среды (брандмауэр или формирование трафика?), Что вызывает задержку. Это i386-8.1-STABLE.
Крис С
Спасибо, Крис. Я посмотрю, смогу ли я собрать больше информации, когда движение стихнет. Текущая система не использует пакет брандмауэра и не формирует трафик. Я также должен отметить (обновлю исходный вопрос), что мы получаем большой объем трафика из-за объявлений о работе, которые мы показываем на сайтах семейства SO. Мы движемся со скоростью 15 Мбит / с в каждую сторону в обычные часы.
Михаил Горсух
0

Я видел петлю, реализованную как программный i / f уровня прерывания, так что трафик никогда не выходит за рамки. Может быть, это был тот случай, когда вы запускали loopback? Отказ от ответственности: просто общий вопрос; Я ничего не знаю о FreeBSD.

- Пит

Пит Уилсон
источник
Это не так, как это работает во FreeBSD.
Крис С