Устранение периодически возникающих ошибок исходящего подключения в Службе приложений Azure
Эта статья поможет разобраться с устранением периодических ошибок подключения и связанных проблем с производительностью в Службе приложений Azure В ней содержатся дополнительные сведения о методах устранения неполадок и исчерпании портов преобразования сетевых адресов (SNAT). Если в любой момент при изучении этой статьи вам потребуется дополнительная помощь, обратитесь к экспертам по Azure на форумах MSDN Azure и Stack Overflow. Кроме того, вы можете зарегистрировать инцидент в службе поддержки Azure. Перейдите на сайт поддержки Azure и выберите Получить поддержку.
Симптомы
Приложения и функции, размещенные в службе приложений Azure, могут демонстрировать один или несколько приведенных ниже симптомов:
- Время отклика на всех или некоторых экземпляра в плане обслуживания.
- Временные ошибки 5xx или недопустимые шлюзы
- Сообщение об ошибке истечения времени ожидания
- Не удалось подключиться к внешним конечным точкам (например, SQLDB, Service Fabric, другим службам приложений и т. д.).
Причина
Основная причина возникновения периодических проблем с подключением — достижение предела при создании новых исходящих подключений. Ниже перечислены возможные ограничения.
- TCP Подключение ions: существует ограничение на количество исходящих подключений, которые можно сделать. Ограничение исходящих подключений связано с размером используемого рабочего процесса.
- Порты SNAT. Исходящие подключения в Azure описывают ограничения для портов SNAT и соответствующий эффект для исходящих подключений. Azure использует преобразование адресов исходной сети (SNAT) и подсистемы балансировки нагрузки (не предоставляется клиентам) для взаимодействия с общедоступными IP-адресами. Каждый экземпляр службы приложение Azure изначально получает предварительное количество 128 портов SNAT. Ограничение количества портов 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.
Изменение приложения для использования пулов подключений
- Чтобы составить пул HTTP-подключений, проверьте подключения к пулу по протоколу HTTP с помощью HttpClientFactory.
- Дополнительные сведения о SQL Server и пула соединений см. в разделе Пулы соединений SQL Server (ADO.NET).
Ниже приведена коллекция ссылок для реализации пула Подключение ion по разным стеку решений.
Узел
По умолчанию подключения для NodeJS не сохраняются. Ниже приведены популярные базы данных и пакеты для пулов подключений, содержащие примеры их реализации.
Постоянное HTTP-соединение
Java
Ниже приведены популярные библиотеки для пулов подключений JDBC, содержащие примеры их реализации: JDBC Connection Pooling.
Пулы подключений HTTP
PHP
Хотя PHP не поддерживает пул подключений, вы можете попробовать использовать постоянные подключения к базе данных на сервере.
Сервер MySQL
- Подключения MySQLi для более новых версий
- mysql_pconnect для старых версий PHP
Другие источники данных
Python
Ниже приведены популярные базы данных и модули для пула подключений, которые содержат примеры их реализации.
Пулы подключений HTTP
- Пул подключений HTTP включен по умолчанию в модуле "Запросы ".
- Urllib3
Изменение приложения для повторного использования подключений
- Дополнительные указатели и примеры управления подключениями в функциях Azure см. в статье "Управление подключениями" в Функции Azure.
Изменение приложения для использования менее "жесткой" логики повторных попыток
- Дополнительные рекомендации и примеры см . в шаблоне повторных попыток.
Использование проверки активности для сброса времени ожидания простоя исходящих подключений
- Чтобы реализовать проверку активности для приложений Node.js, изучите раздел Мое приложение Node выполняет избыточные исходящие вызовы.
Дополнительные рекомендации для Служба приложений:
- Нагрузочный тест должен имитировать реальные данные на постоянной скорости передачи. Тестирование приложений и функций при реальной интенсивной нагрузке позволяет заранее определить и устранить проблемы нехватки портов 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-подключения
Имя ограничения | Description | Мелкий (A1) | Средний (A2) | Крупный (A3) | Изолированный уровень (ASE) |
---|---|---|---|---|---|
Связи | Количество подключений для всей виртуальной машины | 1920 | 3968 | 8064 | 16 000 |
Чтобы избежать исходящих ограничений TCP, можно либо увеличить размер рабочих процессов, либо прибегнуть к горизонтальному масштабированию.
Устранение неполадок
Знание двух типов ограничений исходящих подключений и действий, выполняемых приложением, должно упростить устранение неполадок. Если вы уверены, что ваше приложение выполняет много вызовов одной и той же учетной записи хранения, причина может быть в ограничении SNAT. Если приложение создает большое количество вызовов конечных точек по всему Интернету, вы подозреваете, что достигнете предела виртуальной машины.
Если вы не знаете достаточное поведение приложения, чтобы быстро определить причину, существуют некоторые средства и методы, доступные в Служба приложений, чтобы помочь с этим определением.
Поиск сведений о выделении портов SNAT
Вы можете использовать диагностику Службы приложений, чтобы найти сведения о выделении портов SNAT и просмотреть метрику выделения портов SNAT сайта службы приложений. Чтобы найти сведения о выделении портов SNAT, выполните следующие действия.
- Чтобы открыть диагностику Службы приложений, выберите веб-приложение Службы приложений или Среду службы приложений на портале Azure. На панели навигации слева выберите раздел Диагностика и решение проблем.
- Теперь выберите категорию Доступность и производительность.
- Выберите плитку "Нехватка портов 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-адрес или перенастроить члены внутреннего пула, чтобы избежать конфликтов.
Имя ограничения | Description | Мелкий (A1) | Средний (A2) | Крупный (A3) | Изолированный уровень (ASE) |
---|---|---|---|---|---|
Связи | Количество подключений для всей виртуальной машины | 1920 | 3968 | 8064 | 16 000 |
Веб-задания и подключения к базе данных
Если порты SNAT исчерпаны, а веб-задания не могут подключаться к База данных SQL, метрика не отображается, сколько подключений открывает каждый отдельный процесс веб-приложения. Чтобы найти проблемное веб-задание, переместите несколько заданий в другой план службы приложений, чтобы узнать, улучшается ли ситуация или остается проблема в одном из планов. Повторите эту процедуру, пока не найдете проблемное веб-задание.