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 -Tiltva
1 -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 -Tiltva
1 -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élyezve
false -Tiltva
.NET 8
MSBuild tulajdonság UseWindowsThreadPool true -Engedélyezve
false -Tiltva
.NET 8
Környezeti változó DOTNET_ThreadPool_UseWindowsThreadPool 1 -Engedélyezve
0 -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 legfeljebb ThreadsToAddWithoutDelay 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ábbi DelayStepMs 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>