Ohjelmointi

Ymmärrä .Net CLR -kierreallas

.Net Frameworkissa CLR on vastuussa resurssien hankkimisesta sovellusten käynnissä. Erityisesti CLR-säiejoukko määrittää, milloin säikeet lisätään tai otetaan pois. Tämän toiminnan ymmärtäminen auttaa sinua määrittämään, kuinka ASP.Net-sovellus määritetään optimaalisen suorituskyvyn saavuttamiseksi.

CLR-säiejoukko sisältää kahdenlaisia ​​ketjuja - työntekijän ketjut ja I / O-portin tai IOCP-ketjut. Tämä tarkoittaa, että ASP.Net-työntekijäprosessisi sisältää oikeastaan ​​kaksi säiejoukkoa: työntekijän säiealue ja IOCP-säiealue. Näillä uima-altailla on luonnollisesti eri tarkoitukset.

Kun käytät menetelmiä, kuten Suorita, TaskFactory.StartNewja ThreadPool.QueueUserWorkItem, ajonaika hyödyntää työntekijöiden säikeitä prosessointia varten. Kun soitat asynkronisia I / O-puheluita sovelluksessasi tai sovelluksesi käyttää tiedostojärjestelmää, tietokantoja, verkkopalveluja jne., Suoritusaika käyttää IOCP-ketjuja. Huomaa myös, että jokaisella sovellusalueella on oma säiealue.

Katsotaanpa tarkemmin, miten nämä ketjut luodaan ja poistetaan .Net Frameworkissa.

Langan ruiskutusstrategiat

.Net-säiejoukko alkaa injektoida uusia säikeitä aina, kun varattujen säikeiden määrä on yhtä suuri kuin säiejoukossa määritettyjen vähimmäislankojen määrä. Minimiasetuksen oletusarvo, joka on vähimmäismäärämolemmat työntekijä- ja IOCP-ketjut, määräytyy järjestelmän suorittimien lukumäärän mukaan. Jos järjestelmässäsi on neljä ydintä, sinulla on oletusarvoisesti neljä työntekijälankaa ja neljä IOCP-ketjua.

Sitten .Net-säiejoukko syöttää tarvittaessa lisää työntekijöiden säikeitä, jos olemassa olevia säikeitä hyödynnetään ja vielä on tehtävää. Samalla tavoin, jos resurssien kysyntä laskee, ketjupooli alkaa ottaa ketjuja pois.

Seuraavan koodinpätkän suorittaminen näyttää järjestelmän loogisten prosessorien lukumäärän ja käytettävissä olevien työntekijöiden ja IOCP-säikeiden vähimmäismäärän.

staattinen void Main (merkkijono [] args)

{

int minimumWorkerThreadCount, vähintäänIOCThreadCount;

int looginenProcessorCount = System.Environment.ProcessorCount;

ThreadPool.GetMinThreads (out minimumWorkerThreadCount, out minimumIOCThreadCount);

Console.WriteLine ("Suoritinten lukumäärä:" + looginenProcessorCount);

Console.WriteLine ("Työntekijän ketjujen vähimmäismäärä:" + minimumWorkerThreadCount);

Console.WriteLine ("IOCP-ketjujen vähimmäismäärä:" + minimumIOCThreadCount);

Konsoli.Lue ();

}

.Net-langankierre hallitsee ketjuja sisäänrakennetun heuristiikan avulla. Hyväksyttyihin strategioihin kuuluvat nälänhätä välttäminen ja kiipeilyalgoritmi. Edellisessä tapauksessa .Net-ketjujoukko jatkaa työntekijöiden säikeiden lisäämistä, jos jonossa olevissa kohteissa ei ole näkyvää edistystä. Jälkimmäisessä tapauksessa .Net-lanka-allas pyrkii maksimoimaan läpijuoksun käyttämällä mahdollisimman vähän säikeitä.

.Net-lankaallas ruiskuttaa tai poistaa säikeitä 500 millisekunnin välein tai kun lanka vapautuu, kumpi tulee ensin. Suorituksen käytettävissä olevan palautteen perusteella .Net-säiejoukko joko poistaa ketjut tai lisää säikeitä maksimoidakseen suoritustehon. Jos langan lisääminen ei lisää läpimenoa, se vie langan pois. Tämä on CLR: n mäkikiipeilytekniikka toiminnassa.

Oletetaan nyt, että käytät ASP.Net-sovellustasi IIS: ssä ja verkkopalvelimellasi on yhteensä neljä keskusyksikköä. Oletetaan, että tietyllä hetkellä käsiteltäviä pyyntöjä on 24. Suorituksen aikana oletusarvoisesti luodaan neljä ketjua, jotka olisivat käytettävissä neljän ensimmäisen pyynnön palvelemiseen. Koska uusia säikeitä ei lisätä, ennen kuin 500 millisekuntia on kulunut, loput 20 pyyntöä on odotettava jonossa. Kun 500 millisekuntia on kulunut, luodaan uusi ketju.

Kuten näette, työmäärän saaminen kestää useita 500 ms: n välein. Tämä on hyvä syy asynkronisen ohjelmoinnin käyttöön. Asynkronoinnin yhteydessä säikeitä ei estetä pyyntöjen käsittelyn aikana, joten neljä ketjua vapautuisi melkein välittömästi.

Suositeltavat langan asetukset

Kun otetaan huomioon .Net-säiejoukon toiminta ja mitä olemme toistaiseksi keskustelleet, on erittäin suositeltavaa muuttaa kokoonpanon vähimmäisarvo - oletusarvo - sekä työntekijä- että IOCP-säikeille. Voit tehdä tämän ASP.Netissä muuttamalla minWorkerThreads ja minIoThreads kokoonpanoasetukset koneesi.config-tiedoston kokoonpanoelementti järjestelmässäsi.

minIoThreads = ”anna haluamasi arvo tässä” />

Voit asettaa sekä työntekijä- että IOCP-ketjujen vähimmäismääritysarvoiksi minkä tahansa arvon välillä 1-50. Hyvä tapa on ottaa IIS-työntekijäprosessin (W3wp.exe) käyttäjätilaprosessin dumppi ja käyttää ! threadpool komento raportoimaan työntekijöiden ketjujen kokonaismäärä. Kun tiedät tämän arvon, jaa se yksinkertaisesti järjestelmän suorittimen ytimien määrällä työntekijän ja IOCP-säikeiden vähimmäisasetusten määrittämiseksi. Esimerkiksi, jos työntekijöiden ketjujen kokonaismäärä on 100 ja järjestelmässäsi on neljä prosessoria, voit asettaa sekä työntekijä- että IOCP-ketjujen vähimmäisarvoiksi 25.

Voit muuttaa säikeiden vähimmäisasetuksia ASP.Net-verkon ulkopuolella käyttämällä ThreadPool.SetMinThreads () menetelmä.

Paremman säikeiden hallinnan ja paremman suorituskyvyn saavuttamiseksi CLR-säiealuetta on parannettu jokaisen CLR-version kanssa. Esimerkiksi .Net Framework 4: n avulla CLR sai ketjun varastamisalgoritmeja ja tukea samanaikaisuudelle ja rinnakkaisuudelle. Jokaisen uuden CLR-version myötä .Net-lanka-allas on älykkäämpi optimoimaan suorituskyky luomalla ja tuhoamalla säikeitä tarpeen mukaan. Sillä välin sinun kannattaa kokeilla erilaisia ​​vähimmäislangan asetuksia saadaksesi parhaan suorituskyvyn .Net-sovelluksestasi.

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