Futásidejű konfigurációs beállítások a szálkezeléshez
Ez a cikk a .NET-beli szálkezelés konfigurálásához használható beállításokat ismerteti.
Megjegyzés:
A .NET 6 az előtagon DOTNET_
szabványosítja a .NET futásidejű viselkedést konfiguráló környezeti változók helyett COMPlus_
. Az COMPlus_
előtag azonban továbbra is működni fog. Ha a .NET-futtatókörnyezet egy korábbi verzióját használja, akkor is használja a COMPlus_
környezeti változók előtagját.
Az összes CPU-csoport használata Windows rendszeren
- A több PROCESSZORcsoportot tartalmazó gépeken ez a beállítás konfigurálja, hogy az olyan összetevők, mint a szálkészlet, az összes CPU-csoportot vagy csak a folyamat elsődleges CPU-csoportját használják-e. A beállítás a visszaadott értékre is hatással van Environment.ProcessorCount .
- Ha ez a beállítás engedélyezve van, a rendszer minden CPU-csoportot használ, és alapértelmezés szerint a szálak is automatikusan el vannak osztva a processzorcsoportok között.
- Ez a beállítás alapértelmezés szerint engedélyezve van a Windows 11 és újabb verziókban, és alapértelmezés szerint le van tiltva a Windows 10-ben és a korábbi verziókban. Ahhoz, hogy ez a beállítás engedélyezve legyen, a csoportházirend-objektumot is konfigurálni kell az összes CPU-csoport használatára; további információ: GC CPU-csoportok.
A beállítás neve | Értékek | |
---|---|---|
runtimeconfig.json | N.A. | N.A. |
Környezeti változó | COMPlus_Thread_UseAllCpuGroups vagy DOTNET_Thread_UseAllCpuGroups |
0 -Tiltva1 -Engedélyezve |
Szálak hozzárendelése CPU-csoportokhoz Windows rendszeren
- A több CPU-csoportokkal rendelkező és az összes CPU-csoportot használó gépeken ez a beállítás konfigurálja, hogy a szálak automatikusan el legyenek-e osztva a processzorcsoportok között.
- Ha ez a beállítás engedélyezve van, a rendszer úgy rendel hozzá új szálakat egy CPU-csoporthoz, hogy az új CPU-csoport használata előtt teljesen feltöltse a már használatban lévő processzorcsoportot.
- Alapértelmezés szerint ez a beállítás engedélyezett.
A beállítás neve | Értékek | |
---|---|---|
runtimeconfig.json | N.A. | N.A. |
Környezeti változó | COMPlus_Thread_AssignCpuGroups vagy DOTNET_Thread_AssignCpuGroups |
0 -Tiltva1 -Engedélyezve |
Minimális szálak
- Megadja a feldolgozói szálkészlet szálainak minimális számát.
- Megfelel a metódusnak ThreadPool.SetMinThreads .
A beállítás neve | Értékek | |
---|---|---|
runtimeconfig.json | System.Threading.ThreadPool.MinThreads |
Egy egész szám, amely a szálak minimális számát jelöli |
MSBuild tulajdonság | ThreadPoolMinThreads |
Egy egész szám, amely a szálak minimális számát jelöli |
Környezeti változó | N.A. | N.A. |
Példák
runtimeconfig.json fájl:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.MinThreads": 4
}
}
}
runtimeconfig.template.json fájl:
{
"configProperties": {
"System.Threading.ThreadPool.MinThreads": 4
}
}
Projektfájl:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ThreadPoolMinThreads>4</ThreadPoolMinThreads>
</PropertyGroup>
</Project>
Szálak maximális száma
- A feldolgozói szálkészlet szálainak maximális számát adja meg.
- Megfelel a metódusnak ThreadPool.SetMaxThreads .
A beállítás neve | Értékek | |
---|---|---|
runtimeconfig.json | System.Threading.ThreadPool.MaxThreads |
Egy egész szám, amely a szálak maximális számát jelöli |
MSBuild tulajdonság | ThreadPoolMaxThreads |
Egy egész szám, amely a szálak maximális számát jelöli |
Környezeti változó | N.A. | N.A. |
Példák
runtimeconfig.json fájl:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.MaxThreads": 20
}
}
}
runtimeconfig.template.json fájl:
{
"configProperties": {
"System.Threading.ThreadPool.MaxThreads": 20
}
}
Projektfájl:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ThreadPoolMaxThreads>20</ThreadPoolMaxThreads>
</PropertyGroup>
</Project>
Windows-szálkészlet
- Windows-projektek esetén konfigurálja, hogy a szálkészlet szálkezelése delegálva legyen-e a Windows-szálkészletbe.
- Ha kihagyja ezt a beállítást, vagy a platform nem Windows, a rendszer a .NET-szálkészletet használja helyette.
- Alapértelmezés szerint csak a Windows natív AOT-jával közzétett alkalmazások használják a Windows-szálkészletet, amelyhez a .NET-szálkészletet használhatja a konfigurációs beállítás letiltásával.
- A Windows-szálkészlet bizonyos esetekben jobban teljesíthet, például olyan esetekben, amikor a szálak minimális száma magas értékre van konfigurálva, vagy ha az alkalmazás már használja a Windows-szálkészletet. Előfordulhatnak olyan esetek is, amikor a .NET-szálkészlet jobban teljesít, például nagyobb gépeken nagy I/O-kezelés esetén. A konfigurációs beállítás módosításakor célszerű ellenőrizni a teljesítménymetrikákat.
- Egyes API-k nem támogatottak a Windows-szálkészlet használata esetén, például ThreadPool.SetMinThreads: , ThreadPool.SetMaxThreadsés ThreadPool.BindHandle(SafeHandle). A szálkészlet minimális és maximális szálbeállításai szintén nem hatékonyak. A másik lehetőség az ThreadPool.BindHandle(SafeHandle)ThreadPoolBoundHandle osztály.
A beállítás neve | Értékek | Bevezetett verzió | |
---|---|---|---|
runtimeconfig.json | System.Threading.ThreadPool.UseWindowsThreadPool |
true -Engedélyezvefalse -Tiltva |
.NET 8 |
MSBuild tulajdonság | UseWindowsThreadPool |
true -Engedélyezvefalse -Tiltva |
.NET 8 |
Környezeti változó | DOTNET_ThreadPool_UseWindowsThreadPool |
1 -Engedélyezve0 -Tiltva |
.NET 8 |
Példák
runtimeconfig.json fájl:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.UseWindowsThreadPool": true
}
}
}
runtimeconfig.template.json fájl:
{
"configProperties": {
"System.Threading.ThreadPool.UseWindowsThreadPool": true
}
}
Projektfájl:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<UseWindowsThreadPool>true</UseWindowsThreadPool>
</PropertyGroup>
</Project>
Szálinjektálás a munkaelemek blokkolására válaszul
Bizonyos esetekben a szálkészlet észleli azokat a munkaelemeket, amelyek blokkolják a szálakat. A kompenzálás érdekében több szálat injektál. A .NET 6+-ban a következő futtatókörnyezeti konfigurációs beállítások használatával konfigurálhatja a szálinjektálást a munkaelemek blokkolására válaszul. Ezek a beállítások jelenleg csak azokra a munkaelemekre lépnek érvénybe, amelyek egy másik tevékenység befejezésére várnak, például a tipikus szinkronizálási aszinkron esetekben.
runtimeconfig.json beállítás neve | Leírás | Bevezetett verzió |
---|---|---|
System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor |
A szálszám MinThreads elérése után ez az érték (miután megszorozza a processzorok számával) meghatározza, hogy hány további szál hozható létre késedelem nélkül. |
.NET 6 |
System.Threading.ThreadPool.Blocking.ThreadsPerDelayStep_ProcCountFactor |
A szálszám ThreadsToAddWithoutDelay elérése után ez az érték (miután megszorozza a processzorok számával) azt határozza meg, hogy hány szálat adna hozzá a DelayStepMs késéshez az egyes új szálak létrehozása előtt. |
.NET 6 |
System.Threading.ThreadPool.Blocking.DelayStepMs |
A szálszám ThreadsToAddWithoutDelay elérése után ez az érték határozza meg, hogy mennyi további késleltetést kell hozzáadni szálonként ThreadsPerDelayStep , amelyet minden új szál létrehozása előtt alkalmazna. |
.NET 6 |
System.Threading.ThreadPool.Blocking.MaxDelayMs |
A szálszám ThreadsToAddWithoutDelay elérése után ez az érték határozza meg az egyes új szálak létrehozása előtt használandó maximális késleltetést. |
.NET 6 |
System.Threading.ThreadPool.Blocking.IgnoreMemoryUsage |
Alapértelmezés szerint a blokkolásra válaszul a szálinjektálás sebességét heurisztikusok korlátozzák, amelyek meghatározzák, hogy elegendő fizikai memória áll-e rendelkezésre. Bizonyos helyzetekben célszerűbb lehet a szálakat még alacsony memóriaigényű helyzetekben is gyorsabban injektálni. A kapcsoló kikapcsolásával letilthatja a memóriahasználat heurisztikus beállításait. | .NET 7 |
A konfigurációs beállítások érvénybe lépése
- A szálszám
MinThreads
elérése után legfeljebbThreadsToAddWithoutDelay
további szálak hozhatók létre késedelem nélkül. - Ezután minden további szál létrehozása előtt a rendszer késleltetést indukál, kezdve a következővel
DelayStepMs
: . - A késéssel hozzáadott szálak
ThreadsPerDelayStep
esetében a rendszer továbbiDelayStepMs
elemet ad hozzá a késéshez. - A késés nem haladhatja meg a következőt
MaxDelayMs
: . - A késések csak a szálak létrehozása előtt következnek be. Ha a szálak már elérhetők, akkor a munkaelemek blokkolásának kompenzálása érdekében a rendszer haladéktalanul kiadja őket.
- A fizikai memóriahasználatot és a korlátokat is használják, és a küszöbértéken túl a rendszer lassabb menetinjektálásra vált.
Példák
runtimeconfig.json fájl:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
}
}
}
runtimeconfig.template.json fájl:
{
"configProperties": {
"System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
}
}
AutoreleasePool
felügyelt szálak esetén
Ez a beállítás konfigurálja, hogy minden felügyelt szál kap-e implicit NSAutoreleasePool-t , amikor támogatott macOS-platformon fut.
A beállítás neve | Értékek | Bevezetett verzió | |
---|---|---|---|
runtimeconfig.json | System.Threading.Thread.EnableAutoreleasePool |
true vagy false |
.NET 6 |
MSBuild tulajdonság | AutoreleasePoolSupport |
true vagy false |
.NET 6 |
Környezeti változó | N.A. | N/A | N.A. |
Példák
runtimeconfig.json fájl:
{
"runtimeOptions": {
"configProperties": {
"System.Threading.Thread.EnableAutoreleasePool": true
}
}
}
runtimeconfig.template.json fájl:
{
"configProperties": {
"System.Threading.Thread.EnableAutoreleasePool": true
}
}
Projektfájl:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<AutoreleasePoolSupport>true</AutoreleasePoolSupport>
</PropertyGroup>
</Project>