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án
1 -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án
1 -Povoleno

Minimální počet vláken

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

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 -Povoleno
false -Zakázán
.NET 8
Vlastnost MSBuild UseWindowsThreadPool true -Povoleno
false -Zakázán
.NET 8
Proměnná prostředí DOTNET_ThreadPool_UseWindowsThreadPool 1 -Povoleno
0 -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>