Устранение периодически возникающих ошибок исходящего подключения в Службе приложений 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.

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

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

Узел

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

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

Java

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

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

PHP

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

Python

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

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

  • В модуле "Запросы " включены пулы подключений По умолчанию.
  • Urllib3

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

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

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

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

  • Нагрузочный тест должен имитировать реальные данные на постоянной скорости передачи. Тестирование приложений и функций при реальной интенсивной нагрузке позволяет заранее определить и устранить проблемы нехватки портов 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, метрика, показывающее количество подключений, открытых каждым процессом веб-приложения, отсутствует. Чтобы найти проблемное веб-задание, переместите несколько заданий в другой план службы приложений, чтобы узнать, улучшается ли ситуация или остается проблема в одном из планов. Повторите эту процедуру, пока не найдете проблемное веб-задание.

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