Runtimeconfiguratieopties voor threading
In dit artikel worden de instellingen beschreven die u kunt gebruiken voor het configureren van threading in .NET.
Notitie
.NET 6 standaardiseert het voorvoegsel DOTNET_
in plaats van COMPlus_
voor omgevingsvariabelen die .NET-runtimegedrag configureren. COMPlus_
Het voorvoegsel blijft echter werken. Als u een eerdere versie van de .NET-runtime gebruikt, moet u nog steeds het COMPlus_
voorvoegsel voor omgevingsvariabelen gebruiken.
Alle CPU-groepen gebruiken in Windows
- Op computers met meerdere CPU-groepen configureert deze instelling of onderdelen zoals de threadgroep alle CPU-groepen of alleen de primaire CPU-groep van het proces gebruiken. De instelling is ook van invloed op wat Environment.ProcessorCount er wordt geretourneerd.
- Wanneer deze instelling is ingeschakeld, worden alle CPU-groepen gebruikt en worden threads standaard ook automatisch verdeeld over CPU-groepen .
- Deze instelling is standaard ingeschakeld voor Windows 11 en latere versies en is standaard uitgeschakeld in Windows 10 en eerdere versies. Als deze instelling van kracht wordt wanneer ingeschakeld, moet de GC ook worden geconfigureerd voor het gebruik van alle CPU-groepen; Zie GC CPU-groepen voor meer informatie.
Naam instelling | Waarden | |
---|---|---|
runtimeconfig.json | N.v.t. | N.v.t. |
Omgevingsvariabele | COMPlus_Thread_UseAllCpuGroups of DOTNET_Thread_UseAllCpuGroups |
0 -Handicap1 -Ingeschakeld |
Threads toewijzen aan CPU-groepen in Windows
- Op computers met meerdere CPU-groepen en alle CPU-groepen worden gebruikt, wordt met deze instelling geconfigureerd of threads automatisch worden verdeeld over CPU-groepen.
- Wanneer deze instelling is ingeschakeld, worden nieuwe threads toegewezen aan een CPU-groep op een manier die probeert een CPU-groep die al wordt gebruikt, volledig te vullen voordat een nieuwe CPU-groep wordt gebruikt.
- Deze instelling is standaard ingeschakeld.
Naam instelling | Waarden | |
---|---|---|
runtimeconfig.json | N.v.t. | N.v.t. |
Omgevingsvariabele | COMPlus_Thread_AssignCpuGroups of DOTNET_Thread_AssignCpuGroups |
0 -Handicap1 -Ingeschakeld |
Minimale threads
- Hiermee geeft u het minimum aantal threads voor de werkrolthreadgroep op.
- Komt overeen met de ThreadPool.SetMinThreads methode.
Naam instelling | Waarden | |
---|---|---|
runtimeconfig.json | System.Threading.ThreadPool.MinThreads |
Een geheel getal dat het minimale aantal threads aangeeft |
MSBuild-eigenschap | ThreadPoolMinThreads |
Een geheel getal dat het minimale aantal threads aangeeft |
Omgevingsvariabele | N.v.t. | N.v.t. |
Voorbeelden
runtimeconfig.json-bestand :
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.MinThreads": 4
}
}
}
runtimeconfig.template.json-bestand :
{
"configProperties": {
"System.Threading.ThreadPool.MinThreads": 4
}
}
Projectbestand:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ThreadPoolMinThreads>4</ThreadPoolMinThreads>
</PropertyGroup>
</Project>
Maximum aantal threads
- Hiermee geeft u het maximum aantal threads voor de werkrolthreadgroep op.
- Komt overeen met de ThreadPool.SetMaxThreads methode.
Naam instelling | Waarden | |
---|---|---|
runtimeconfig.json | System.Threading.ThreadPool.MaxThreads |
Een geheel getal dat het maximum aantal threads aangeeft |
MSBuild-eigenschap | ThreadPoolMaxThreads |
Een geheel getal dat het maximum aantal threads aangeeft |
Omgevingsvariabele | N.v.t. | N.v.t. |
Voorbeelden
runtimeconfig.json-bestand :
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.MaxThreads": 20
}
}
}
runtimeconfig.template.json-bestand :
{
"configProperties": {
"System.Threading.ThreadPool.MaxThreads": 20
}
}
Projectbestand:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ThreadPoolMaxThreads>20</ThreadPoolMaxThreads>
</PropertyGroup>
</Project>
Windows-threadgroep
- Voor projecten in Windows configureert u of threadgroepbeheer is gedelegeerd aan de Windows-threadgroep.
- Als u deze instelling weglaat of het platform geen Windows is, wordt in plaats daarvan de .NET-threadgroep gebruikt.
- Alleen toepassingen die zijn gepubliceerd met Systeemeigen AOT in Windows, gebruiken standaard de Windows-threadgroep, waarvoor u ervoor kunt kiezen om in plaats daarvan de .NET-threadgroep te gebruiken door de configuratie-instelling uit te schakelen.
- De Windows-threadgroep kan in sommige gevallen beter presteren, zoals in gevallen waarin het minimum aantal threads is geconfigureerd voor een hoge waarde of wanneer de Windows-threadgroep al intensief wordt gebruikt door de app. Er kunnen zich ook gevallen voordoen waarbij de .NET-threadpool beter presteert, zoals bij zware I/O-verwerking op grotere machines. Het is raadzaam om prestatiegegevens te controleren bij het wijzigen van deze configuratie-instelling.
- Sommige API's worden niet ondersteund bij het gebruik van de Windows-threadgroep, zoals ThreadPool.SetMinThreads, ThreadPool.SetMaxThreadsen ThreadPool.BindHandle(SafeHandle). Configuratie-instellingen voor threadgroepen voor minimum- en maximumthreads zijn ook niet effectief. Een alternatief voor ThreadPool.BindHandle(SafeHandle) de ThreadPoolBoundHandle klas.
Naam instelling | Waarden | Versie geïntroduceerd | |
---|---|---|---|
runtimeconfig.json | System.Threading.ThreadPool.UseWindowsThreadPool |
true -Ingeschakeldfalse -Handicap |
.NET 8 |
MSBuild-eigenschap | UseWindowsThreadPool |
true -Ingeschakeldfalse -Handicap |
.NET 8 |
Omgevingsvariabele | DOTNET_ThreadPool_UseWindowsThreadPool |
1 -Ingeschakeld0 -Handicap |
.NET 8 |
Voorbeelden
runtimeconfig.json-bestand :
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.UseWindowsThreadPool": true
}
}
}
runtimeconfig.template.json-bestand :
{
"configProperties": {
"System.Threading.ThreadPool.UseWindowsThreadPool": true
}
}
Projectbestand:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<UseWindowsThreadPool>true</UseWindowsThreadPool>
</PropertyGroup>
</Project>
Threadinjectie als reactie op blokkerende werkitems
In sommige gevallen detecteert de threadgroep werkitems die de threads blokkeren. Ter compensatie injecteert het meer threads. In .NET 6+ kunt u de volgende runtimeconfiguratie-instellingen gebruiken om threadinjectie te configureren als reactie op het blokkeren van werkitems. Deze instellingen worden momenteel alleen van kracht voor werkitems die wachten tot een andere taak is voltooid, zoals in typische synchronisatie-over-asynchrone gevallen.
naam van runtimeconfig.json-instelling | Beschrijving | Versie geïntroduceerd |
---|---|---|
System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor |
Nadat het aantal threads op basis van MinThreads is bereikt, geeft deze waarde (nadat deze is vermenigvuldigd met het aantal processoren) aan hoeveel extra threads zonder vertraging kunnen worden gemaakt. |
.NET 6 |
System.Threading.ThreadPool.Blocking.ThreadsPerDelayStep_ProcCountFactor |
Nadat het aantal threads is bereikt op ThreadsToAddWithoutDelay basis van het aantal threads, geeft deze waarde (nadat deze is vermenigvuldigd met het aantal processoren) aan hoeveel threads een extra DelayStepMs aan de vertraging wordt toegevoegd voordat elke nieuwe thread wordt gemaakt. |
.NET 6 |
System.Threading.ThreadPool.Blocking.DelayStepMs |
Nadat het aantal threads op basis van ThreadsToAddWithoutDelay is bereikt, geeft deze waarde aan hoeveel extra vertraging per ThreadsPerDelayStep thread moet worden toegevoegd, die wordt toegepast voordat elke nieuwe thread wordt gemaakt. |
.NET 6 |
System.Threading.ThreadPool.Blocking.MaxDelayMs |
Nadat het aantal threads op basis van ThreadsToAddWithoutDelay is bereikt, geeft deze waarde de maximale vertraging op die moet worden gebruikt voordat elke nieuwe thread wordt gemaakt. |
.NET 6 |
System.Threading.ThreadPool.Blocking.IgnoreMemoryUsage |
Standaard wordt de snelheid van threadinjectie als reactie op blokkeren beperkt door heuristieken die bepalen of er voldoende fysiek geheugen beschikbaar is. In sommige situaties is het misschien beter om threads sneller te injecteren, zelfs in situaties met weinig geheugen. U kunt de heuristiek van het geheugengebruik uitschakelen door deze schakelaar uit te schakelen. | .NET 7 |
Hoe de configuratie-instellingen van kracht worden
- Nadat het aantal threads op basis van
MinThreads
is bereikt, kunnen maximaalThreadsToAddWithoutDelay
extra threads zonder vertraging worden gemaakt. - Daarna wordt, voordat elke extra thread wordt gemaakt, een vertraging geïnduceerd, beginnend met
DelayStepMs
. - Voor elke
ThreadsPerDelayStep
thread die met een vertraging wordt toegevoegd, wordt er een extraDelayStepMs
toegevoegd aan de vertraging. - De vertraging mag niet groter zijn dan
MaxDelayMs
. - Vertragingen worden alleen veroorzaakt voordat u threads maakt. Als threads al beschikbaar zijn, worden ze zonder vertraging vrijgegeven om werkitems te compenseren.
- Het fysieke geheugengebruik en de limieten worden ook gebruikt en, buiten een drempelwaarde, schakelt het systeem over naar tragere threadinjectie.
Voorbeelden
runtimeconfig.json-bestand :
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
}
}
}
runtimeconfig.template.json-bestand :
{
"configProperties": {
"System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
}
}
AutoreleasePool
voor beheerde threads
Met deze optie configureert u of elke beheerde thread een impliciete NSAutoreleasePool ontvangt wanneer deze wordt uitgevoerd op een ondersteund macOS-platform.
Naam instelling | Waarden | Versie geïntroduceerd | |
---|---|---|---|
runtimeconfig.json | System.Threading.Thread.EnableAutoreleasePool |
true of false |
.NET 6 |
MSBuild-eigenschap | AutoreleasePoolSupport |
true of false |
.NET 6 |
Omgevingsvariabele | N.v.t. | N.v.t. | N.v.t. |
Voorbeelden
runtimeconfig.json-bestand :
{
"runtimeOptions": {
"configProperties": {
"System.Threading.Thread.EnableAutoreleasePool": true
}
}
}
runtimeconfig.template.json-bestand :
{
"configProperties": {
"System.Threading.Thread.EnableAutoreleasePool": true
}
}
Projectbestand:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<AutoreleasePoolSupport>true</AutoreleasePoolSupport>
</PropertyGroup>
</Project>