Så fik curl 8.20.0 bugen med DNS-tråde: En dybdegående gennemgang af resource pooling
DNS-tråd-problemet, ingen tager op
Har du nogensinde tænkt over, hvad der sker, når curl skal håndtere dusinvis af DNS-opslag på én gang? Det gamle system i curl skabte kaos med tråde.
Førhen startede curl en ny tråd til hver parallelle forbindelse. Plus en socketpair – eller eventfd på Linux – for at koordinere svar. Det lød simpelt, men var totalt ineffektivt.
Ved få overførsler mærkede du intet. Men i store applikationer med tusindvis af samtidige forbindelser? Hver tråd spiste hukommelse, CPU og systemressourcer. Socketpairs fyldte file descriptors op. Resultatet: lineær ressourceeksplosion.
Værre var det, hvis et DNS-svar hang. Så blokerede det hele oprydningen. Fjernede du en easy handle midt i det? Hele appen låste.
Den gamle løsning – og dens svagheder
Curl havde en midlertidig fix: CURLOPT_QUICK_EXIT. Den frigjorde tråde uden at vente. Fedt til apps, der lukkede ned. Men hvis din app kørte videre? Tråde hobede sig op i hukommelsen som zombier.
Det var ren nødlelsning.
Thread pooling revolutionerer det hele i curl 8.20.0
Nyeste curl-version dropper det gamle og indfører thread pooling på multi handle-niveau.
Her er den smarte nye model:
Én pool til hele multi handlet
I stedet for tråd pr. easy handle får du én håndteret pool pr. multi handle. Den:
- Starter tråde efter behov – ingen spild
- Lukker inaktive tråde automatisk
- Køer DNS-forespørgsler
- Sender svar via ét fælles system
- Fordeler resultater til rettet easy handle
Nøglen? Kun én socketpair pr. multi handle, uanset antallet af parallelle jobs. Perfekt til apps med hundreder eller tusindvis af overførsler.
Du styrer selv
Ny option CURLMOPT_RESOLVE_THREADS_MAX lader dig sætte max antal resolver-tråde. Standard er 20, men det finpudses med feedback.
Ingen mere vild vækst i ressourcer. Vil du begrænse til 5 tråde for at spare CPU? Gør det. Har brug for 50 til max hastighed? Muligt.
Ny CURLMOPT_QUICK_EXIT på multi-niveau styrer poolens nedlukning. Brug det ved procesafslut – ingen ventetid. Easy handles ejer ikke længere egne tråde, så du fjerner dem sikkert. Svar der kommer for sent? Smidt væk. Rent og forudsigeligt.
Ydeevneboosten – mest på store skalaer
Udover besparelser kommer en ekstra gevinst: DNS-job kører ofte i eksisterende tråde. Ingen startup-omkostninger, færre allokeringer, mindre systemkald.
Stor hastighedsgevinst? Afhænger af din app og maskine. Men altid bedre: mindre kontekstskift, jævnere latency.
Ny kode betyder nye fejl
Dette er en kæmpe omstrukturering. Mere kode, flere dele, potentielle kanter.
Udviklerne tror ikke på katastrofer, men test selv i din setup. Store ændringer afslører bugs.
Hvad betyder det for dig?
Høj-throughput apps med tusindvis af parallelle forbindelser – som scrapere, datapipelines eller downloadere – får massiv opgradering i curl 8.20.0+. Lavere hukommelse, bedre CPU, stabilt ressourceforbrug.
Embedded eller IoT-systemer vinder på færre tråde og descriptors. Hver besparelse tæller.
Småskala brugere nyder usynlige forbedringer: hurtigere DNS, færre kald. Din infra takker dig.
Det store billede
Curls DNS 2026-projekt – hvor thread pooling er en stjerne – viser moden open source-ingeniørkunst. Problemet identificeret, elegant løsning, fuld bagudkompatibilitet plus nye knobs. Intet ødelagt, alt forbedret.
Sådan ser seriøs optimering ud.
Har du testet curl 8.20.0? Opdaterer du din infra? Smid en kommentar med dine oplevelser – curl-folket lytter til feedback og justerer.