Я запускаю службу приложений в 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 и не закрывайте их. По возможности будет использоваться старое соединение.