connection to localhost:9312 failed (errno=99, msg=Cannot assign requested address)

Периодически (1-2 раза в месяц) встречаю такую ошибку при подключении по API (Sphinx 3):
connection to localhost:9312 failed (errno=99, msg=Cannot assign requested address)

Может повторяться 3-10 раз подряд, потом подключается нормально. И снова эти ошибки… и так на протяжении часа, двух или суток. Затем все нормализуется до следующего случая.

В чем может быть дело?

“ping localhost” в консоли в это время каких-либо отклонений не показывает.

API (Sphinx 3)

В смысле инстанс, к которому подключаетесь - Sphinx 3?

API (PHP) от sphinx и сам sphinx на сервере.
Спрашиваю тут, потому что больше негде…

ну лучше переключится на manticore - тк со времен opensource Sphinx, там все очень сильно поменяться должно и почему щас в Sphinx возникает такая ошибка - не понятно

так же вы можете стартовать демон с ключем --logdebug \ --logdebugv для того, чтобы логировать действия на стороне сервера и когда такая ошибка возвращается клиенту, посмотреть в логе демона, что происходило

Вот тут есть некоторые советы Cannot assign requested address | Статья

Ошибка похоже общесетевая, ни к Sphinx, ни к Manticore прямого отношения не имеет.

Проверяю количество активных соединений с 9312 так:

netstat -anlp | grep :9312 | grep TIME_WAIT -wc

Заметил, что когда число превосходит 32000 соединений, начинают ссыпаться эти ошибки. Я так понимаю соединение с 9312 висит какое-то время.
Разве по завершению php-скрипта соединение с портом 9312 не должно автоматически закрываться?
Метод Close() из API проблему с активными соединениями не решает.

В конфиге:


searchd {
listen = 127.0.0.1:9312
listen = 127.0.0.1:9306:mysql41
log = /var/log/sphinxsearch/searchd.log
query_log = /var/log/sphinxsearch/query.log
query_log_format = sphinxql
read_timeout = 57
max_children = 555
pid_file = /var/log/sphinxsearch/searchd.pid
seamless_rotate = 1
preopen_indexes = 1
unlink_old = 1
workers = threads # for RT to work
binlog_path = /var/lib/sphinxsearch/data
}

соединение с портом 9312 не должно автоматически закрываться?

TCP соединения полностью в принципе не закрываются по вызову метода типа Close(). Вот тут Проблемы с очередью TIME_WAIT — Alexander's Blog почитайте “Проблема TIME_WAIT для исходящих соединений” . Там и про вашу изначальную ошибку 99 есть.

В статье приведено много советов, только выбирай.

Спасибо.
Собираюсь поменять логику работы скрипта. Как правильно с помощью API проверить, что соединение связанное с объектом $shpinx активно и готово к получению запросов (перед повторным выполнением метода $sphinx->Query() )?

Вот этого будет достаточно? :

if ($sphinx instanceof SphinxClient && !$sphinx->IsConnectError()) …

Поменял логику работы скрипта.
Сейчас

$sphinx = new SphinxClient();
$sphinx->SetServer(‘localhost’,9312);

Вызывается только один раз за время работы скрипта, но каждый запрос $sphinx->Query(…) похоже создает новое соединение. Может в конфиге надо что-то настроить?

Используйте Open https://github.com/manticoresoftware/manticoresearch/blob/master/api/sphinxapi.php#L1803

Сработало. Количество соединений в режиме ожидания теперь не разрастается.
Непонятно почему Persistent connections не используется по умолчанию…

теперь такой вопрос: возможно ли как-то использовать одно и тоже соединение с 9312 из разных php-скриптов, которые запрашиваются разными пользователями сайта?

В первую очередь это зависит от php-скриптов, а именно в каком режиме php работает. Вот статья PHP: Persistent Database Connections - Manual

Конкретно про sphinxapi - думаю возможно, можно попробовать вместо fsockopen() использовать pfsockopen(), но какие будут последствия предсказать сложно.