Programování

Pochopte fond vláken .Net CLR

V rámci .Net Framework je CLR odpovědný za odměřování prostředků do běžících aplikací. Fond vláken CLR zejména určuje, kdy mají být vlákna přidána nebo odebrána. Pochopení, jak to funguje, vám pomůže určit, jak nakonfigurovat aplikaci ASP.Net pro optimální výkon.

Fond vláken CLR obsahuje dva druhy vláken - pracovní vlákna a port I / O dokončení nebo vlákna IOCP. To znamená, že váš pracovní proces ASP.Net ve skutečnosti obsahuje dva fondy vláken: fond pracovních vláken a fond vláken IOCP. Tyto bazény mají přirozeně různé účely.

Když používáte metody jako Úkol, TaskFactory.StartNew, a ThreadPool.QueueUserWorkItem, runtime využívá ke zpracování pracovní vlákna. Když ve své aplikaci provádíte asynchronní I / O volání nebo vaše aplikace přistupuje k systému souborů, databázím, webovým službám atd., Modul runtime používá vlákna IOCP. Mějte také na paměti, že každá doména aplikace má svůj vlastní fond podprocesů.

Podívejme se blíže na to, jak jsou tato vlákna vytvářena a odstraňována v .Net Framework.

Strategie vstřikování závitů

Pool podprocesů .Net začne vkládat nová vlákna vždy, když se počet zaneprázdněných podprocesů rovná počtu nakonfigurovaných minimálních podprocesů ve fondu podprocesů. Výchozí hodnota minimálního nastavení, což je minimální početoba pracovní a vlákna IOCP, je určena počtem procesorů ve vašem systému. Pokud má tedy váš systém čtyři jádra, měli byste ve výchozím nastavení čtyři pracovní vlákna a čtyři vlákna IOCP.

Fond vláken .Net poté na vyžádání vstřikuje další pracovní vlákna, pokud se využijí existující vlákna a je ještě třeba pracovat. Ze stejného důvodu, pokud poptávka po zdrojích poklesne, fond vláken začne vlákna odebírat.

Provedení následujícího fragmentu kódu by zobrazilo počet logických procesorů ve vašem systému a minimální počet dostupných pracovních a podprocesů IOCP.

static void Main (řetězec [] args)

{

int minimumWorkerThreadCount, minimumIOCThreadCount;

int logicalProcessorCount = System.Environment.ProcessorCount;

ThreadPool.GetMinThreads (out minimumWorkerThreadCount, out minimumIOCThreadCount);

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

Console.WriteLine („Minimální počet pracovních vláken:“ + minimumWorkerThreadCount);

Console.WriteLine („Minimální počet vláken IOCP:“ + minimumIOCThreadCount);

Console.Read ();

}

Fond vláken .Net spravuje vlákna pomocí své vestavěné heuristiky. Přijaté strategie zahrnují vyhýbání se hladovění a algoritmus horolezectví. V prvním případě fond vláken .Net pokračuje v přidávání pracovních vláken, pokud u položek ve frontě není viditelný pokrok. V druhém případě se fond vláken .Net pokusí maximalizovat propustnost pomocí co nejméně vláken.

Fond vláken .Net injektuje nebo odstraňuje vlákna v intervalech 500 milisekund nebo se vlákno uvolní, podle toho, co nastane dříve. Nyní na základě zpětné vazby dostupné modulu runtime fond vláken .Net buď odstraní vlákna, nebo přidá vlákna, aby maximalizoval propustnost. Pokud přidání podprocesu nezvýší propustnost, odebere podproces. Toto je CLR technika horolezectví v akci.

Nyní předpokládejme, že používáte svou aplikaci ASP.Net na IIS a váš webový server má celkem čtyři CPU. Předpokládejme, že v daném okamžiku existuje 24 požadavků na zpracování. Ve výchozím nastavení by modul runtime vytvořil čtyři vlákna, která by byla k dispozici pro obsluhu prvních čtyř požadavků. Protože do 500 milisekund nebudou přidána žádná další vlákna, dalších 20 požadavků bude muset čekat ve frontě. Po uplynutí 500 milisekund je vytvořeno nové vlákno.

Jak můžete vidět, bude trvat mnoho 500ms intervalů, než dohoníte pracovní vytížení. To je dobrý důvod pro použití asynchronního programování. Díky asynchronnímu programování nejsou vlákna při zpracování požadavků blokována, takže čtyři vlákna by se uvolnila téměř okamžitě.

Doporučené nastavení vlákna

Vzhledem k tomu, jak fond vláken .Net funguje a co jsme dosud probírali, důrazně se doporučuje změnit minimální konfigurační hodnotu - výchozí hodnotu - jak pro pracovní vlákna, tak pro vlákna IOCP. Chcete-li to provést v ASP.Net, měli byste změnit minWorkerThreads a minIoThreads nastavení konfigurace pod konfigurační prvek v souboru machine.config ve vašem systému.

minIoThreads = ”zde zadejte požadovanou hodnotu” />

Můžete nastavit minimální hodnoty konfigurace pro pracovní i podprocesy IOCP na libovolnou hodnotu mezi jednou a 50. Dobrým přístupem je převzetí výpisu procesu v uživatelském režimu pracovního procesu IIS (W3wp.exe) a poté použití ! threadpool příkaz k hlášení celkového počtu pracovních vláken. Jakmile tuto hodnotu znáte, jednoduše ji vydělte počtem procesorových jader ve vašem systému, abyste určili minimální nastavení vlákna pracovníka a IOCP. Pokud je například celkový počet pracovních vláken 100 a máte v systému čtyři procesory, můžete nastavit minimální hodnoty pro pracovní vlákna i vlákna IOCP na 25.

Chcete-li změnit výchozí minimální nastavení podprocesu mimo ASP.Net, můžete použít ThreadPool.SetMinThreads () metoda.

S cílem lepší správy podprocesů a lepšího výkonu byl u každé verze CLR vylepšen fond podprocesů CLR. Jako příklad s .Net Framework 4 získal CLR algoritmy krádeže vláken a podporu souběžnosti a paralelismu. S každou novou verzí CLR je fond podprocesů .Net chytřejší ohledně optimalizace propustnosti vytvářením a ničením vláken podle potřeby. Mezitím budete chtít experimentovat s různými minimálními nastaveními podprocesů, abyste ze své aplikace .Net získali nejlepší výkon.