Programmering

Forstå trådbaserte .Net CLR

I .Net Framework er CLR ansvarlig for å måle ressurser til å kjøre applikasjoner. Spesielt bestemmer CLR-trådgruppen når tråder skal legges til eller tas bort. Å forstå hvordan dette fungerer vil hjelpe deg med å bestemme hvordan du konfigurerer ASP.Net-applikasjonen din for optimal ytelse.

CLR-trådbassenget inneholder to typer tråder - arbeidertrådene og I / O-fullføringsporten eller IOCP-tråder. Det betyr at ASP.Net-arbeidsprosessen faktisk inneholder to trådbassenger: arbeidertrådebassenget og IOCP-trådbassenget. Naturligvis har disse bassengene forskjellige formål.

Når du bruker metoder som Oppgave. Løp, TaskFactory.StartNy, og ThreadPool.QueueUserWorkItem, utnytter kjøretiden arbeidertråder for behandling. Når du foretar asynkrone I / O-anrop i applikasjonen din, eller applikasjonen din har tilgang til filsystemet, databaser, webtjenester osv., Bruker kjøretiden IOCP-tråder. Legg også merke til at hvert applikasjonsdomene har sin egen trådgruppe.

La oss se nærmere på hvordan disse trådene blir opprettet og fjernet i .Net Framework.

Trådinjiseringsstrategier

Net-trådgruppen begynner å injisere nye tråder når antall travle tråder blir lik antall konfigurerte minimumstråder i trådgruppen. Standardverdien for minimumsinnstillingen, som er minimum antallbåde arbeider- og IOCP-tråder, bestemmes av antall prosessorer i systemet ditt. Derfor, hvis systemet ditt har fire kjerner, vil du ha fire arbeidertråder og fire IOCP-tråder som standard.

Net-trådbassenget injiserer deretter flere arbeidertråder på forespørsel hvis eksisterende tråder brukes og det fortsatt er arbeid å gjøre. På samme måte, hvis etterspørselen etter ressurser faller, vil trådpoolen begynne å ta tråder.

Å utføre følgende kodebit vil vise antall logiske prosessorer i systemet ditt og minimum antall tilgjengelige arbeidere og IOCP-tråder.

statisk tomrom Main (streng [] args)

{

int minimumWorkerThreadCount, minimumIOCThreadCount;

int logicalProcessorCount = System.Environment.ProcessorCount;

ThreadPool.GetMinThreads (out minimumWorkerThreadCount, out minimumIOCThreadCount);

Console.WriteLine (“Antall prosessorer:“ + logicalProcessorCount);

Console.WriteLine (“Minimum antall arbeidstakere:“ + minimumWorkerThreadCount);

Console.WriteLine (“Minimum antall IOCP-tråder:“ + minimumIOCThreadCount);

Console.Read ();

}

Net-trådbassenget administrerer tråder ved hjelp av den innebygde heuristikken. Strategiene som ble tatt i bruk inkluderer sultet unngåelse og en bakke-klatring algoritme. I det tidligere tilfellet fortsetter. Net-trådgruppen å legge til arbeidertråder hvis det ikke er noen synlig fremgang på elementene i køen. I sistnevnte tilfelle prøver. Net-trådgruppen å maksimere gjennomstrømningen ved å bruke så få tråder som mulig.

Net-trådbassenget injiserer eller fjerner tråder med intervaller på 500 millisekunder, eller når en tråd blir ledig, avhengig av hva som kommer først. Nå, basert på tilbakemeldingen som er tilgjengelig for kjøretiden, fjerner. Net-trådgruppen tråder eller legger til tråder for å maksimere gjennomstrømningen. Hvis du ikke øker gjennomstrømningen ved å legge til en tråd, tar den en tråd bort. Dette er CLRs bakketurteknikk i aksjon.

Anta at du kjører ASP.Net-applikasjonen din på IIS, og at webserveren din har totalt fire CPUer. Anta at det til enhver tid er 24 forespørsler om å bli behandlet. Som standard vil kjøretiden opprette fire tråder, som vil være tilgjengelig for å betjene de første fire forespørslene. Fordi ingen ekstra tråder vil bli lagt til før 500 millisekunder har gått, må de andre 20 forespørslene vente i køen. Etter at 500 millisekunder har gått, opprettes en ny tråd.

Som du kan se, vil det ta mange 500 ms intervaller å innhente arbeidsmengden. Dette er en god grunn til å bruke asynkron programmering. Ved asynkronisering programmeres ikke tråder mens forespørsler behandles, så de fire trådene vil bli frigjort nesten umiddelbart.

Anbefalte trådinnstillinger

Gitt måten .Net-trådgruppen fungerer og hva vi har diskutert så langt, anbefales det sterkt at du endrer minimumskonfigurasjonsverdien - standardverdien - for både arbeider- og IOCP-tråder. For å gjøre dette i ASP.Net, bør du endre minWorkerThreads og minIoThreads konfigurasjonsinnstillinger under konfigurasjonselementet i machine.config-filen i systemet ditt.

minIoThreads = ”oppgi ønsket verdi her” />

Du kan angi minimumskonfigurasjonsverdiene for både arbeider- og IOCP-tråder til en hvilken som helst verdi mellom en og 50. En god tilnærming er å ta en prosessdump for brukermodus av IIS-arbeidsprosessen (W3wp.exe) og deretter bruke ! threadpool kommando for å rapportere totalt antall arbeidertråder. Når du vet denne verdien, er det bare å dele den med antall prosessorkjerner på systemet ditt for å bestemme minimumsinnstillinger for arbeider og IOCP. For eksempel, hvis det totale antallet arbeidertråder er 100 og du har fire prosessorer i systemet ditt, kan du sette minimumsverdiene for både arbeider- og IOCP-tråder til 25.

For å endre standard minimum trådinnstillinger utenfor ASP.Net, kan du bruke ThreadPool.SetMinThreads () metode.

Med målet om bedre trådadministrasjon og forbedret ytelse, er CLR-trådbassenget forbedret med hver versjon av CLR. Som et eksempel, med .Net Framework 4, fikk CLR trådstyealgoritmer og støtte for samtidighet og parallellitet. For hver nye versjon av CLR blir .Net-trådgruppen smartere om å optimalisere gjennomstrømningen ved å opprette og ødelegge tråder etter behov. I mellomtiden vil du eksperimentere med forskjellige trådinnstillinger for å få best mulig ytelse fra .Net-applikasjonen.

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