Карьера переполнения стека подается примерно так:
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 мс задержки ко всем запросам. Этот интерфейс не является настоящим физическим интерфейсом, но интерфейс карпа .
Может кто-нибудь объяснить мне, почему это было так? Возможно, конфликт с очередью пакетов? Или, возможно, петля всегда быстрее, потому что она «мягкая»? Здесь есть кое-что фундаментальное, что я упускаю, и я надеюсь, что кто-то любезно обучит меня.
networking
performance
freebsd
interface
Михаил Горсух
источник
источник
Ответы:
Постоянная задержка в 100 мс выглядит странно. Похоже, что пакеты буферизуются и не доставляются немедленно. Или, может быть, некоторые из них отброшены и переданы повторно. Можете ли вы запустить tcpdump на этом интерфейсе, чтобы показать проблему? Я не знаю, как стек IP работает во FreeBSD, и как реализован CARP, но возможно ли, например, что ведомое устройство регулярно объявляет свой MAC-адрес с бесплатными ARP и что мастер поочередно отправляет пакеты каждой стороне?
Не могли бы вы также запустить tcpdump на реальном интерфейсе, чтобы ничего не выводилось?
Возможно ли, чтобы система воздерживалась от кэширования записи ARP устройства CARP, тем самым вызывая отправку запроса ARP для каждого пакета сеанса, на который демон CARP должен был бы ответить?
Большинство из них - несколько глупых идей, но это для того, чтобы помочь вам искать в правильном направлении.
источник
Просто для ясности, вы только изменили способ доступа к нему со 127 адреса на локальный IP; правильный?
Если это так, и это имеет значение, что-то не так. Проверьте таблицу маршрутизации
netstat -rn
и посмотрите, на что маршрутизируются локальные IP-адреса, она должна быть перенаправлена на интерфейс lo0 (как 127).Ваш
netstat -rn
вывод должен быть примерно похож на это:источник
Я видел петлю, реализованную как программный i / f уровня прерывания, так что трафик никогда не выходит за рамки. Может быть, это был тот случай, когда вы запускали loopback? Отказ от ответственности: просто общий вопрос; Я ничего не знаю о FreeBSD.
- Пит
источник