Razumijevanje spremišta niti .Net CLR

U .Net Framework-u CLR je odgovoran za raspoređivanje resursa za pokrenute aplikacije. Konkretno, CLR spremište niti određuje kada treba dodati ili oduzeti niti. Razumijevanje kako ovo funkcionira pomoći će vam odrediti kako konfigurirati svoj ASP.Net program za optimalne performanse.

CLR spremište niti sadrži dvije vrste niti - radne niti i ulazno-izlazni priključak ili IOCP niti. To znači da vaš radnički proces ASP.Net zapravo sadrži dva spremišta niti: spremište radničkih niti i spremište niti IOCP. Prirodno, ovi bazeni imaju različite svrhe.

Kada koristite metode kao što su Task.Run, TaskFactory.StartNewi ThreadPool.QueueUserWorkItem, vrijeme izvođenja iskorištava radnika niti za obradu. Kada u aplikaciji upućujete asinkrone I / O pozive ili aplikacija pristupa datotečnom sustavu, bazama podataka, web uslugama itd., Tada izvršavanje koristi IOCP niti. Imajte na umu i da svaka domena aplikacije ima svoj vlastiti fond niti.

Pogledajmo bliže kako se te niti stvaraju i uklanjaju u .Net Framework. 

Strategije ubrizgavanja niti

Spremište .Net niti započinje ubrizgavanje novih niti kad god broj zauzetih niti postane jednak broju konfiguriranih minimalnih niti u spremištu niti. Zadana vrijednost minimalne okruženju, što je najmanji broj  oba  radnika i IOCP niti, određuje se prema broju procesora u sustavu. Dakle, ako vaš sustav ima četiri jezgre, prema zadanim postavkama imali biste četiri radne niti i četiri IOCP niti. 

Spremište .Net niti tada ubrizgava dodatne radne niti na zahtjev ako se koriste postojeće niti i još ima posla. Isto tako, ako potražnja za resursima padne, spremište niti započet će uklanjanje niti. 

Izvršenjem sljedećeg isječka koda prikazat će se broj logičkih procesora u vašem sustavu i minimalni broj dostupnih radničkih i IOCP niti.

statička praznina Main (string [] args)

{

    int minimumWorkerThreadCount, minimumIOCThreadCount;

      int logicProcessorCount = System.Environment.ProcessorCount;

      ThreadPool.GetMinThreads (van minimumWorkerThreadCount, van minimumIOCThreadCount);

      Console.WriteLine („Broj procesora:“ + logicProcessorCount);

     Console.WriteLine („Minimalni broj radničkih niti:“ + minimumWorkerThreadCount);

      Console.WriteLine (“Minimalni broj IOCP niti:“ + minimumIOCThreadCount);

      Console.Read ();

}

Spremište niti .Net upravlja nitima koristeći svoju ugrađenu heuristiku. Usvojene strategije uključuju izbjegavanje gladi i algoritam uspona na brdo. U prvom slučaju, .Net spremište niti nastavlja dodavati radničke niti ako nema vidljivog napretka na stavkama u redu. U potonjem slučaju, .Net spremište niti pokušava povećati propusnost koristeći što manje niti.

Spremište niti .Net ubrizgava ili uklanja niti u intervalima od 500 milisekundi ili kad nit postane slobodna, ovisno o tome što se prije dogodi. Sada, na temelju povratnih informacija dostupnih za vrijeme izvođenja, .Net spremište niti uklanja niti ili dodaje niti kako bi povećalo propusnost. Ako dodavanje niti ne povećava propusnost, oduzima nit. Ovo je CLR-ova tehnika penjanja na brdu u akciji.

Sada pretpostavimo da koristite ASP.Net aplikaciju na IIS-u i da vaš web poslužitelj ima ukupno četiri CPU-a. Pretpostavimo da u bilo kojem trenutku, postoje 24 zahtjeva za obradu. Prema zadanim postavkama runtime će stvoriti četiri niti, koje će biti dostupne za servisiranje prva četiri zahtjeva. Budući da se neće dodati dodatne niti dok ne prođe 500 milisekundi, ostalih 20 zahtjeva morat će pričekati u redu. Nakon što prođe 500 milisekundi, stvara se nova nit.

Kao što vidite, trebat će vam razmaci od 500 ms da biste sustigli posao. To je dobar razlog za korištenje asinkronog programiranja. Uz async programiranje, niti se ne blokiraju dok se obrađuju zahtjevi, pa bi se četiri niti oslobodile gotovo odmah. 

Preporučene postavke niti

S obzirom na način na koji funkcionira spremište niti .Net i ono o čemu smo do sada razgovarali, toplo se preporučuje da promijenite minimalnu vrijednost konfiguracije - zadanu vrijednost - i za radničke i za IOCP niti. Da biste to učinili u ASP.Netu, trebali biste promijeniti postavke minWorkerThreadsi minIoThreadskonfiguraciju pod elementom konfiguracije u datoteci machine.config u vašem sustavu.

           minIoThreads = "ovdje dodajte željenu vrijednost" />

Možete postaviti minimalne vrijednosti konfiguracije za radničke i IOCP niti na bilo koju vrijednost između jedne i 50. Dobar pristup je izvođenje izvoda procesa korisničkog načina IIS radnog procesa (W3wp.exe), a zatim upotrijebite !threadpoolnaredbu za prijavljivanje ukupan broj radničkih niti. Jednom kada znate ovu vrijednost, jednostavno je podijelite s brojem procesorskih jezgri u vašem sustavu kako biste odredili minimalne postavke radničke i IOCP niti. Na primjer, ako je ukupan broj radničkih niti 100 i ako u vašem sustavu imate četiri procesora, možete postaviti minimalne vrijednosti za radničke i IOCP niti na 25.

Da biste promijenili zadane minimalne postavke niti izvan ASP.Net-a, možete koristiti ThreadPool.SetMinThreads()metodu.

S ciljem boljeg upravljanja nitima i poboljšanih performansi, CLR spremište niti poboljšano je sa svakom verzijom CLR-a. Kao primjer, s .Net Framework 4, CLR je stekao algoritme za krađu niti i podršku za paralelnost i paralelnost. Sa svakom novom verzijom CLR-a .Net spremište niti postaje pametnije oko optimizacije protoka stvaranjem i uništavanjem niti po potrebi. U međuvremenu ćete htjeti eksperimentirati s različitim minimalnim postavkama niti kako biste postigli najbolje performanse svoje .Net aplikacije.