Körningskonfigurationsalternativ för trådning
Den här artikeln beskriver de inställningar som du kan använda för att konfigurera trådning i .NET.
Kommentar
.NET 6 standardiserar på prefixet DOTNET_
i stället COMPlus_
för för miljövariabler som konfigurerar .NET-körningsbeteende. Prefixet COMPlus_
fortsätter dock att fungera. Om du använder en tidigare version av .NET-körningen bör du fortfarande använda prefixet COMPlus_
för miljövariabler.
Använda alla CPU-grupper i Windows
- På datorer som har flera CPU-grupper konfigurerar den här inställningen om komponenter som trådpoolen använder alla CPU-grupper eller endast processens primära CPU-grupp. Inställningen påverkar också vad som Environment.ProcessorCount returneras.
- När den här inställningen är aktiverad används alla CPU-grupper och trådar distribueras också automatiskt över CPU-grupper som standard.
- Den här inställningen är aktiverad som standard i Windows 11 och senare versioner och inaktiveras som standard i Windows 10 och tidigare versioner. För att den här inställningen ska börja gälla när den är aktiverad måste GC också konfigureras för att använda alla CPU-grupper. Mer information finns i GC CPU-grupper.
Inställningsnamn | Värden | |
---|---|---|
runtimeconfig.json | Saknas | Saknas |
Miljövariabel | COMPlus_Thread_UseAllCpuGroups eller DOTNET_Thread_UseAllCpuGroups |
0 -Inaktiverad1 -Aktiverat |
Tilldela trådar till CPU-grupper i Windows
- På datorer som har flera CPU-grupper och alla CPU-grupper används, konfigurerar den här inställningen om trådar distribueras automatiskt över CPU-grupper.
- När den här inställningen är aktiverad tilldelas nya trådar till en CPU-grupp på ett sätt som försöker fylla i en processorgrupp som redan används innan en ny processorgrupp används.
- Den här inställningen är aktiverad som standard.
Inställningsnamn | Värden | |
---|---|---|
runtimeconfig.json | Saknas | Saknas |
Miljövariabel | COMPlus_Thread_AssignCpuGroups eller DOTNET_Thread_AssignCpuGroups |
0 -Inaktiverad1 -Aktiverat |
Minsta antal trådar
- Anger det minsta antalet trådar för arbetstrådspoolen.
- Motsvarar ThreadPool.SetMinThreads metoden.
Inställningsnamn | Värden | |
---|---|---|
runtimeconfig.json | System.Threading.ThreadPool.MinThreads |
Ett heltal som representerar det minsta antalet trådar |
MSBuild-egenskap | ThreadPoolMinThreads |
Ett heltal som representerar det minsta antalet trådar |
Miljövariabel | Saknas | Saknas |
Exempel
runtimeconfig.json-fil :
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.MinThreads": 4
}
}
}
runtimeconfig.template.json-fil :
{
"configProperties": {
"System.Threading.ThreadPool.MinThreads": 4
}
}
Projektfil:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ThreadPoolMinThreads>4</ThreadPoolMinThreads>
</PropertyGroup>
</Project>
Maximalt antal trådar
- Anger det maximala antalet trådar för arbetstrådspoolen.
- Motsvarar ThreadPool.SetMaxThreads metoden.
Inställningsnamn | Värden | |
---|---|---|
runtimeconfig.json | System.Threading.ThreadPool.MaxThreads |
Ett heltal som representerar det maximala antalet trådar |
MSBuild-egenskap | ThreadPoolMaxThreads |
Ett heltal som representerar det maximala antalet trådar |
Miljövariabel | Saknas | Saknas |
Exempel
runtimeconfig.json-fil :
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.MaxThreads": 20
}
}
}
runtimeconfig.template.json-fil :
{
"configProperties": {
"System.Threading.ThreadPool.MaxThreads": 20
}
}
Projektfil:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ThreadPoolMaxThreads>20</ThreadPoolMaxThreads>
</PropertyGroup>
</Project>
Windows-trådpool
- För projekt i Windows konfigurerar du om trådpoolens trådhantering delegeras till Windows-trådpoolen.
- Om du utelämnar den här inställningen eller om plattformen inte är Windows används .NET-trådpoolen i stället.
- Endast program som publiceras med intern AOT i Windows använder Windows-trådpoolen som standard, för vilka du kan välja att använda .NET-trådpoolen i stället genom att inaktivera konfigurationsinställningen.
- Windows-trådpoolen kan fungera bättre i vissa fall, till exempel i fall där det minsta antalet trådar är konfigurerat till ett högt värde, eller när Windows-trådpoolen redan används mycket av appen. Det kan också finnas fall där .NET-trådpoolen presterar bättre, till exempel vid tung I/O-hantering på större datorer. Vi rekommenderar att du kontrollerar prestandamått när du ändrar den här konfigurationsinställningen.
- Vissa API:er stöds inte när du använder Windows-trådpoolen, till exempel ThreadPool.SetMinThreads, ThreadPool.SetMaxThreadsoch ThreadPool.BindHandle(SafeHandle). Konfigurationsinställningar för trådpooler för minsta och högsta antal trådar är inte heller effektiva. Ett alternativ till ThreadPool.BindHandle(SafeHandle) är ThreadPoolBoundHandle klassen.
Inställningsnamn | Värden | Version introducerad | |
---|---|---|---|
runtimeconfig.json | System.Threading.ThreadPool.UseWindowsThreadPool |
true -Aktiveratfalse -Inaktiverad |
.NET 8 |
MSBuild-egenskap | UseWindowsThreadPool |
true -Aktiveratfalse -Inaktiverad |
.NET 8 |
Miljövariabel | DOTNET_ThreadPool_UseWindowsThreadPool |
1 -Aktiverat0 -Inaktiverad |
.NET 8 |
Exempel
runtimeconfig.json-fil :
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.UseWindowsThreadPool": true
}
}
}
runtimeconfig.template.json-fil :
{
"configProperties": {
"System.Threading.ThreadPool.UseWindowsThreadPool": true
}
}
Projektfil:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<UseWindowsThreadPool>true</UseWindowsThreadPool>
</PropertyGroup>
</Project>
Trådinmatning som svar på blockering av arbetsobjekt
I vissa fall identifierar trådpoolen arbetsobjekt som blockerar dess trådar. För att kompensera injicerar det fler trådar. I .NET 6+ kan du använda följande inställningar för körningskonfiguration för att konfigurera trådinmatning som svar på blockering av arbetsobjekt. För närvarande börjar de här inställningarna endast gälla för arbetsobjekt som väntar på att en annan uppgift ska slutföras, till exempel i vanliga synkroniserings-över-asynkrona fall.
namn på inställningen runtimeconfig.json | beskrivning | Version introducerad |
---|---|---|
System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor |
När antalet trådar som baseras på MinThreads har nåtts anger det här värdet (efter att det multiplicerats med antalet processorer) hur många ytterligare trådar som kan skapas utan fördröjning. |
.NET 6 |
System.Threading.ThreadPool.Blocking.ThreadsPerDelayStep_ProcCountFactor |
När antalet trådar som baseras på ThreadsToAddWithoutDelay har nåtts anger det här värdet (efter att det multiplicerats med antalet processorer) efter hur många trådar som ytterligare DelayStepMs skulle läggas till i fördröjningen innan varje ny tråd skapas. |
.NET 6 |
System.Threading.ThreadPool.Blocking.DelayStepMs |
När antalet trådar som baseras på ThreadsToAddWithoutDelay har nåtts anger det här värdet hur mycket ytterligare fördröjning som ska läggas till per ThreadsPerDelayStep trådar, vilket skulle tillämpas innan varje ny tråd skapas. |
.NET 6 |
System.Threading.ThreadPool.Blocking.MaxDelayMs |
När antalet trådar som baseras på ThreadsToAddWithoutDelay har nåtts anger det här värdet den maximala fördröjning som ska användas innan varje ny tråd skapas. |
.NET 6 |
System.Threading.ThreadPool.Blocking.IgnoreMemoryUsage |
Som standard begränsas trådinmatningshastigheten som svar på blockering av heuristik som avgör om det finns tillräckligt med fysiskt minne tillgängligt. I vissa situationer kan det vara bättre att mata in trådar snabbare även i situationer med lågt minne. Du kan inaktivera minnesanvändningens heuristik genom att stänga av den här växeln. | .NET 7 |
Så här träder konfigurationsinställningarna i kraft
- När antalet trådar som baseras på
MinThreads
har nåtts kan upp tillThreadsToAddWithoutDelay
ytterligare trådar skapas utan fördröjning. - Därefter, innan varje ytterligare tråd skapas, uppstår en fördröjning som börjar med
DelayStepMs
. - För varje
ThreadsPerDelayStep
tråd som läggs till med en fördröjning läggs ytterligareDelayStepMs
en till i fördröjningen. - Fördröjningen får inte överstiga
MaxDelayMs
. - Fördröjningar uppstår bara innan trådar skapas. Om trådar redan är tillgängliga släpps de utan fördröjning för att kompensera för blockering av arbetsobjekt.
- Användning och gränser för fysiskt minne används också, och utöver ett tröskelvärde växlar systemet till långsammare trådinmatning.
Exempel
runtimeconfig.json-fil :
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
}
}
}
runtimeconfig.template.json-fil :
{
"configProperties": {
"System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
}
}
AutoreleasePool
för hanterade trådar
Det här alternativet konfigurerar om varje hanterad tråd tar emot en implicit NSAutoreleasePool när den körs på en macOS-plattform som stöds.
Inställningsnamn | Värden | Version introducerad | |
---|---|---|---|
runtimeconfig.json | System.Threading.Thread.EnableAutoreleasePool |
true eller false |
.NET 6 |
MSBuild-egenskap | AutoreleasePoolSupport |
true eller false |
.NET 6 |
Miljövariabel | Saknas | Saknas | Saknas |
Exempel
runtimeconfig.json-fil :
{
"runtimeOptions": {
"configProperties": {
"System.Threading.Thread.EnableAutoreleasePool": true
}
}
}
runtimeconfig.template.json-fil :
{
"configProperties": {
"System.Threading.Thread.EnableAutoreleasePool": true
}
}
Projektfil:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<AutoreleasePoolSupport>true</AutoreleasePoolSupport>
</PropertyGroup>
</Project>