Πώς το curl 8.20.0 Έλυσε τα Θρυμματισμένα DNS: Μυστικά του Resource Pooling
Το πρόβλημα του DNS Threading που κανείς δεν συζητά
Φαντάσου δεκάδες ταυτόχρονες DNS αναζητήσεις με το curl. Τι γίνεται πίσω από τις κουρτίνες; Η παλιά υλοποίηση έφτιαχνε ξεχωριστό thread για κάθε σύνδεση. Άνοιγε και socketpair (ή eventfd στο Linux) για να συγχρονίσει τα αποτελέσματα. Ακούγεται σπατάλη; Ήταν.
Σε μικρές εργασίες, δεν φαινόταν. Σε enterprise εφαρμογές με χιλιάδες συνδέσεις; Χάος. Κάθε thread έτρωγε μνήμη, CPU και πόρους του OS. Τα socketpair γέμιζαν file descriptors. Με χιλιάδες easy handles, η κατανάλωση εκτοξευόταν γραμμικά.
Χειρότερα: Αν μια DNS κολλούσε, μπλόκαρε και το cleanup. Αφαίρεση easy handle με κολλημένο thread; Deadlock στην εφαρμογή σου.
Η παλιά λύση (και τα προβλήματά της)
Το curl είχε το CURLOPT_QUICK_EXIT. Αποσπούσε τα threads αντί να τα περιμένει. Ιδανικό αν τερμάτιζες την εφαρμογή. Αν όμως έμενε ζωντανή; Τα αποσπασμένα threads μαζεύονταν στη μνήμη σαν φαντάσματα. Σπατάλη μέχρι το τέλος.
Κλασικό patch, όχι λύση.
Thread Pooling: Η επανάσταση του curl 8.20.0
Η νέα έκδοση πετάει το παλιό μοντέλο και φέρνει thread pooling στο multi handle.
Η νέα δομή είναι απλή:
Ένα thread pool ανά multi handle
- Ξεκινά threads μόνο όταν χρειάζονται
- Σκοτώνει τα αδρανή αυτόματα
- Βάζει σε ουρά τις DNS εκκρεμότητες
- Στέλνει αποτελέσματα με κοινό μηχανισμό
- Κατανέμει πίσω στα σωστά easy handles
Κλειδί: Μόνο ένα socketpair ανά multi handle. Λιγότερα file descriptors, ακόμα και με χιλιάδες συνδέσεις.
Έλεγχος στα χέρια σου
Με το CURLMOPT_RESOLVE_THREADS_MAX περιορίζεις τα threads. Default 20, ρυθμίζεται με feedback. Θες 5 για να κρατήσεις CPU; Γίνεται. Ή 50 για μέγιστη ταχύτητα; Εσύ αποφασίζεις.
Νέο CURLMOPT_QUICK_EXIT στο multi επίπεδο για γρήγορο shutdown. Τα late DNS απορρίπτονται αν το easy handle έφυγε. Καθαρά, χωρίς εκπλήξεις.
Κέρδη απόδοσης (συνήθως)
Λιγότερη σπατάλη, λιγότερο thread startup, μηδενικές περιττές κλήσεις. Οι αναζητήσεις τρέχουν σε υπάρχοντα threads. Λιγότερο context switching, σταθερότερη καθυστέρηση.
Δεν είναι πάντα εμφανές. Εξαρτάται από το σύστημά σου. Αλλά πάντα καλύτερο.
Πραγματικότητα: Νέος κώδικας, νέα bugs
Μεγάλη αλλαγή σημαίνει περισσότερο κώδικα. Περισσότερα σημεία για edge cases. Οι developers του curl λένε ότι είναι σταθερό. Αλλά δοκίμασε μόνος σου.
Τι κερδίζεις εσύ
Για high-throughput apps (scrapers, pipelines, downloaders): Λιγότερη μνήμη, CPU, προβλέψιμη συμπεριφορά.
Σε embedded/IoT: Κάθε byte και cycle μετράει. Μεγάλο win.
Σε μικρή κλίμακα: Αόρατα οφέλη. Γρηγορότερες DNS, λιγότερες κλήσεις.
Το ευρύτερο πλαίσιο
Το DNS 2026 project του curl δείχνει mature engineering. Βρήκαν πρόβλημα, έφτιαξαν καθαρή λύση, κράτησαν compatibility, πρόσθεσαν options. Δεν έσπασαν τίποτα. Το βελτίωσαν.
Έτσι δουλεύει το open-source όταν παίρνει σοβαρά performance και πόρους.
Δοκίμασες το curl 8.20.0; Ανεβάζεις το infra σου; Πες μας στα σχόλια τις εμπειρίες σου – η curl team ακούει real-world feedback.