Forstå .Net CLR tråd pool

I .Net Framework er CLR ansvarlig for at udmåle ressourcer til løbende applikationer. Specielt bestemmer CLR-trådpuljen, når tråde skal tilføjes eller tages væk. Forstå, hvordan dette virker, hjælper dig med at bestemme, hvordan du konfigurerer din ASP.Net-applikation for optimal ydeevne.

CLR trådpuljen indeholder to slags tråde - arbejdstrådene og I / O-færdiggørelsesporten eller IOCP-tråde. Det betyder, at din ASP.Net-arbejdsproces faktisk indeholder to trådpuljer: arbejdstagerens pulje og IOCP-trådpuljen. Naturligvis har disse puljer forskellige formål.

Når du bruger metoder som Task.Run, TaskFactory.StartNewog ThreadPool.QueueUserWorkItem, runtime udnytter arbejdstrådens tråde til behandling. Når du laver asynkrone I / O-opkald i din ansøgning, eller hvis din applikation har adgang til filsystemet, databaser, webtjenester mv., Så kører runtime IOCP-tråde. Bemærk også, at hvert applikationsdomæne har sin egen trådpulje.

Lad os se nærmere på hvordan disse tråde oprettes og fjernes i .Net Framework.

Trådinjektionsstrategier

.Net-trådpuljen begynder at injicere nye tråde, når antallet af optagne tråde bliver lig med antallet af konfigurerede mindste tråde i trådpuljen. Standardværdien af ​​minimumsindstillingen, som er det mindste antal både arbejdstager og IOCP-tråde, er bestemt af antallet af processorer i dit system. Hvis dit system har fire kerner, vil du derfor have fire medarbejdertråde og fire IOCP-tråde som standard.

.Net-trådpuljen injicerer derefter yderligere medarbejdertråde på forespørgsel, hvis eksisterende tråde anvendes, og der er stadig arbejde, der skal udføres. På samme måde, hvis efterspørgslen efter ressourcer falder, vil trådpuljen begynde at tage tråde væk.

Udførelse af følgende kodestykke viser antallet af logiske processorer i dit system og det mindste antal tilgængelige arbejdstager- og IOCP-tråde.

statisk tomrum Main (streng [] args) {int minimumWorkerThreadCount, minimumIOCThreadCount; int logicalProcessorCount = System.Environment.ProcessorCount; ThreadPool.GetMinThreads (ud minimumWorkerThreadCount, ud minimumIOCThreadCount); Console.WriteLine ("Antal processorer:" + logicalProcessorCount); Console.WriteLine ("Minimum antal Worker Threads:" + minimumWorkerThreadCount); Console.WriteLine ("Minimum antal IOCP-tråde:" + minimumIOCThreadCount); Console.Read (); }

.Net tråd pool styrer tråde ved hjælp af sin indbyggede heuristics. De vedtagne strategier omfatter svindelunddragelse og en bjergklatrealgoritme. I det tidligere tilfælde fortsætter .Net trådpuljen med at tilføje arbejdstråde, hvis der ikke er synlige fremskridt på de køede genstande. I sidstnævnte tilfælde forsøger .Net trådpuljen at maksimere gennemstrømningen ved at bruge så få tråde som muligt.

.Net trådpuljen injicerer eller fjerner tråde med intervaller på 500 millisekunder, eller som en tråd bliver fri, alt efter hvad der kommer først. Nu, baseret på tilbagemeldingerne til runtime, fjerner .Net-trådpuljen enten tråde eller tilføjer tråde for at maksimere gennemstrømningen. Hvis der tilføjes en tråd, øges ikke gennemstrømningen, tager den en tråd væk. Dette er CLR's bjergbestigningsteknik i aktion.

Antag nu, at du kører din ASP.Net-applikation på IIS, og din webserver har i alt fire CPU'er. Antag, at der på et givet tidspunkt er 24-anmodninger, der skal behandles. Som standard ville runtime skabe fire tråde, som ville være tilgængelige for at betjene de første fire anmodninger. Da der ikke tilføjes yderligere tråde, indtil 500 millisekunder er gået, skal de andre 20-anmodninger vente i køen. Efter at 500 millisekunder er gået, oprettes en ny tråd.

Som du kan se, vil det tage mange 500ms intervaller at indhente arbejdsbelastningen. Dette er en god grund til at bruge asynkron programmering. Med async programmering, tråde er ikke blokeret, mens anmodninger håndteres, så de fire tråde vil blive frigjort næsten umiddelbart.

Anbefalede trådindstillinger

I betragtning af den måde, som .Net trådpuljen fungerer på, og hvad vi har diskuteret hidtil, anbefales det stærkt, at du ændrer minimumskonfigurationsværdien - standardværdien - for både arbejdstager- og IOCP-tråde. For at gøre dette i ASP.Net skal du ændre minWorkerThreads og minIoThreads konfigurationsindstillinger under <ProcessModel> konfigurationselement i filen machine.config i dit system.

<configuration> <system.web> <processModel minWorkerThreads = "Angiv din ønskede værdi her" minIoThreads = "Angiv din ønskede værdi her" /> </system.web> </ configuration>

Du kan indstille minimale konfigurationsværdier for både arbejdstager- og IOCP-tråde til enhver værdi mellem en og 50. En god tilgang er at tage en dumpning af brugermodusprocessen i IIS-arbejdsprocessen (W3wp.exe) og derefter bruge ! threadpool kommando til at rapportere det samlede antal medarbejdertråde. Når du har kendskab til denne værdi, skal du blot dividere den med antallet af processorkerner på dit system for at bestemme minimumsindstillingerne for arbejdstager og IOCP-thread. Hvis for eksempel det samlede antal medarbejdertråde er 100, og du har fire processorer i dit system, kan du indstille minimumsværdierne for både arbejdstager og IOCP-tråde til 25.

For at ændre standard mindste trådindstillinger uden for ASP.Net kan du bruge ThreadPool.SetMinThreads () fremgangsmåde.

Med målet om bedre trådstyring og forbedret ydelse er CLR-trådpuljen blevet forbedret med hver version af CLR. Som et eksempel, med. Net Framework 4, CLR fik trådstålalgoritmer og støtte til samtidighed og parallelisme. Med hver ny version af CLR bliver .Net trådpuljen smartere om at optimere gennemstrømningen ved at skabe og ødelægge tråde efter behov. I mellemtiden vil du eksperimentere med forskellige mindste trådindstillinger for at få den bedste ydeevne fra din. Net-applikation.

Kilde

Efterlad en kommentar

Dette websted bruger Akismet til at reducere spam. Lær, hvordan dine kommentardata behandles.