Programovanie

Pochopte fond vlákien .Net CLR

V rámci .Net Framework je CLR zodpovedný za výdaj prostriedkov na spustené aplikácie. Obzvlášť fond vlákien CLR určuje, kedy sa majú vlákna pridať alebo odobrať. Pochopenie toho, ako to funguje, vám pomôže určiť, ako nakonfigurovať aplikáciu ASP.Net na optimálny výkon.

Fond vlákien CLR obsahuje dva druhy vlákien - pracovné vlákna a port dokončenia I / O alebo vlákna IOCP. To znamená, že váš pracovný proces ASP.Net v skutočnosti obsahuje dva fondy vlákien: fond pracovných vlákien a fond vlákien IOCP. Tieto bazény majú samozrejme rôzne účely.

Keď použijete metódy ako Úloha. Spustiť, TaskFactory.StartNewa ThreadPool.QueueUserWorkItem, runtime využíva na spracovanie pracovné vlákna. Keď vo svojej aplikácii uskutočňujete asynchrónne I / O volania alebo ak vaša aplikácia pristupuje k súborovému systému, databázam, webovým službám atď., Potom behové prostredie použije vlákna IOCP. Upozorňujeme tiež, že každá doména aplikácie má svoj vlastný fond vlákien.

Pozrime sa podrobnejšie na to, ako sa tieto vlákna vytvárajú a odstraňujú v rámci .Net Framework.

Stratégie vstrekovania nití

Fond vlákien .Net začne vkladať nové vlákna vždy, keď sa počet zaneprázdnených vlákien rovná počtu nakonfigurovaných minimálnych vlákien vo fonde vlákien. Predvolená hodnota minimálneho nastavenia, čo je minimálny početoboje pracovné vlákna a vlákna IOCP, je určená počtom procesorov vo vašom systéme. Ak má teda váš systém štyri jadrá, štandardne by ste mali štyri pracovné vlákna a štyri vlákna IOCP.

Fond vlákien .Net potom na požiadanie vstrekuje ďalšie pracovné vlákna, ak sa využijú existujúce vlákna a stále je potrebné vykonať prácu. Z rovnakého dôvodu, ak poklesne dopyt po zdrojoch, fond vlákien začne vlákna odoberať.

Vykonanie nasledujúceho útržku kódu by zobrazilo počet logických procesorov vo vašom systéme a minimálny počet dostupných pracovných a vlákien IOCP.

static void Main (reťazec [] args)

{

int minimumWorkerThreadCount, minimumIOCThreadCount;

int logicalProcessorCount = System.Environment.ProcessorCount;

ThreadPool.GetMinThreads (out minimumWorkerThreadCount, out minimumIOCThreadCount);

Console.WriteLine („Počet procesorov:“ + logicalProcessorCount);

Console.WriteLine („Minimálny počet pracovných vlákien:“ + minimumWorkerThreadCount);

Console.WriteLine („Minimálny počet vlákien IOCP:“ + minimumIOCThreadCount);

Console.Read ();

}

Fond vlákien .Net spravuje vlákna pomocou svojej zabudovanej heuristiky. Prijaté stratégie zahŕňajú vyhýbanie sa hladu a algoritmus stúpania do kopca. V prvom prípade fond sietí .Net naďalej pridáva pracovné vlákna, ak na položkách vo fronte nie je viditeľný pokrok. V druhom prípade sa fond vlákien .Net snaží maximalizovať priepustnosť pomocou čo najmenšieho počtu vlákien.

Fond vlákien .Net injektuje alebo odstraňuje vlákna v intervaloch 500 milisekúnd alebo sa vlákno uvoľní, podľa toho, čo nastane skôr. Teraz, na základe spätnej väzby dostupnej pre modul runtime, fond vlákien .Net buď odstráni vlákna, alebo ich pridá, aby sa maximalizovala priepustnosť. Ak pridanie vlákna nezvýši priepustnosť, vlákno ho odoberie. Toto je CLR technika horolezectva v akcii.

Teraz predpokladajme, že používate svoju aplikáciu ASP.Net na IIS a váš webový server má celkovo štyri CPU. Predpokladajme, že v danom okamihu existuje 24 požiadaviek na spracovanie. Štandardne runtime vytvorí štyri vlákna, ktoré by boli k dispozícii na vybavenie prvých štyroch požiadaviek. Pretože do doby, kým neuplynie 500 milisekúnd, nebudú pridané žiadne ďalšie vlákna, ďalších 20 požiadaviek bude musieť čakať vo fronte. Po uplynutí 500 milisekúnd sa vytvorí nové vlákno.

Ako vidíte, vyrovnanie pracovného zaťaženia bude trvať mnoho intervalov 500 ms. To je dobrý dôvod na použitie asynchrónneho programovania. Pri asynchronnom programovaní nie sú vlákna blokované počas vybavovania požiadaviek, takže štyri vlákna by sa uvoľnili takmer okamžite.

Odporúčané nastavenie vlákna

Vzhľadom na spôsob fungovania fondu vlákien .Net a na to, o čom sme doteraz hovorili, sa dôrazne odporúča zmeniť minimálnu hodnotu konfigurácie - predvolenú hodnotu - pre pracovné vlákna aj vlákna IOCP. Ak to chcete urobiť v ASP.Net, mali by ste zmeniť minWorkerThreads a minIoThreads konfiguračné nastavenia pod konfiguračný prvok v súbore machine.config vo vašom systéme.

minIoThreads = ”tu zadajte požadovanú hodnotu” />

Minimálne hodnoty konfigurácie pre pracovné vlákna aj vlákna IOCP môžete nastaviť na ľubovoľnú hodnotu medzi jednou a 50. Dobrým prístupom je vykonať výpis procesu procesu používateľského režimu pracovného procesu IIS (W3wp.exe) a potom použiť ! threadpool príkaz na hlásenie celkového počtu pracovných vlákien. Keď poznáte túto hodnotu, jednoducho ju vydelte počtom jadier procesora vo vašom systéme, aby ste určili minimálne nastavenie vlákna pracovníka a vlákna IOCP. Napríklad ak je celkový počet pracovných vlákien 100 a máte v systéme štyri procesory, môžete nastaviť minimálne hodnoty pre pracovné vlákna aj vlákna IOCP na 25.

Ak chcete zmeniť predvolené minimálne nastavenie vlákna mimo ASP.Net, môžete použiť ThreadPool.SetMinThreads () metóda.

S cieľom lepšej správy vlákien a zlepšeného výkonu sa s každou verziou CLR vylepšil fond vlákien CLR. Napríklad s .Net Framework 4 získal CLR algoritmy kradnutia vlákien a podporu súbežnosti a paralelizmu. S každou novou verziou CLR je fond vlákien .Net inteligentnejší pri optimalizácii priepustnosti vytváraním a ničením vlákien podľa potreby. Medzitým budete chcieť experimentovať s rôznymi nastaveniami minimálneho vlákna, aby ste dosiahli najlepší výkon svojej aplikácie .Net.

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