Jak curl 8.20.0 vyřešil zasekávání DNS: Tajemství resource pooling pod lupou
Problém s vlákny v DNS, o kterém se nemluví
Představte si, že curl zpracovává desítky souběžných DNS dotazů. Co se děje v pozadí? Nedávno se to změnilo dramaticky.
Dříve fungovalo threaded resolver v curlu jednoduše: pro každé paralelní připojení vzniklo nové vlákno. K tomu socketpair (nebo eventfd na Linuxu) pro koordinaci výsledků. Při malém počtu přenosů to nebolí. Ale tisíce souběžných spojení v podnikových appkách? Katastrofa.
Každé vlákno žere paměť, CPU a systémové zdroje. Socketpair navyšuje zátěž na file descriptory. Při tisících easy handles to exploduje lineárně. Horší je, když se DNS zasekne – čištění handleů se zablokuje. Aplikace může zamrznout.
Starý workaround a jeho limity
Tým curlu měl řešení: CURLOPT_QUICK_EXIT. Vlákna se odpojila místo čekání. Super pro appky, které končí. Ale pokud běžela dál? Vlákna se hromadila v paměti jako zombie. Žrala zdroje do konce procesu.
Byl to jen záplata.
Thread pooling: velká změna v curl 8.20.0
Nová verze curl 8.20.0 to předělala od základů. Přichází thread pooling na úrovni multi handle.
Jak to funguje:
Jeden pool vláken pro všechny připojení
- Vlákna startují podle potřeby, žádné zbytečné rezervace.
- Nečinná vlákna se automaticky ukončí.
- DNS požadavky se řadí do fronty.
- Výsledky jdou přes sdílené notifikace.
- Dokončené resolutions se vrátí správnému easy handle.
Klíčové: jen jeden socketpair na multi handle. I při stovkách nebo tisících přenosů. File descriptory klesnou dramaticky.
Vy máte kontrolu
Nová volba CURLMOPT_RESOLVE_THREADS_MAX omezí maximální počet vláken. Výchozí je 20, doladí se podle feedbacku.
Nechcete nekontrolovaný rast zdrojů? Nastavte na 5 pro úsporu CPU. Potřebujete 50 pro rychlost? Žádný problém.
Přidal se i CURLMOPT_QUICK_EXIT na multi úrovni. Pro rychlé ukončení procesu. Easy handles už nemají vlastní vlákna – odstraňte je bez rizika. Pozdní DNS výsledky? Vyhodí se pryč. Jednoduché a předvídatelné.
Výkonový posun (většinou)
Kromě úspor přináší pooling boost: DNS běží ve stávajících vláknech. Žádný overhead na start, méně alokací, méně systémových volání.
Uvidíte obrovský rozdíl? Záleží na vaší app a systému. Ale celkově je to lepší – méně přepínání, stabilnější latence.
Realita: nový kód, nové chyby
Je to velká přestavba. Více kódu, složitější mechanizmy, skrýš pro edge cases.
Vývojáři curlu věří, že nic nezkazili. Ale testujte v reálu – bugy vyplavou.
Co to znamená pro vás
Vysoký throughput s tisíci spojení (scrapery, datové pipeliny, distribuované downloadery)? Curl 8.20.0+ sníží paměť, zlepší CPU a stabilizuje zdroje.
Embedded nebo IoT systémy? Každý ušetřený byte a cyklus se počítá díky menšímu overheadu.
Běžné použití? Zlepšení je tiché – rychlejší DNS, méně volání. Infra to ocení.
Širší pohled
Toto je součást DNS 2026 iniciativy curlu. Ukazuje zralou práci: problém identifikovat, elegantní řešení navrhnout, kompatibilitu zachovat a dát nové možnosti. Nic se nezlomilo, vše se zlepšilo.
Takto open source bere performance vážně.
Už jste testovali curl 8.20.0? Přecházíte na novou verzi? Pište komentáře s vašimi zkušenostmi – tým curlu je bere vážně do dalších rozhodnutí.