Назад | Перейти на главную страницу

В приложении Azure MySQL: обычно разрешено только одно использование каждого адреса сокета

Я запускаю службу приложений в Azure с приложением PHP и встроенной базой данных MySQL. Эта служба приложений получает множество мелких запросов (например, получение или обновление таблицы лидеров для игры).

Часто в файле журнала приложения PHP появляется следующее предупреждение:

PHP Warning:  mysqli_connect(): (HY000/2002): Only one usage of each socket address (protocol/network address/port) is normally permitted.

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

Как я могу настроить это в Azure, чтобы это предупреждение исчезло или стало намного реже? Я использую close() на моих объектах mysqli, чтобы очистить соединение, но, как я правильно понимаю, это не сразу освобождает базовые ресурсы в ОС.

Заранее спасибо!

Проблема в том, как закрываются TCP / IP-соединения:

  • Вы просите закрыть соединение (FIN),
  • Сервер подтверждает, что получил ваш запрос (ACK), а также просит закрыть свою сторону (FIN),
  • Вы подтверждаете (ACK) это и ждать 4 минуты (TIME_WAIT state), чтобы быть уверенным, что никакие пакеты, отправленные сервером и задержанные сетью, не придут. В это время вы не можете использовать тот же порт для подключения к серверу.

mysqli вероятно, использует несколько исходных портов, но даже если он использует их все, ограничение составляет около 270 подключений в секунду.

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