Programavimas

Supraskite .Net CLR siūlų grupę

.Net sistemoje CLR yra atsakinga už išteklių paleidimą vykdant programas. Visų pirma, CLR gijų rinkinys nustato, kada gijos turi būti pridėtos ar pašalintos. Suprasti, kaip tai veikia, padės nustatyti, kaip sukonfigūruoti ASP.Net programą, kad ji veiktų optimaliai.

CLR gijų telkinyje yra dviejų rūšių gijos - darbininkų gijos ir įvesties / išvesties užbaigimo prievadas arba IOCP gijos. Tai reiškia, kad jūsų ASP.Net darbuotojo procese iš tikrųjų yra du gijų telkiniai: darbininkų gijų ir IOCP gijų telkiniai. Natūralu, kad šie baseinai turi skirtingus tikslus.

Kai naudojate tokius metodus kaip Užduotis. Vykdyti, „TaskFactory.StartNew“ir „ThreadPool.QueueUserWorkItem“, vykdymo laikas apdorojimui naudoja darbuotojų gijas. Kai programoje atliekate asinchroninius įvesties / išvesties skambučius arba programa pasiekia failų sistemą, duomenų bazes, žiniatinklio paslaugas ir pan., Vykdymo laikas naudoja IOCP gijas. Taip pat atkreipkite dėmesį, kad kiekviena programos domenas turi savo gijų grupę.

Pažvelkime atidžiau į tai, kaip šios gijos sukuriamos ir pašalinamos .Net Framework.

Siūlų įpurškimo strategijos

.Net gijų baseinas pradeda švirkšti naujas gijas, kai užimtų gijų skaičius tampa lygus sukonfigūruotų minimalių gijų skaičiui gijų telkinyje. Numatytoji minimalaus nustatymo vertė, kuri yra minimalus skaičiustiek darbuotojo ir IOCP gijos, nustatoma pagal jūsų sistemos procesorių skaičių. Taigi, jei jūsų sistemoje yra keturi branduoliai, pagal numatytuosius nustatymus turėsite keturis darbininkų ir keturis IOCP gijas.

Tada .Net gijų telkinys pagal poreikį įpurškia papildomų darbuotojų gijų, jei naudojamos esamos gijos ir vis dar reikia nuveikti. Tuo pačiu atveju, jei sumažės išteklių paklausa, gijų telkinys pradės gijas šalinti.

Vykdant šį kodo fragmentą bus parodytas loginių procesorių skaičius jūsų sistemoje ir minimalus galimas darbuotojų ir IOCP gijų skaičius.

static void Main (string [] args)

{

int minimumWorkerThreadCount, minimumIOCThreadCount;

int loginisProcessorCount = System.Environment.ProcessorCount;

„ThreadPool.GetMinThreads“ (out minimumWorkerThreadCount, out minimumIOCThreadCount);

Console.WriteLine („Procesorių skaičius:„ + loginisProcesoriausSkaičius);

Console.WriteLine („Minimalus darbininkų gijų skaičius:„ + minimumWorkerThreadCount);

Console.WriteLine („Mažiausias IOCP gijų skaičius:“ + minimumIOCThreadCount);

Pultas.Skaitykite ();

}

.Net gijų baseinas valdo gijas naudodamas savo įmontuotą euristiką. Priimtos strategijos apima bado vengimą ir laipiojimo į kalnus algoritmą. Pirmuoju atveju .Net gijų telkinys ir toliau prideda darbininkų gijas, jei eilėje esančiuose elementuose nėra matomos pažangos. Pastaruoju atveju .Net gijų telkinys bando maksimaliai padidinti pralaidumą naudodamas kuo mažiau gijų.

„.Net“ siūlų grupė suleidžia arba pašalina siūlus 500 milisekundžių intervalais arba kai siūlas tampa laisvas, atsižvelgiant į tai, kas įvyks anksčiau. Dabar, remiantis vykdymo metu prieinamais atsiliepimais, .Net gijų rinkinys pašalina gijas arba prideda gijas, kad padidintų pralaidumą. Jei pridėjus giją nepadidėja pralaidumas, ji atima giją. Tai yra CLR kopimo į kalną technika.

Dabar tarkime, kad naudojate savo ASP.Net programą IIS, o jūsų žiniatinklio serveryje yra iš viso keturi procesoriai. Tarkime, kad bet kuriuo momentu yra 24 prašymai, kuriuos reikia apdoroti. Pagal numatytuosius nustatymus vykdymo laikas sukurs keturias gijas, kuriomis bus galima aptarnauti pirmąsias keturias užklausas. Kadangi nepraeis 500 milisekundžių, jokių papildomų gijų nebus pridėta, kitų 20 užklausų reikės laukti eilėje. Praėjus 500 milisekundžių, sukuriama nauja gija.

Kaip matote, norint pasiekti darbo krūvį, reikės daugybės 500 ms pertraukų. Tai yra tinkama priežastis naudoti asinchroninį programavimą. Naudojant asinchroninį programavimą, tvarkant užklausas, gijos nėra blokuojamos, todėl keturios gijos būtų atlaisvintos beveik iš karto.

Rekomenduojami siūlų nustatymai

Atsižvelgiant į tai, kaip veikia .Net gijų rinkinys ir ką mes aptarėme iki šiol, primygtinai rekomenduojama pakeisti minimalią konfigūracijos vertę - numatytąją vertę - tiek darbuotojams, tiek IOCP gijoms. Norėdami tai padaryti ASP.Net, turėtumėte pakeisti minWorkerThreads ir minIoThreads konfigūracijos parametrai konfigūracijos elementą jūsų sistemos faile machine.config.

minIoThreads = ”čia pateikite norimą vertę” />

Galite nustatyti minimalias tiek darbuotojo, tiek IOCP gijų konfigūracijos reikšmes bet kuriai vertei nuo vieno iki 50. Geras būdas yra naudoti IIS darbuotojo proceso (W3wp.exe) vartotojo režimo proceso sąvartyną ir naudoti ! threadpool komanda pranešti apie bendrą darbuotojų gijų skaičių. Sužinoję šią vertę, paprasčiausiai padalykite ją iš procesoriaus branduolių skaičiaus sistemoje, kad nustatytumėte minimalius darbuotojo ir IOCP gijų nustatymus. Pvz., Jei bendras darbininkų gijų skaičius yra 100 ir jūsų sistemoje yra keturi procesoriai, galite nustatyti minimalias tiek darbuotojo, tiek IOCP gijų vertes iki 25.

Norėdami pakeisti numatytuosius minimalius siūlų parametrus už ASP.Net ribų, galite naudoti „ThreadPool.SetMinThreads“ () metodas.

Siekiant geresnio gijų valdymo ir geresnio našumo, CLR gijų telkinys buvo patobulintas kiekvienoje CLR versijoje. Pavyzdžiui, naudojant .Net Framework 4, CLR įgijo siūlų vagystės algoritmus ir palaikymą dėl lygiagretumo ir lygiagretumo. Su kiekviena nauja CLR versija „.Net“ gijų rinkinys tampa vis protingesnis optimizuojant pralaidumą kuriant ir sunaikinant gijas, jei reikia. Tuo tarpu norėsite eksperimentuoti su skirtingais minimaliais siūlų nustatymais, kad pasiektumėte geriausią savo .Net programos našumą.

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