Я пытаюсь обновить большое количество записей кушетки (порядка миллионов), используя PHP-интерфейс Curl, и сталкиваюсь с ошибкой Curl после обработки 30 000-записей. Это бросание:
"Failed to connect to 127.0.0.1: Cannot assign requested address"
Другие ответы на StackOverflow и в Интернете указали, что это результат того, что в системе не хватает ресурсов, а именно портов. Периодически проверяя количество портов, застрявших в TIME_WAIT (netstat -an | grep TIME_WAIT | wc -l), это действительно так.
Глядя на мой код, я вызываю curl_init () и curl_close () для каждого обновления сообщения PUT, так что это имеет смысл, и если бы я пытался получить миллионы просмотров, я мог бы просто установить curl ресурс один раз, запустите мои представления, затем закройте его.
Однако, поскольку обновление записи CouchDB включает docID как часть строки URL, каждая из миллионов целей является фактически уникальными URL. Я могу перерабатывать и повторно использовать один ресурс curl, переназначая его для каждого PUT, но это значительно медленнее, чем просто отказаться от них в чистилище TIME_WAIT и установить новое соединение. Хотя это работает, при обновлении миллионов записей производительность имеет значение.
SO_REUSEADDR и SO_REUSEPORT выглядят как интересные идеи, но из того, что я смог найти, они существуют только на уровне необработанных сокетов. Поскольку мы взаимодействуем с Curl через PHP, я не могу найти способ настроить их, чтобы посмотреть, могут ли они помочь.
Есть ли какой-нибудь умный способ утилизировать ресурс curl при обновлении Couch, о котором я даже не думал?
Есть ли способ установить SO_REUSEADDR / PORT для Curl в PHP?
Есть ли способ ускорить освобождение ресурсов после того, как я закончу и «curl_close ()»?
Задача ещё не решена.
Других решений пока нет …