Curl 8.20.0 fixt DNS-threading: diepgaand over resource pooling
Het DNS-threadingprobleem dat niemand bespreekt
Stel je voor: je laat curl tientallen DNS-opzoekingen tegelijk uitvoeren. Wat gebeurt er dan onder de motorkap? Het oude systeem van curl was een ramp qua efficiëntie.
Voor elke parallelle verbinding maakte curl een aparte thread aan, plus een socketpair (of eventfd op Linux) om resultaten door te geven. Bij een paar transfers merk je er weinig van. Maar bij duizenden gelijktijdige connecties? Dan slurpen al die threads geheugen, CPU en OS-bronnen. Socketpairs stapelen file descriptors op. Het resultaat: een lineaire explosie van resource-verbruik.
Erger nog: een vastlopende DNS-resolutie blokkeerde de hele opruiming. Wil je een easy handle verwijderen terwijl de thread hangt? Hallo deadlock.
De oude pleisteroplossing (en waarom die faalde)
Curl had CURLOPT_QUICK_EXIT als noodoplossing. Threads werden losgekoppeld in plaats van netjes beëindigd – handig bij app-afsluiting. Maar bij doorlopende applicaties bleven ze als spoken in het geheugen hangen. Een rommelige fix.
Thread pooling: de doorbraak in curl 8.20.0
De nieuwste curl-versie dumpt dat model en introduceert thread pooling op multi handle-niveau.
De slimme opzet: Eén pool per multi handle
Geen thread per easy handle meer, maar één beheerde pool:
- Threads starten op verzoek, zonder onnodig voorraad
- Inactieve threads verdwijnen vanzelf
- DNS-verzoeken komen in de wachtrij
- Resultaten gaan via één gedeeld kanaal
- Resoluties landen bij de juiste easy handle
Cruciaal: slechts één socketpair per multi handle, ongeacht het aantal connecties. Dat scheelt enorm in file descriptors bij honderden of duizenden transfers.
Jij bepaalt de grenzen
Met CURLMOPT_RESOLVE_THREADS_MAX stel je het maximum aantal resolver-threads in. Standaard 20, maar aanpasbaar op basis van gebruikersfeedback.
Zo hou je resource-gebruik in de hand. Wil je maar 5 threads om CPU vrij te houden? Check. 50 voor top-snelheid? Kan ook.
Nieuw is CURLMOPT_QUICK_EXIT op multi-niveau voor snelle pool-afsluiting bij exit. Easy handles verwijderen is nu veilig, zonder hangende joins. Te late resoluties? Weg ermee. Simpel en voorspelbaar.
Prestatiewinst (meestal)
Naast besparingen geeft pooling een boost: resoluties draaien in bestaande threads. Geen opstartkosten, minder allocaties, minder syscalls.
Grote snelheidsprong? Hangt af van je setup. Maar altijd beter: minder switches, stabielere latency.
Nieuwe code, nieuwe risico's
Grote veranderingen brengen complexiteit. Meer code, meer kans op bugs in randgevallen.
De curl-makers zijn positief, maar test zelf grondig in jouw omgeving.
Wat dit voor jou betekent
Bij high-throughput apps met duizenden connecties (scrapers, pipelines, downloaders): curl 8.20.0+ verlaagt geheugen- en CPU-belasting, met voorspelbaarder gedrag.
Embedded of IoT? Elke bespaarde thread en descriptor telt zwaar.
Kleinere schaal? Verbeteringen zijn subtiel, maar je DNS werkt sneller en zuiniger.
De les erachter
Curl's DNS 2026-project, met deze pooling als ster, toont top engineering: probleem aanpakken, slimme fix, compatibiliteit behouden plus nieuwe opties. Niets kapot, alles beter.
Zo hoort open source te werken.
Heb jij curl 8.20.0 al getest? Infra gemigreerd? Deel je verhaal in de comments – de curl-crew gebruikt die input echt.