Как curl 8.20.0 оправи многопоточните DNS грешки: всичко за resource pooling

Как curl 8.20.0 оправи многопоточните DNS грешки: всичко за resource pooling

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

Проблемът с нишките в DNS, за който никой не говори

Ако някога сте се чудили какво се случва зад кулисите, когато curl обработва десетки паралелни DNS заявки, ще се изненадате. Или поне ще вдигнете вежди.

Дотук curl създаваше нова нишка за всяка паралелна връзка. Създаваше и socketpair (или eventfd на Linux) за координация. Ефективно? Ни най-малко.

При малко трансфери не се усеща. Но при хиляди връзки в големи приложения? Чакайте касапница. Всяка нишка яде памет, CPU и системни ресурси. Socketpair-ите добавят още натоварване по file descriptors. Умножете по хиляди easy handles – и имате линейно нарастващ кошмар.

По-лошо: ако една DNS заявка забие, целият процес за почистване спира. Премахване на easy handle с застанала нишка? Здравейте, deadlock.

Старото разрешение (и защо не беше идеално)

Екипът на curl имаше лепенец – CURLOPT_QUICK_EXIT. Пускаше нишките без да чака края им. Добре за приложения, които спираха. Но ако програмата ти работи дълго? Нишки се трупат в паметта като призраци, ядат ресурси до края.

Класически хак.

Нишки в басейн: Революцията от curl 8.20.0

Новото издание хвърля стария подход и вкарва thread pooling на ниво multi handle.

Новият дизайн е прост и елегантен:

Един басейн нишки за всичко

Вместо нишка на easy handle, един управляем басейн на multi handle. Той:

  • Стартира нишки само когато трябва (без излишни)
  • Спира неактивните след пауза
  • Редя DNS заявките
  • Връща резултати през споделен механизъм
  • Разпределя ги към правилния easy handle

Ключът? Един socketpair на multi handle, колкото и връзки да имаш. Огромно спестяване на file descriptors при стотици или хиляди трансфери.

Ти контролираш всичко

Новата опция CURLMOPT_RESOLVE_THREADS_MAX ограничава броя нишки. Стандартно 20, но ще се доработи според тестове.

Нямаш повече хаос. Искаш 5 нишки, за да спестиш CPU? Задай 5. Трябват 50 за скорост? Лесно.

Има нов CURLMOPT_QUICK_EXIT на ниво multi. Работи като преди, но сега е безопасно – easy handles нямат свои нишки. Премахваш handle, късни DNS-и се изхвърлят. Чисто и без изненади.

По-бързина (обикновено)

Освен спестени ресурси, басейнът дава бонус: DNS заявки вървят в вече работещи нишки. Без стартиране, без нови алокации, без излишни системни повиквания.

Ще усетиш гигантски скок? Зависи от твоята система. Но винаги е по-добре – по-малко операции, контекстни смени и забавяния.

Реалността: Нов код, нови буболечки

Това е голяма промяна. Повече код, повече части. Повече места за грешки.

Разработчиците са сигурни, че няма катастрофа, но при рефакторинг винаги изскачат буболечки. Тествай новия curl в твоята среда.

Какво значи за теб

За високоскоростни приложения с хиляди връзки (скрапъри, data pipelines, масови свалячи) – curl 8.20.0+ е голям ъпгрейд. По-малко памет, CPU и предвидимост.

За вградени системи или IoT – всяко спестено байт и цикъл брои. По-малко нишки и file descriptors правят разлика.

При обикновена употреба – подобренията са тихи. DNS по-бързо, по-малко системни повиквания. Инфраструктурата ти ще ти благодаря.

По-широката картина

Това е част от DNS 2026 плана на curl – пример за зряло инженерство. Намерили проблема, направили чисто решение, запазили съвместимост и добавили опции. Нищо не счупили, всичко подобрили.

Така работи отворения софтуер, когато мислят за производителност.


Тествал ли си curl 8.20.0? Прехвърляш ли инфраструктурата? Пиши в коментарите – екипът на curl чете и доработва според реални отзиви.

Read in other languages:

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