Php socket create ошибка соединения при множество запросов, как победить?
Приветствую. Подскажите, с чем может быть связана ошибка отсутствия соединения у клиента с сокетом при множестве запросов через socket_create? То есть например при цикле 5к запросов проходит за несколько секунд, а после «бац» и ошибка соединения.
Технически вопрос я решил, добавив после socket_close usleep(3000), но это же ненормальная история. Это увеличивает время выполнения скрипта, ну и выглядит костылем очевидно. Существуют ли варианты как избежать ошибку?
Пс: проверил, что каждое соединение заканчивается socket_close и соединение не подвисает. То есть будто сервер не успевает где-то внутри закрыть предыдущее соединение, как к нему стучится новое. Именно по этой причине usleep помогает сокету «охладиться». Не знаю, несколько дней ломаю голову. Код сервер-клиент беру с php.net. Настройка SO_REUSEADDR присутствует (соединение с 127.0.0.1).
Посоветуйте, что можно посмотреть, на что обратить внимание?
Смотрите логи ошибки соединения.
Проверьте кол-во одновременных соединений, если примерно в районе 1000, то вы скорее всего наткнулись на лимит файловых дескрипторов.
Дело в том, что php создает для каждого коннекта файл, лимит кол-ва файловых дескрипторов на один процесс по-умолчанию, чтото вроде 1024. Насколько помню, это лимит ОС и лимит php. Поэтому нужно увеличить лимит в Linux, и придется пересобрать php с большим кол-вом.
Либо использовать любой другой язык, без подобных заморочек. Во всяком случае, на python и go, подобных проблем нет, они не используют файловые дескрипторы для каждого соединения.
Заменил на stream, увеличил sysctl -w kern.maxfiles на необходимое число и вроде по первым тестам все заработало.
usleep полностью убрал, но иногда задержки случаются. Например, останавливается на 16к (столько стояло по умолчанию до изменения), немного думает и продолжает. Но это уже лучше, чем раньше.
Это и есть решение проблемы, если кто столкнется с таким. Благодарность Vitsliputsli