Programmering

Forstå .Net CLR-trådpuljen

I .Net Framework er CLR ansvarlig for at måle ressourcer til kørende applikationer. CLR-trådpuljen bestemmer især, hvornår tråde skal tilføjes eller fjernes. At forstå, hvordan dette fungerer, hjælper dig med at bestemme, hvordan du konfigurerer din ASP.Net-applikation til optimal ydelse.

CLR-trådpuljen indeholder to slags tråde - arbejdertråde og I / O-færdiggørelsesport eller IOCP-tråde. Det betyder, at din ASP.Net-arbejdsproces faktisk indeholder to trådpuljer: arbejdertrådspuljen og IOCP-trådpuljen. Disse puljer har naturligvis forskellige formål.

Når du bruger metoder som Opgave. Køre, TaskFactory.StartNewog ThreadPool.QueueUserWorkItem, udnytter køretiden arbejdstagertråde til behandling. Når du foretager asynkrone I / O-opkald i din applikation, eller din applikation har adgang til filsystemet, databaser, webservices osv., Bruger 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ådindsprøjtningsstrategier

Net-trådpuljen begynder at indsprøjte nye tråde, når antallet af optagne tråde bliver lig med antallet af konfigurerede minimumstråde i trådpuljen. Standardværdien for minimumsindstillingen, som er det mindste antalbegge arbejdstager- og IOCP-tråde, bestemmes af antallet af processorer i dit system. Derfor, hvis dit system har fire kerner, vil du som standard have fire arbejdstråde og fire IOCP-tråde.

Net-trådpuljen indsprøjter derefter yderligere arbejdstråde på forespørgsel, hvis eksisterende tråde bruges, og der stadig er arbejde, der skal udføres. På samme måde, hvis efterspørgslen efter ressourcer falder, begynder trådpuljen at fjerne tråde.

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 ugyldigt Main (streng [] args)

{

int minimumWorkerThreadCount, minimumIOCThreadCount;

int logicalProcessorCount = System.Environment.ProcessorCount;

ThreadPool.GetMinThreads (ud minimumWorkerThreadCount, ud minimumIOCThreadCount);

Console.WriteLine (“Antal processorer:“ + logiskProcessorCount);

Console.WriteLine (“Minimum antal arbejdstråde:“ + minimumWorkerThreadCount);

Console.WriteLine (“Minimum antal IOCP-tråde:“ + minimumIOCThreadCount);

Console.Read ();

}

. Net-trådpuljen administrerer tråde ved hjælp af dens indbyggede heuristik. De vedtagne strategier inkluderer undgåelse af sult og en bjergbestigning algoritme. I det tidligere tilfælde fortsætter .Net-trådpuljen med at tilføje arbejdstråde, hvis der ikke er nogen synlige fremskridt på de emner, der står i kø. I sidstnævnte tilfælde forsøger .Net-trådpuljen at maksimere kapaciteten ved hjælp af så få tråde som muligt.

Net-trådpuljen injicerer eller fjerner tråde med intervaller på 500 millisekunder, eller når en tråd bliver fri, alt efter hvad der kommer først. Baseret på den feedback, der er tilgængelig for runtime, fjerner .Net-trådpuljen enten tråde eller tilføjer tråde for at maksimere kapaciteten. Hvis tilføjelse af en tråd ikke øger kapaciteten, tager den en tråd væk. Dette er CLRs bjergbestigningsteknik i aktion.

Antag nu, at du kører din ASP.Net-applikation på IIS, og at din webserver i alt har fire CPU'er. Antag, at der på et givet tidspunkt er 24 anmodninger om at blive behandlet. 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, før der er gået 500 millisekunder, skal de øvrige 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 500 ms intervaller at indhente arbejdsbyrden. Dette er en god grund til at bruge asynkron programmering. Med async-programmering blokeres tråde ikke, mens anmodninger håndteres, så de fire tråde frigøres næsten med det samme.

Anbefalede trådindstillinger

I betragtning af den måde, som. Net-trådpuljen fungerer, og hvad vi hidtil har diskuteret, anbefales det stærkt, at du ændrer den mindste konfigurationsværdi - 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 konfigurationselement i machine.config-filen i dit system.

minIoThreads = ”angiv din ønskede værdi her” />

Du kan indstille minimumskonfigurationsværdierne for både arbejdstager- og IOCP-tråde til en hvilken som helst værdi mellem en og 50. En god tilgang er at tage en brugertilstandsprocesdump af IIS-arbejdsprocessen (W3wp.exe) og derefter bruge ! threadpool kommando til at rapportere det samlede antal arbejdstråde. Når du kender denne værdi, skal du blot dele den med antallet af processorkerner på dit system for at bestemme minimumsindstillingerne for arbejdstager og IOCP-tråd. For eksempel, hvis det samlede antal arbejdstrå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 standardtrådindstillingerne for minimum uden for ASP.Net kan du bruge ThreadPool.SetMinThreads () metode.

Med målet om bedre trådstyring og forbedret ydeevne er CLR-trådpuljen blevet forbedret med hver version af CLR. Som et eksempel, med .Net Framework 4, opnåede CLR tråd stjæle algoritmer og støtte til samtidighed og parallelisme. Med hver nye version af CLR bliver .Net-trådpuljen klogere på at optimere kapaciteten ved at oprette og ødelægge tråde efter behov. I mellemtiden vil du gerne eksperimentere med forskellige minimum trådindstillinger for at få den bedste ydelse fra din .Net-applikation.

$config[zx-auto] not found$config[zx-overlay] not found