Устранение периодически возникающих ошибок исходящего подключения в Службе приложений Azure

Эта статья поможет разобраться с устранением периодических ошибок подключения и связанных проблем с производительностью в Службе приложений Azure В этом разделе содержатся дополнительные сведения о методологиях и способах устранения неполадок и исчерпания портов SNAT. Если в любой момент при изучении этой статьи вам потребуется дополнительная помощь, обратитесь к экспертам по Azure на форумах MSDN Azure и Stack Overflow. Кроме того, вы можете зарегистрировать инцидент в службе поддержки Azure. Перейдите на сайт поддержки Azure и выберите Получить поддержку.

Симптомы

Приложения и функции, размещенные в службе приложений Azure, могут демонстрировать один или несколько приведенных ниже симптомов:

  • Время отклика на всех или некоторых экземпляра в плане обслуживания.
  • Временные ошибки 5xx или недопустимые шлюзы
  • Сообщение об ошибке истечения времени ожидания
  • Не удалось подключиться к внешним конечным точкам (например, SQLDB, Service Fabric, других служб приложений и т. д.).

Причина

Основная причина возникновения периодических проблем с подключением — достижение предела при создании новых исходящих подключений. Ниже перечислены возможные ограничения.

  • TCP-подключения. Существует ограничение на разрешенное количество исходящих подключений. Ограничение исходящих подключений связано с размером используемого рабочего процесса.
  • Порты SNAT. Исходящие подключения в Azure описывают ограничения для портов SNAT и соответствующий эффект для исходящих подключений. Azure использует преобразование адресов исходной сети (SNAT) и подсистемы балансировки нагрузки (не предоставляется клиентам) для взаимодействия с общедоступными IP-адресами. Каждому экземпляру в службе приложений Azure изначально присвоено предварительно выделенное количество портов SNAT — 128. Ограничение количества портов SNAT влияет на открытие соединений с одним и тем же сочетанием адреса и порта. Если приложение создает подключения к разным сочетаниям адресов и портов, доступные порты SNAT не закончатся. Порты SNAT заканчиваются при многократных вызовах с одним и тем же сочетанием адреса и порта. После освобождения порта он доступен для повторного использования по мере необходимости. Подсистема балансировки сетевой нагрузки Azure освобождает порт SNAT от закрытых подключений только по истечение 4 минут ожидания.

Если приложения или функции быстро открывают новое подключение, они могут быстро исчерпать выделенные квоты в 128 портов. Будет происходить блокировка до тех пор, пока не станет доступен новый порт SNAT, либо через динамическое выделение дополнительных портов SNAT, либо путем повторного использования освобожденного порта SNAT. Если у приложения закончились доступные порты SNAT, это приведет к возникновению временных проблем с исходящими подключениями.

Как избежать этой проблемы

Существует несколько решений, позволяющих избежать ограничения портов SNAT. К ним относятся следующие:

  • пулы подключений. Путем объединения подключений можно избежать открытия новых сетевых подключений для вызовов с одним и тем же адресом и портом.
  • конечные точки службы. Нет ограничения на порты SNAT для служб, защищенных с помощью конечных точек служб.
  • частные конечные точки. Нет ограничения на порты SNAT для служб, защищенных с помощью частных конечных точек.
  • Шлюз NAT: при использовании шлюза NAT вы получаете 64 тысячи портов SNAT для исходящего трафика, которые можно использовать для ресурсов, отправляющих трафик.

Чтобы избежать проблем с портами SNAT необходимо исключить повторное создание новых подключений для одного и того же узла и порта. Пулы соединений являются одним из наиболее очевидных способов решения этой проблемы.

Если назначением является служба Azure, которая поддерживает конечные точки службы, то проблем нехватки портов SNAT можно избежать, используя интеграцию региональной виртуальной сети и конечные точки службы или частные конечные точки. При использовании региональной интеграции виртуальной сети и размещении конечных точек службы в подсети интеграции исходящий трафик приложения к этим службам не будет иметь исходящих ограничений на порты SNAT. Аналогичным образом, если вы используете интеграцию с региональной виртуальной сетью и частные конечные точки, у вас не будет проблем с исходящим портом SNAT для этого назначения.

Если расположением назначения является внешняя конечная точка за пределами Azure, то при использовании шлюза NAT вы получите 64 тысячи портов SNAT для исходящего трафика. Кроме того, в этом случае предоставляется выделенный исходящий адрес, который не является общедоступным для всех пользователей пользователям.

По возможности улучшайте код — используйте пулы соединений и избегайте возникновения такой ситуации. Не всегда есть возможность быстро изменить код, чтобы устранить эту ситуацию. В случаях, когда невозможно изменить код вовремя, воспользуйтесь другими решениями. Наилучшим решением проблемы является оптимальное объединение всех доступных решений. Попробуйте использовать конечные точки служб и частные конечные точки для служб Azure и шлюз NAT для остальных служб.

Общие стратегии по устранению нехватки портов SNAT обсуждаются в разделе решение проблем в документации по исходящим подключениям Azure. Следующие стратегии применимы к приложениям и функциям, размещенным в службе приложений Azure.

Изменение приложения для использования пулов подключений

Ниже приведена коллекция ссылок для реализации пулов соединений по разным стекам решений.

Узел

По умолчанию подключения для Node.js не поддерживаются. Ниже приведены популярные базы данных и пакеты для пулов подключений, содержащие примеры их реализации.

Постоянное HTTP-соединение

Java

Ниже приведены популярные библиотеки для пулов подключений JDBC, содержащие примеры их реализации: JDBC Connection Pooling.

Пулы подключений HTTP

PHP

Хотя PHP не поддерживает пулы подключений, можно попытаться использовать постоянные подключения к базам данных на внутреннем сервере.

Изменение приложения для повторного использования подключений

Изменение приложения для использования менее "жесткой" логики повторных попыток

Использование проверки активности для сброса времени ожидания простоя исходящих подключений

Дополнительные рекомендации, относящиеся к Службе приложений:

  • Нагрузочный тест должен имитировать реальные данные на постоянной скорости передачи. Тестирование приложений и функций при реальной интенсивной нагрузке позволяет заранее определить и устранить проблемы нехватки портов SNAT.
  • Убедитесь, что серверные службы могут быстро возвращать ответы. Для устранения проблем с производительностью базы данных SQL Azure ознакомьтесь с разделом Устранение проблем производительности базы данных SQL Azure с Intelligent Insights.
  • Масштабирование плана службы приложений до большего количества экземпляров. Дополнительные сведения о масштабировании см. в статье Увеличение масштаба приложения в Azure. Каждому рабочему экземпляру в плане службы приложений выделяется несколько портов SNAT. Если вы разбиваете использование в нескольких экземплярах, то можете получить использование порта SNAT на экземпляр ниже рекомендуемого ограничения в 100 исходящих подключений на уникальную конечную точку.
  • Рассмотрите возможность перехода на Среду службы приложений (ASE), где выделяется один исходящий IP-адрес, а ограничения для подключений и портов SNAT значительно выше. В ASE количество портов SNAT на экземпляре основано на таблице предварительного распределения балансировщика нагрузки Azure, так что, например, ASE с 1–50 рабочими экземплярами имеет 1024 предварительно выделенных порта на экземпляр, а ASE с 51–100 экземплярами — 512 предварительно выделенных портов на экземпляр.

Избежание исходящих TCP-ограничений проще в решении, так как ограничения задаются размером рабочего процесса. Ограничения можно просмотреть в разделе Числовые ограничения между ВМ в "песочнице" — TCP-подключения

Имя ограничения Описание Малое (A1) Среднее (A2) Большое (A3) Изолированный уровень (ASE)
Соединения Количество подключений для всей виртуальной машины 1920 3968 8064 16 000

Чтобы избежать исходящих ограничений TCP, можно либо увеличить размер рабочих процессов, либо прибегнуть к горизонтальному масштабированию.

Устранение неполадок

Знание двух типов ограничений исходящих подключений и действий, выполняемых приложением, должно упростить устранение неполадок. Если вы уверены, что ваше приложение выполняет много вызовов одной и той же учетной записи хранения, причина может быть в ограничении SNAT. Если приложение создает большое количество вызовов конечных точек через Интернет, то, вероятно, достигнут предел для виртуальной машины.

Если вы не уверены в поведении приложения, достаточного для быстрого определения причины, есть некоторые средства и методы, доступные в Службе приложений, которые могут помочь ее определить.

Поиск сведений о выделении портов SNAT

Вы можете использовать диагностику Службы приложений, чтобы найти сведения о выделении портов SNAT и просмотреть метрику выделения портов SNAT сайта службы приложений. Чтобы найти сведения о выделении портов SNAT, выполните следующие действия.

  1. Чтобы открыть диагностику Службы приложений, выберите веб-приложение Службы приложений или Среду службы приложений на портале Azure. На панели навигации слева щелкните Диагностика и решение проблем.
  2. Теперь выберите категорию Доступность и производительность.
  3. Выберите плитку "Нехватка портов SNAT" в списке доступных плиток в категории. Рекомендуется не устанавливать его выше 128. Если это необходимо, вы по-прежнему можете открыть запрос в службу поддержки, и инженер службы поддержки сможет получить метрику из серверной части.

Так как использование порта SNAT недоступно в качестве метрики, автомасштабирование с использованием порта SNAT невозможно, как и настройка автоматического масштабирования на основе метрики распределения портов SNAT.

TCP-подключения и порты SNAT

TCP-подключения и порты SNAT не связаны напрямую. Детектор использования TCP-подключений включен в раздел диагностики и устранения проблем любого сайта Службы приложений. Выполните поиск по фразе "TCP connections" (TCP-подключения).

  • Порты SNAT используются только для внешних сетевых потоков, тогда как общее количество TCP-подключений включает локальные соединения с замыканием на себя.
  • Порт SNAT может совместно использоваться различными потоками, если потоки различаются в протоколе, IP-адресе или порте. Метрика TCP-подключений учитывает каждое TCP-подключение.
  • Ограничение TCP-подключений происходит на уровне экземпляра рабочего процесса. Исходящая балансировка сетевой нагрузки Azure не использует метрику подключений TCP для ограничения портов SNAT.
  • Ограничения TCP-подключений описаны в разделе Числовые ограничения между ВМ в "песочнице" — TCP-подключения
  • Существующие сеансы TCP завершатся ошибкой при создании новых исходящих сеансов TCP из исходного порта службы приложений Azure. Чтобы избежать конфликтов, можно использовать один IP-адрес или перенастроить элементы внутреннего пула.
Имя ограничения Описание Малое (A1) Среднее (A2) Большое (A3) Изолированный уровень (ASE)
Соединения Количество подключений для всей виртуальной машины 1920 3968 8064 16 000

Веб-задания и подключения к базе данных

Если порты SNAT исчерпаны, когда веб-заданиям не удается подключиться к Базе данных SQL, то нет никакой метрики, показывающей, сколько подключений открывается каждым процессом отдельного веб-приложения. Чтобы найти проблемное веб-задание, переместите несколько заданий в другой план службы приложений, чтобы узнать, улучшается ли ситуация или остается проблема в одном из планов. Повторите эту процедуру, пока не найдете проблемное веб-задание.

Дополнительные сведения