У меня есть небольшой PHP-скрипт, который выполняет (в идеале) 10000 многократных запросов на скручивание в 250 скользящих окнах. Я использую библиотеку chuyskywalker / roll-curl и скомпилировал php / curl / c-ares из исходного кода для включения AsynchDNS.
Сначала он работал отлично, и я был очень доволен этим, однако я заметил, что после 1000 запросов (1024, может быть …) curl, кажется, просто отправляет запросы, затем сдается и говорит, что не может связаться с DNS-сервером.
Я считаю, что это как-то связано с ограничениями дескриптора файла, потому что, когда я сделал ulimit -Sn
Я видел, что это было в 1024 (то же самое место, локоть начинает сдаваться), поэтому я поднял предел, и ему удалось пройти дальше через пробежку, затем я снизил предел, и он снова остановился в том же месте. В настоящее время я установил ограничение в 65535, изменив /etc/security/limits.conf на
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
и я думал, что все было исправлено, пока я не попытался запустить 10 000 URL с тем же 250-летним окном, после чего curl снова начал сдаваться, но гораздо позже.
При выполнении cd /proc/procid/fd and ls -l | wc -l
Я вижу, что процесс достигает 6500 файловых дескрипторов (не 65535), а затем вызывает проблемы в завитке.
Может кто-нибудь объяснить мне, как curl использует эти файловые дескрипторы? и если есть какой-нибудь способ, которым я могу преодолеть эту проблему?
Задача ещё не решена.
Других решений пока нет …