Cum a rezolvat curl 8.20.0 problemele de threading la rezolvarea DNS: pooling-ul de resurse dezvăluit
Problema DNS cu fire de execuție pe care nimeni n-o discută
Ai băgat vreodată capul în culisele curl-ului când rezolvă zeci de DNS-uri simultan? Pregătește-te pentru o surpriză – sau poate un motiv de îngrijorare.
Până nu demult, resolver-ul threaded din curl funcționa cam așa: pentru fiecare conexiune paralelă, pornea un thread nou și deschidea un socketpair (sau eventfd pe Linux) ca să coordoneze rezultatele. Ineficient? Total.
La câteva transferuri, nu simțeai nimic. Dar la aplicații enterprise cu mii de conexiuni concurente? Acolo începea haosul. Fiecare thread mânca memorie, CPU și resurse OS. Fiecare socketpair adăuga overhead pe file descriptori. Înmulțește cu mii de easy handles și ai un dezastru de resurse care crește liniar.
Mai rău: dacă un DNS se bloca, curăța procesul întreg se oprea în loc. Scoți un easy handle cu thread-ul blocat? Bun venit în deadlock.
Soluția veche (și de ce era proastă)
Echipa curl avea un plasture: CURLOPT_QUICK_EXIT. Activezi opțiunea, detașezi thread-urile în loc să le aștepți – ideal dacă ieși din aplicație. Dar dacă app-ul rulează non-stop? Thread-urile detașate se adunau în memorie ca niște fantome, consumând resurse până la shutdown.
Un hack clasic.
Pool de thread-uri: revoluția din curl 8.20.0
Noua versiune aruncă modelul vechi la gunoi și introduce pool de thread-uri la nivel de multi handle.
Arhitectura e simplă și elegantă:
Un singur pool de thread-uri pentru toate conexiunile
Nu mai e un thread per easy handle. Ai un pool gestionat per multi handle care:
- Pornește thread-uri doar când trebuie (fără risipă)
- Oprește thread-urile idle după inactivitate
- Pune la coadă cererile de rezoluție DNS
- Trimite rezultatele printr-un mecanism comun de notificări
- Livrează rezoluțiile finalizate easy handle-ului corect
Cel mai tare? Un singur socketpair per multi handle, indiferent de câte conexiuni ai. Reducere uriașă de file descriptori la sute sau mii de transferuri.
Controlezi totul
Noua opțiune CURLMOPT_RESOLVE_THREADS_MAX îți lasă mână liberă să limitezi thread-urile max. Default: 20, dar se ajustează după feedback real.
Nu mai depinzi de consum necontrolat. Vrei 5 thread-uri ca să lași CPU pentru logica ta? Setezi 5. Ai nevoie de 50 pentru viteză maximă? Faci ce vrei.
Plus un CURLMOPT_QUICK_EXIT la nivel multi, care gestionează shutdown-ul pool-ului. Folosește-l la terminare, fără să aștepți curățenie. Easy handles se scot fără griji de thread-uri blocate.
Rezoluții DNS târzii după ștergerea handle-ului? Aruncate direct. Curat, previzibil.
Câștig de performanță (de obicei)
Pe lângă economii de resurse, pool-ul aduce un boost subtil: multe DNS-uri se rezolvă în thread-uri deja pornite. Fără startup overhead, fără alocări repetate, fără syscalls inutile.
Vei simți o explozie de viteză? Depinde de app și sistem. Dar e întotdeauna mai bun – mai puține operații, context switching redus, latență predictibilă.
Realitatea: cod nou, bug-uri noi
Schimbare mare de arhitectură înseamnă mai mult cod. Mai multe piese. Mai multe colțuri unde se ascund edge cases.
Dezvoltatorii curl zic că n-au băgat bombe, dar orice refactor aduce bug-uri. Testează serios noua versiune în mediul tău.
Ce înseamnă asta pentru tine
Construiești app-uri high-throughput cu mii de conexiuni paralele (scraper-e web, tool-uri de date, downloadere distribuite)? Curl 8.20.0+ e un upgrade serios. Memorie mai puțină, CPU eficient, resurse previzibile.
Trimite embedded sau IoT unde fiecare byte și ciclu contează? Overhead-ul redus la thread-uri și file descriptori face diferența.
Folosești curl la scară mică? Îmbunătățirile sunt acolo, dar invizibile. DNS-uri un pic mai rapide, mai puține apeluri sistem. Infrastructura ta zâmbește.
Imaginea de ansamblu
Ceea ce impresionează la inițiativa DNS 2026 a curl-ului (unde pooling-ul e piesa centrală) e ingineria matură: problemă identificată, soluție curată, compatibilitate păstrată, opțiuni noi. N-au spart nimic, au îmbunătățit totul.
Asta se întâmplă când open-source-ul ia performanța și resursele în serios.
Ai testat curl 8.20.0? Migrezi infrastructura? Lasă un comentariu cu experiențele tale – echipa curl bagă feedback-ul real în decizii.