Как curl 8.20.0 исправил хаос с DNS и потоками: разбор пулинга ресурсов

Как curl 8.20.0 исправил хаос с DNS и потоками: разбор пулинга ресурсов

Май 01, 2026 curl dns resolution threading performance optimization system architecture open source development

Проблема с потоками DNS в curl, о которой все молчат

Представьте: вы запускаете curl с кучей параллельных запросов, и внутри библиотеки творится хаос с DNS-разрешениями. Звучит знакомо? Если нет, то сейчас всё узнаете.

Раньше в curl для каждого параллельного соединения создавался отдельный поток. Плюс socketpair (или eventfd на Linux) для обмена данными. Звучит расточительно? И это так.

При небольшом числе запросов — фигня. А вот в серьёзных проектах с тысячами соединений? Каждый поток жрёт память, CPU и ресурсы ОС. Socketpair добавляет нагрузку на дескрипторы файлов. Умножьте на тысячи — и вуаля, полный завал ресурсов. Всё растёт линейно.

Хуже того: если разрешение DNS зависло, то и очистка easy handle блокировалась. Удалить handle с застрявшим потоком? Привет, дедлок в приложении.

Старый хак (и почему он сосал)

Команда curl ввела CURLOPT_QUICK_EXIT. Устанавливаешь — и потоки отцепляются, не ждут завершения. Идеально для приложений, которые вот-вот умрут. Но если программа живёт долго? Потоки накапливались в памяти, как призраки, жрали ресурсы до конца процесса.

Классический костыль.

Пул потоков: революция в curl 8.20.0

Новая версия curl меняет всё. Теперь пул потоков на уровне multi handle.

Смотрите, как это работает:

Один пул на multi handle

Забудьте про поток на каждый easy handle. Один пул на multi handle:

  • Запускает потоки по мере нужды (без лишнего старта).
  • Убивает неактивные через время простоя.
  • Ставит DNS-запросы в очередь.
  • Раздаёт результаты через общий канал.
  • Отправляет готовые разрешения нужному easy handle.

Ключевой плюс: один socketpair на весь multi handle. Сколько ни соединений — дескрипторов не множится. Для сотен или тысяч трансферов это спасение.

Вы в деле: полный контроль

Новая опция CURLMOPT_RESOLVE_THREADS_MAX ограничивает число потоков в пуле. По умолчанию 20, но команда curl ждёт отзывов для доработки.

Хотите 5 потоков, чтобы CPU шёл на логику приложения? Легко. Нужно 50 для скорости? Без проблем.

Появилась CURLMOPT_QUICK_EXIT на уровне multi. Работает как раньше — для быстрого выхода без ожидания. Теперь easy handle не привязаны к потокам, так что удаление безопасно. Поздние DNS-результаты? Просто сливаем в /dev/null. Чисто и предсказуемо.

Прирост производительности (почти всегда)

Экономия ресурсов — это одно. А пул даёт бонус: разрешения DNS идут в уже запущенные потоки. Нет старта, аллокаций, лишних системных вызовов.

Скорость взлетит? Зависит от вашего кода и железа. Но везде лучше: меньше свитчинга контекста, стабильнее задержки.

Минусы: новый код — новые баги

Изменения серьёзные. Больше кода, больше углов. Разрабы уверены, что ничего не сломали, но рефакторинг — это всегда лотерея. Тестируйте в своём окружении.

Что это даёт именно вам

Высоконагруженные приложения (скраперы, пайплайны данных, массовые загрузчики) с тысячами соединений: память меньше, CPU эффективнее, ресурсы предсказуемы. Апгрейд must-have.

Embedded и IoT: где каждый байт на счету, сокращение потоков и дескрипторов — золото.

Обычный масштаб: улучшения незаметны, но DNS быстрее, вызовов меньше. Инфраструктура скажет спасибо.

Взгляд шире

DNS 2026 в curl (а пул потоков — его звезда) показывает, как работает зрелая разработка. Проблему нашли, решение чистое, совместимость сохранена, опции новые. Ничего не сломали, всё улучшили.

Так бывает, когда оупенсорс берёт производительность на серьёз.


Пробовали curl 8.20.0? Переходите на новую версию? Пишите в комментах свой опыт — команда curl реально учитывает фидбек для таких фич.

Read in other languages:

BG EL CS UZ TR SV FI RO PT PL NB NL HU IT FR ES DE DA ZH-HANS EN