Možnosti konfigurace modulu runtime pro podprocesy
Tento článek podrobně popisuje nastavení, která můžete použít ke konfiguraci podprocesů v .NET.
Poznámka:
.NET 6 standardizuje předponu DOTNET_
místo COMPlus_
proměnných prostředí, které konfigurují chování za běhu .NET. Předpona COMPlus_
ale bude i nadále fungovat. Pokud používáte předchozí verzi modulu runtime .NET, měli byste stále používat předponu COMPlus_
pro proměnné prostředí.
Použití všech skupin procesoru ve Windows
- Na počítačích s více skupinami procesoru toto nastavení konfiguruje, jestli komponenty, jako je fond vláken, používají všechny skupiny procesoru nebo pouze primární skupinu procesoru procesu. Nastavení také ovlivňuje, co Environment.ProcessorCount se vrátí.
- Pokud je toto nastavení povolené, použijí se všechny skupiny procesoru a vlákna se automaticky distribuují také mezi skupiny procesoru.
- Toto nastavení je ve výchozím nastavení povolené ve Windows 11 a novějších verzích a ve výchozím nastavení je zakázané ve Windows 10 a starších verzích. Aby se toto nastavení projevilo, pokud je povoleno, musí být uvolňování paměti také nakonfigurováno tak, aby používalo všechny skupiny procesoru; Další informace naleznete v tématu Skupiny procesoru uvolňování paměti.
Název nastavení | Hodnoty | |
---|---|---|
runtimeconfig.json | – | N/A |
Proměnná prostředí | COMPlus_Thread_UseAllCpuGroups nebo DOTNET_Thread_UseAllCpuGroups |
0 -Zakázán1 -Povoleno |
Přiřazení vláken ke skupinám procesoru ve Windows
- Na počítačích s více skupinami procesoru a všechny skupiny procesorů se toto nastavení konfiguruje, jestli se vlákna automaticky distribuují napříč skupinami procesoru.
- Pokud je toto nastavení povolené, přiřadí se nová vlákna ke skupině procesoru způsobem, který se pokusí plně naplnit skupinu procesoru, která je již používána před použitím nové skupiny procesoru.
- Toto nastavení je standardně zapnuté.
Název nastavení | Hodnoty | |
---|---|---|
runtimeconfig.json | – | N/A |
Proměnná prostředí | COMPlus_Thread_AssignCpuGroups nebo DOTNET_Thread_AssignCpuGroups |
0 -Zakázán1 -Povoleno |
Minimální počet vláken
- Určuje minimální počet vláken pro fond pracovních vláken.
- ThreadPool.SetMinThreads Odpovídá metodě.
Název nastavení | Hodnoty | |
---|---|---|
runtimeconfig.json | System.Threading.ThreadPool.MinThreads |
Celé číslo představující minimální počet vláken |
Vlastnost MSBuild | ThreadPoolMinThreads |
Celé číslo představující minimální počet vláken |
Proměnná prostředí | – | N/A |
Příklady
soubor runtimeconfig.json :
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.MinThreads": 4
}
}
}
soubor runtimeconfig.template.json :
{
"configProperties": {
"System.Threading.ThreadPool.MinThreads": 4
}
}
Soubor projektu:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ThreadPoolMinThreads>4</ThreadPoolMinThreads>
</PropertyGroup>
</Project>
Maximální počet vláken
- Určuje maximální počet vláken pro fond pracovních vláken.
- ThreadPool.SetMaxThreads Odpovídá metodě.
Název nastavení | Hodnoty | |
---|---|---|
runtimeconfig.json | System.Threading.ThreadPool.MaxThreads |
Celé číslo představující maximální počet vláken |
Vlastnost MSBuild | ThreadPoolMaxThreads |
Celé číslo představující maximální počet vláken |
Proměnná prostředí | – | N/A |
Příklady
soubor runtimeconfig.json :
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.MaxThreads": 20
}
}
}
soubor runtimeconfig.template.json :
{
"configProperties": {
"System.Threading.ThreadPool.MaxThreads": 20
}
}
Soubor projektu:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ThreadPoolMaxThreads>20</ThreadPoolMaxThreads>
</PropertyGroup>
</Project>
Fond vláken Windows
- U projektů ve Windows konfiguruje, zda je správa vláken fondu vláken delegována do fondu vláken Systému Windows.
- Pokud toto nastavení vynecháte nebo platforma není Windows, použije se místo toho fond vláken .NET.
- Ve výchozím nastavení používají fond vláken Systému Windows publikované pouze aplikace publikované s nativní AOT ve Windows, pro které se místo toho můžete rozhodnout použít fond vláken .NET zakázáním nastavení konfigurace.
- Fond vláken Windows může v některých případech fungovat lépe, například v případech, kdy je minimální počet vláken nakonfigurovaný na vysokou hodnotu nebo když fond vláken Windows už aplikaci silně využívá. V případech, kdy fond vláken .NET funguje lépe, například při náročném zpracování vstupně-výstupních operací na větších počítačích. Při změně tohoto nastavení konfigurace doporučujeme zkontrolovat metriky výkonu.
- Některá rozhraní API nejsou podporována při použití fondu vláken systému Windows, například ThreadPool.SetMinThreads, ThreadPool.SetMaxThreadsa ThreadPool.BindHandle(SafeHandle). Nastavení konfigurace fonduvlákench Alternativou ThreadPool.BindHandle(SafeHandle)ThreadPoolBoundHandle je třída.
Název nastavení | Hodnoty | Zavedená verze | |
---|---|---|---|
runtimeconfig.json | System.Threading.ThreadPool.UseWindowsThreadPool |
true -Povolenofalse -Zakázán |
.NET 8 |
Vlastnost MSBuild | UseWindowsThreadPool |
true -Povolenofalse -Zakázán |
.NET 8 |
Proměnná prostředí | DOTNET_ThreadPool_UseWindowsThreadPool |
1 -Povoleno0 -Zakázán |
.NET 8 |
Příklady
soubor runtimeconfig.json :
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.UseWindowsThreadPool": true
}
}
}
soubor runtimeconfig.template.json :
{
"configProperties": {
"System.Threading.ThreadPool.UseWindowsThreadPool": true
}
}
Soubor projektu:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<UseWindowsThreadPool>true</UseWindowsThreadPool>
</PropertyGroup>
</Project>
Injektáž vlákna v reakci na blokování pracovních položek
V některých případech fond vláken detekuje pracovní položky, které blokují jeho vlákna. Aby se kompenzovala, vloží více vláken. V rozhraní .NET 6 nebo novějších můžete pomocí následujících nastavení konfigurace modulu runtime nakonfigurovat injektáž vlákna v reakci na blokování pracovních položek. V současné době se tato nastavení projeví jenom u pracovních položek, které čekají na dokončení jiného úkolu, například v typických asynchronních případech synchronizace .
název nastavení runtimeconfig.json | Popis | Zavedená verze |
---|---|---|
System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor |
Po dosažení počtu MinThreads vláken určuje tato hodnota (po vynásobení počtem procesorů), kolik dalších vláken může být vytvořeno bez zpoždění. |
.NET 6 |
System.Threading.ThreadPool.Blocking.ThreadsPerDelayStep_ProcCountFactor |
Po dosažení počtu ThreadsToAddWithoutDelay vláken určuje tato hodnota (po vynásobení počtem procesorů) po přidání dalších DelayStepMs vláken do zpoždění před vytvořením každého nového vlákna. |
.NET 6 |
System.Threading.ThreadPool.Blocking.DelayStepMs |
Po dosažení počtu vláken určuje ThreadsToAddWithoutDelay tato hodnota další zpoždění přidání na ThreadsPerDelayStep vlákna, které by se použilo před vytvořením každého nového vlákna. |
.NET 6 |
System.Threading.ThreadPool.Blocking.MaxDelayMs |
Po dosažení počtu ThreadsToAddWithoutDelay vláken určuje tato hodnota maximální prodlevu, která se má použít před vytvořením každého nového vlákna. |
.NET 6 |
System.Threading.ThreadPool.Blocking.IgnoreMemoryUsage |
Ve výchozím nastavení je míra injektáže vlákna v reakci na blokování omezena heuristiky, které určují, zda je k dispozici dostatek fyzické paměti. V některých situacích může být vhodnější vložit vlákna rychleji i v situacích s nedostatkem paměti. Heuristika využití paměti můžete zakázat vypnutím tohoto přepínače. | .NET 7 |
Jak se nastavení konfigurace projeví
- Po dosažení počtu
MinThreads
vláken je možné vytvořit ažThreadsToAddWithoutDelay
další vlákna bez zpoždění. - Potom se před vytvořením každého dalšího vlákna vyvolá zpoždění počínaje
DelayStepMs
. - Pro všechna
ThreadsPerDelayStep
vlákna přidaná se zpožděním přidá dalšíDelayStepMs
. - Zpoždění nesmí překročit
MaxDelayMs
. - Zpoždění jsou vyvolána pouze před vytvořením vláken. Pokud už jsou vlákna dostupná, uvolní se bez zpoždění, aby se kompenzuje blokování pracovních položek.
- Používají se také fyzické využití a limity fyzické paměti a systém se přepne na pomalejší injektáž vláken.
Příklady
soubor runtimeconfig.json :
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
}
}
}
soubor runtimeconfig.template.json :
{
"configProperties": {
"System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
}
}
AutoreleasePool
pro spravovaná vlákna
Tato možnost konfiguruje, jestli každé spravované vlákno obdrží implicitní NSAutoreleasePool při spuštění na podporované platformě macOS.
Název nastavení | Hodnoty | Zavedená verze | |
---|---|---|---|
runtimeconfig.json | System.Threading.Thread.EnableAutoreleasePool |
true nebo false |
.NET 6 |
Vlastnost MSBuild | AutoreleasePoolSupport |
true nebo false |
.NET 6 |
Proměnná prostředí | – | – | N/A |
Příklady
soubor runtimeconfig.json :
{
"runtimeOptions": {
"configProperties": {
"System.Threading.Thread.EnableAutoreleasePool": true
}
}
}
soubor runtimeconfig.template.json :
{
"configProperties": {
"System.Threading.Thread.EnableAutoreleasePool": true
}
}
Soubor projektu:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<AutoreleasePoolSupport>true</AutoreleasePoolSupport>
</PropertyGroup>
</Project>