Partager via


Options de configuration du runtime pour le threading

Cet article détaille les paramètres que vous pouvez utiliser pour configurer le threading dans .NET.

Utiliser tous les groupes d’UC sur Windows

  • Sur les machines qui ont plusieurs groupes d’UC, ce paramètre configure si les composants tels que le pool de threads utilisent tous les groupes d’UC ou uniquement le groupe d’UC principal du processus. Le paramètre affecte également les Environment.ProcessorCount retours.
  • Lorsque ce paramètre est activé, tous les groupes d’UC sont utilisés et les threads sont également distribués automatiquement entre les groupes d’UC par défaut.
  • Ce paramètre est activé par défaut sur Windows 11 et versions ultérieures, et désactivé par défaut sur Windows 10 et versions antérieures. Pour que ce paramètre prenne effet lorsqu’il est activé, le gc doit également être configuré pour utiliser tous les groupes d’UC ; pour plus d’informations, consultez groupes d’UC GC.
Nom du paramètre Valeurs
runtimeconfig.json N/A N/A
Variable d'environnement DOTNET_Thread_UseAllCpuGroups 0 - désactivé
1 – activé

Affecter des threads à des groupes d’UC sur Windows

  • Sur les machines qui ont plusieurs groupes d’UC et tous les groupes d’UC sont utilisés, ce paramètre configure si les threads sont automatiquement distribués entre les groupes d’UC.
  • Lorsque ce paramètre est activé, de nouveaux threads sont affectés à un groupe d’UC d’une manière qui tente de remplir entièrement un groupe d’UC déjà utilisé avant d’utiliser un nouveau groupe d’UC.
  • Ce paramètre est activé par défaut.
Nom du paramètre Valeurs
runtimeconfig.json N/A N/A
Variable d'environnement DOTNET_Thread_AssignCpuGroups 0 - désactivé
1 – activé

Threads minimum

  • Spécifie le nombre minimal de threads pour le pool de threads de travail.
  • Correspond à la ThreadPool.SetMinThreads méthode.
Nom du paramètre Valeurs
runtimeconfig.json System.Threading.ThreadPool.MinThreads Entier qui représente le nombre minimal de threads
Propriété MSBuild ThreadPoolMinThreads Entier qui représente le nombre minimal de threads
Variable d'environnement N/A N/A

Examples

Fichier runtimeconfig.json :

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.ThreadPool.MinThreads": 4
      }
   }
}

Fichier runtimeconfig.template.json :

{
   "configProperties": {
      "System.Threading.ThreadPool.MinThreads": 4
   }
}

Fichier projet :

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <ThreadPoolMinThreads>4</ThreadPoolMinThreads>
  </PropertyGroup>

</Project>

Nombre maximal de threads

  • Spécifie le nombre maximal de threads pour le pool de threads de travail.
  • Correspond à la ThreadPool.SetMaxThreads méthode.
Nom du paramètre Valeurs
runtimeconfig.json System.Threading.ThreadPool.MaxThreads Entier qui représente le nombre maximal de threads
Propriété MSBuild ThreadPoolMaxThreads Entier qui représente le nombre maximal de threads
Variable d'environnement N/A N/A

Examples

Fichier runtimeconfig.json :

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.ThreadPool.MaxThreads": 20
      }
   }
}

Fichier runtimeconfig.template.json :

{
   "configProperties": {
      "System.Threading.ThreadPool.MaxThreads": 20
   }
}

Fichier projet :

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <ThreadPoolMaxThreads>20</ThreadPoolMaxThreads>
  </PropertyGroup>

</Project>

Pool de threads Windows

  • Pour les projets sur Windows, configure si la gestion des threads de pool de threads est déléguée au pool de threads Windows.
  • Si vous omettez ce paramètre ou si la plateforme n’est pas Windows, le pool de threads .NET est utilisé à la place.
  • Seules les applications publiées avec AOT natif sur Windows utilisent le pool de threads Windows par défaut, pour laquelle vous pouvez choisir d’utiliser le pool de threads .NET à la place en désactivant le paramètre de configuration.
  • Le pool de threads Windows peut s’améliorer dans certains cas, par exemple dans les cas où le nombre minimal de threads est configuré sur une valeur élevée ou lorsque le pool de threads Windows est déjà utilisé par l’application. Il peut également arriver que le pool de threads .NET fonctionne mieux, par exemple dans la gestion intensive des E/S sur des machines plus volumineuses. Il est conseillé de vérifier les métriques de performances lors de la modification de ce paramètre de configuration.
  • Certaines API ne sont pas prises en charge lors de l’utilisation du pool de threads Windows, telles que ThreadPool.SetMinThreads, ThreadPool.SetMaxThreadset ThreadPool.BindHandle(SafeHandle). Les paramètres de configuration du pool de threads pour les threads minimum et maximal ne sont pas efficaces. Une alternative à ThreadPool.BindHandle(SafeHandle) est la ThreadPoolBoundHandle classe.
Nom du paramètre Valeurs Version introduite
runtimeconfig.json System.Threading.ThreadPool.UseWindowsThreadPool true – activé
false - désactivé
.NET 8
Propriété MSBuild UseWindowsThreadPool true – activé
false - désactivé
.NET 8
Variable d'environnement DOTNET_ThreadPool_UseWindowsThreadPool 1 – activé
0 - désactivé
.NET 8

Examples

Fichier runtimeconfig.json :

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.ThreadPool.UseWindowsThreadPool": true
      }
   }
}

Fichier runtimeconfig.template.json :

{
   "configProperties": {
      "System.Threading.ThreadPool.UseWindowsThreadPool": true
   }
}

Fichier projet :

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <UseWindowsThreadPool>true</UseWindowsThreadPool>
  </PropertyGroup>

</Project>

Injection de thread en réponse au blocage des éléments de travail

Dans certains cas, le pool de threads détecte les éléments de travail qui bloquent ses threads. Pour compenser, il injecte plus de threads. Dans .NET 6+, vous pouvez utiliser les paramètres de configuration d’exécution suivants pour configurer l’injection de threads en réponse au blocage des éléments de travail. Actuellement, ces paramètres prennent effet uniquement pour les éléments de travail qui attendent la fin d’une autre tâche, par exemple dans les cas de synchronisation standard sur async .

nom du paramètreruntimeconfig.json Descriptif Version introduite
System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor Une fois le nombre de threads atteint MinThreads , cette valeur (après qu’elle est multipliée par le nombre de processeurs) spécifie le nombre de threads supplémentaires pouvant être créés sans délai. .NET 6
System.Threading.ThreadPool.Blocking.ThreadsPerDelayStep_ProcCountFactor Une fois le nombre de threads atteint ThreadsToAddWithoutDelay , cette valeur (après qu’elle est multipliée par le nombre de processeurs) spécifie après le nombre de threads ajoutés DelayStepMs au délai avant la création de chaque nouveau thread. .NET 6
System.Threading.ThreadPool.Blocking.DelayStepMs Une fois le nombre de threads atteint ThreadsToAddWithoutDelay , cette valeur spécifie le délai supplémentaire d’ajout par ThreadsPerDelayStep thread, qui sera appliqué avant la création de chaque nouveau thread. .NET 6
System.Threading.ThreadPool.Blocking.MaxDelayMs Une fois le nombre de threads atteint ThreadsToAddWithoutDelay , cette valeur spécifie le délai maximal à utiliser avant la création de chaque nouveau thread. .NET 6
System.Threading.ThreadPool.Blocking.IgnoreMemoryUsage Par défaut, le taux d’injection de threads en réponse au blocage est limité par les heuristiques qui déterminent s’il existe suffisamment de mémoire physique disponible. Dans certaines situations, il peut être préférable d’injecter des threads plus rapidement même dans des situations de mémoire faible. Vous pouvez désactiver les heuristiques d’utilisation de la mémoire en désactivant ce commutateur. .NET 7

Prise en compte des paramètres de configuration

  • Une fois le nombre de threads atteint MinThreads , jusqu’à ThreadsToAddWithoutDelay des threads supplémentaires peuvent être créés sans délai.
  • Après cela, avant la création de chaque thread supplémentaire, un délai est induit, en commençant par DelayStepMs.
  • Pour tous les ThreadsPerDelayStep threads ajoutés avec un délai, un autre DelayStepMs est ajouté au délai.
  • Le délai peut ne pas dépasser MaxDelayMs.
  • Les retards ne sont induits qu’avant la création de threads. Si des threads sont déjà disponibles, ils sont libérés sans délai pour compenser le blocage des éléments de travail.
  • L’utilisation et les limites de la mémoire physique sont également utilisées et, au-delà d’un seuil, le système bascule vers une injection de thread plus lente.

Examples

Fichier runtimeconfig.json :

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
      }
   }
}

Fichier runtimeconfig.template.json :

{
   "configProperties": {
      "System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
   }
}

AutoreleasePool pour les threads managés

Cette option configure si chaque thread managé reçoit un NSAutoreleasePool implicite lors de l’exécution sur une plateforme macOS prise en charge.

Nom du paramètre Valeurs Version introduite
runtimeconfig.json System.Threading.Thread.EnableAutoreleasePool true ou false .NET 6
Propriété MSBuild AutoreleasePoolSupport true ou false .NET 6
Variable d'environnement N/A N/A N/A

Examples

Fichier runtimeconfig.json :

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.Thread.EnableAutoreleasePool": true
      }
   }
}

Fichier runtimeconfig.template.json :

{
   "configProperties": {
      "System.Threading.Thread.EnableAutoreleasePool": true
   }
}

Fichier projet :

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <AutoreleasePoolSupport>true</AutoreleasePoolSupport>
  </PropertyGroup>

</Project>