Προγραμματισμός

Κατανοήστε την ομάδα νημάτων .Net CLR

Στο .Net Framework, το CLR είναι υπεύθυνο για τη συγκέντρωση πόρων για την εκτέλεση εφαρμογών. Συγκεκριμένα, το CLR νήμα καθορίζει πότε τα νήματα πρόκειται να προστεθούν ή να αφαιρεθούν. Η κατανόηση του τρόπου λειτουργίας αυτού θα σας βοηθήσει να προσδιορίσετε τον τρόπο διαμόρφωσης της εφαρμογής ASP.Net για βέλτιστη απόδοση.

Το CLR νήμα περιέχει δύο είδη νημάτων - τα νήματα εργαζομένων και τη θύρα ολοκλήρωσης I / O ή νήματα IOCP. Αυτό σημαίνει ότι η διαδικασία εργαζομένων ASP.Net περιέχει πραγματικά δύο ομάδες νημάτων: την ομάδα νήματος εργαζομένων και την ομάδα νημάτων IOCP. Φυσικά, αυτές οι πισίνες έχουν διαφορετικούς σκοπούς.

Όταν χρησιμοποιείτε μεθόδους όπως Εργασία. Εκτελέστε, TaskFactory.StartNew, και ThreadPool.QueueUserWorkItem, ο χρόνος εκτέλεσης εκμεταλλεύεται τα νήματα εργαζομένων για επεξεργασία. Όταν πραγματοποιείτε ασύγχρονες κλήσεις εισόδου / εξόδου στην εφαρμογή σας ή η εφαρμογή σας αποκτά πρόσβαση στο σύστημα αρχείων, βάσεις δεδομένων, υπηρεσίες ιστού κ.λπ., τότε ο χρόνος εκτέλεσης χρησιμοποιεί νήματα IOCP. Σημειώστε επίσης ότι κάθε τομέας εφαρμογών έχει τη δική του ομάδα νήματος.

Ας ρίξουμε μια πιο προσεκτική ματιά στον τρόπο δημιουργίας και αφαίρεσης αυτών των νημάτων στο .Net Framework.

Στρατηγικές έγχυσης νήματος

Η ομάδα νημάτων .Net ξεκινά να εισάγει νέα νήματα κάθε φορά που ο αριθμός των απασχολημένων νημάτων ισούται με τον αριθμό των ελάχιστων διαμορφωμένων νημάτων στην ομάδα νημάτων. Η προεπιλεγμένη τιμή της ελάχιστης ρύθμισης, που είναι ο ελάχιστος αριθμόςκαι τα δυο νήματα εργαζομένου και IOCP, καθορίζεται από τον αριθμό των επεξεργαστών στο σύστημά σας. Ως εκ τούτου, εάν το σύστημά σας έχει τέσσερις πυρήνες, θα έχετε τέσσερα νήματα εργαζομένων και τέσσερα νήματα IOCP από προεπιλογή.

Η δεξαμενή νήματος .Net στη συνέχεια εισάγει επιπλέον νήματα εργαζομένων κατά παραγγελία, εάν χρησιμοποιούνται υπάρχοντα νήματα και υπάρχει ακόμη δουλειά που πρέπει να γίνει. Με τον ίδιο τρόπο, εάν μειωθεί η ζήτηση πόρων, το νήμα θα αρχίσει να απομακρύνεται.

Αν εκτελέσετε το ακόλουθο απόσπασμα κώδικα, θα εμφανιστεί ο αριθμός των λογικών επεξεργαστών στο σύστημά σας και ο ελάχιστος αριθμός διαθέσιμων νημάτων εργαζομένων και IOCP.

static void Main (συμβολοσειρά [] args)

{

int minimumWorkerThreadCount, minimumIOCThreadCount;

int logicalProcessorCount = System.Environment.ProcessorCount;

ThreadPool.GetMinThreads (από το ελάχιστοWorkerThreadCount, από το ελάχιστοIOCThreadCount);

Console.WriteLine ("Αριθμός επεξεργαστών:" + logicalProcessorCount);

Console.WriteLine ("Ελάχιστος αριθμός νημάτων εργαζομένων:" + minimumWorkerThreadCount);

Console.WriteLine ("Ελάχιστος αριθμός νημάτων IOCP:" + minimumIOCThreadCount);

Κονσόλα. Διαβάστε ();

}

Η ομάδα νημάτων .Net διαχειρίζεται τα νήματα χρησιμοποιώντας την ενσωματωμένη ευρετική του. Οι στρατηγικές που υιοθετούνται περιλαμβάνουν την αποφυγή λιμοκτονίας και έναν αλγόριθμο αναρρίχησης. Στην προηγούμενη περίπτωση, η ομάδα νημάτων .Net συνεχίζει να προσθέτει νήματα εργαζομένων εάν δεν υπάρχει ορατή πρόοδος στα στοιχεία που βρίσκονται στην ουρά. Στην τελευταία περίπτωση, η ομάδα νημάτων .Net προσπαθεί να μεγιστοποιήσει την απόδοση χρησιμοποιώντας όσο το δυνατόν λιγότερα νήματα.

Η δεξαμενή νήματος .Net εγχέει ή αφαιρεί νήματα σε διαστήματα 500 χιλιοστών του δευτερολέπτου ή καθώς το νήμα γίνεται ελεύθερο, όποιο από τα δύο είναι πρώτο. Τώρα, με βάση τα σχόλια που είναι διαθέσιμα για το χρόνο εκτέλεσης, η ομάδα νημάτων .Net αφαιρεί νήματα ή προσθέτει νήματα για να μεγιστοποιήσει την απόδοση. Εάν η προσθήκη ενός νήματος δεν αυξάνει την απόδοση, παίρνει ένα νήμα μακριά. Αυτή είναι η τεχνική αναρρίχησης του CLR σε δράση.

Τώρα ας υποθέσουμε ότι εκτελείτε την εφαρμογή ASP.Net στις υπηρεσίες IIS και ο διακομιστής ιστού σας διαθέτει συνολικά τέσσερις CPU. Ας υποθέσουμε ότι σε οποιαδήποτε δεδομένη χρονική στιγμή, υπάρχουν 24 αιτήματα προς επεξεργασία. Από προεπιλογή, ο χρόνος εκτέλεσης θα δημιουργούσε τέσσερα νήματα, τα οποία θα ήταν διαθέσιμα για την εξυπηρέτηση των τεσσάρων πρώτων αιτημάτων. Επειδή δεν θα προστεθούν επιπλέον νήματα έως ότου παρέλθουν 500 χιλιοστά του δευτερολέπτου, τα άλλα 20 αιτήματα θα πρέπει να περιμένουν στην ουρά. Αφού περάσουν 500 χιλιοστά του δευτερολέπτου, δημιουργείται ένα νέο νήμα.

Όπως μπορείτε να δείτε, θα χρειαστούν διαστήματα 500 ms για να καλύψετε τον φόρτο εργασίας. Αυτός είναι ένας καλός λόγος για τη χρήση ασύγχρονου προγραμματισμού. Με τον προγραμματισμό async, τα νήματα δεν αποκλείονται κατά τον χειρισμό των αιτημάτων, επομένως τα τέσσερα νήματα θα απελευθερωθούν σχεδόν αμέσως.

Προτεινόμενες ρυθμίσεις νήματος

Δεδομένου του τρόπου με τον οποίο λειτουργεί η δεξαμενή νήματος .Net και όσα έχουμε συζητήσει μέχρι τώρα, συνιστάται ιδιαίτερα να αλλάξετε την ελάχιστη τιμή διαμόρφωσης - την προεπιλεγμένη τιμή - τόσο για τα νήματα εργαζομένων όσο και για τα IOCP Για να το κάνετε αυτό στο ASP.Net, θα πρέπει να αλλάξετε το minWorkerThreads και minIoThreads ρυθμίσεις διαμόρφωσης κάτω από το στοιχείο διαμόρφωσης στο αρχείο machine.config στο σύστημά σας.

minIoThreads = "δώστε την επιθυμητή τιμή εδώ" />

Μπορείτε να ορίσετε τις ελάχιστες τιμές διαμόρφωσης τόσο για τα νήματα εργαζομένου όσο και για τα νήματα IOCP σε οποιαδήποτε τιμή μεταξύ ενός και 50. Μια καλή προσέγγιση είναι να πάρετε μια απόρριψη διαδικασίας λειτουργίας χρήστη της διαδικασίας εργαζομένων IIS (W3wp.exe) και στη συνέχεια να χρησιμοποιήσετε το ! λουτρό εντολή για να αναφέρετε τον συνολικό αριθμό των νημάτων εργαζομένων. Μόλις γνωρίζετε αυτήν την τιμή, απλώς διαιρέστε την με τον αριθμό των πυρήνων επεξεργαστή στο σύστημά σας για να καθορίσετε τις ελάχιστες ρυθμίσεις νήματος εργαζομένου και IOCP. Για παράδειγμα, εάν ο συνολικός αριθμός των νημάτων εργαζομένων είναι 100 και έχετε τέσσερις επεξεργαστές στο σύστημά σας, μπορείτε να ορίσετε τις ελάχιστες τιμές και για τα νήματα εργαζομένων και IOCP σε 25.

Για να αλλάξετε τις προεπιλεγμένες ελάχιστες ρυθμίσεις νήματος εκτός του ASP.Net, μπορείτε να χρησιμοποιήσετε το ThreadPool.SetMinThreads () μέθοδος.

Με στόχο την καλύτερη διαχείριση νήματος και βελτιωμένη απόδοση, η ομάδα νήματος CLR έχει βελτιωθεί με κάθε έκδοση του CLR. Για παράδειγμα, με το .Net Framework 4, το CLR απέκτησε αλγόριθμους κλοπής νήματος και υποστήριξη για ταυτόχρονη και παραλληλισμό. Με κάθε νέα έκδοση του CLR, η δεξαμενή νήματος .Net γίνεται πιο έξυπνη για τη βελτιστοποίηση της απόδοσης δημιουργώντας και καταστρέφοντας νήματα όπως απαιτείται. Εν τω μεταξύ, θα θελήσετε να πειραματιστείτε με διαφορετικές ελάχιστες ρυθμίσεις νήματος για να έχετε την καλύτερη απόδοση από την εφαρμογή .Net.