Share 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.

Notes

.NET 6 se normalise sur le préfixe DOTNET_ au lieu de COMPlus_ pour les variables d’environnement qui configurent le comportement au moment de l’exécution de .NET. Toutefois, le préfixe COMPlus_ continuera à fonctionner. Si vous utilisez une version précédente du runtime .NET, vous devez tout de même utiliser le préfixe COMPlus_.

Utiliser tous les groupes de processeurs sur Windows

  • Sur les ordinateurs qui ont plusieurs groupes de processeurs, ce paramètre configure si les composants tels que le pool de threads utilisent tous les groupes de processeurs ou uniquement le groupe de processeurs principal du processus. Le paramètre affecte également ce que Environment.ProcessorCount retourne.
  • Lorsque ce paramètre est activé, tous les groupes de processeurs sont utilisés et les threads sont également distribués automatiquement entre les groupes de processeurs 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 Garbage collector (GC) doit également être configuré pour utiliser tous les groupes de processeurs. Pour plus d’informations, consultez Groupes de processeurs GC.
Nom du paramètre Valeurs
runtimeconfig.json N/A N/A
Variable d'environnement COMPlus_Thread_UseAllCpuGroups ou DOTNET_Thread_UseAllCpuGroups 0 - désactivé
1 – activé

Affecter des threads à des groupes de processeurs sur Windows

  • Si certains ordinateurs ont plusieurs groupes de processeurs et que tous ces groupes de processeurs sont utilisés, ce paramètre configure si les threads sont automatiquement distribués entre les groupes de processeurs.
  • Lorsque ce paramètre est activé, de nouveaux threads sont affectés à un groupe de processeurs de manière à tenter de remplir entièrement un groupe de processeurs déjà utilisé avant d’employer un nouveau groupe de processeurs.
  • Ce paramètre est activé par défaut.
Nom du paramètre Valeurs
runtimeconfig.json N/A N/A
Variable d'environnement COMPlus_Thread_AssignCpuGroups ou DOTNET_Thread_AssignCpuGroups 0 - désactivé
1 - activé

Nombre minimal de threads

  • Spécifie le nombre minimal de threads pour le pool de threads de travail.
  • Correspond à la méthode ThreadPool.SetMinThreads.
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

Exemples

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 méthode ThreadPool.SetMaxThreads.
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

Exemples

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 lesquelles 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 mieux fonctionner 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à hautement 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 recommandé 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.SetMaxThreads et ThreadPool.BindHandle(SafeHandle). Les paramètres de configuration du pool de threads pour les threads minimum et maximum ne sont pas non plus efficaces. Une alternative à ThreadPool.BindHandle(SafeHandle) est la classe ThreadPoolBoundHandle.
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

Exemples

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 threads en réponse à des éléments de travail bloquants

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 du runtime suivants pour configurer l’injection de threads en réponse à des éléments de travail bloquants. Actuellement, ces paramètres prennent effet uniquement pour les éléments de travail qui attendent la fin d’une autre tâche, comme dans les cas standard de sync-over-async.

Nom du paramètre runtimeconfig.json Description Version introduite
System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor Une fois le nombre de threads basé sur MinThreads atteint, cette valeur (après avoir été multipliée par le nombre de processeurs) spécifie le nombre de threads supplémentaires qui peuvent être créés sans retard. .NET 6
System.Threading.ThreadPool.Blocking.ThreadsPerDelayStep_ProcCountFactor Une fois le nombre de threads basé sur ThreadsToAddWithoutDelay atteint, cette valeur (après avoir été multipliée par le nombre de processeurs) spécifie après combien de threads un DelayStepMs supplémentaire peut être ajouté au retard avant la création de chaque nouveau thread. .NET 6
System.Threading.ThreadPool.Blocking.DelayStepMs Une fois le nombre de threads basé sur ThreadsToAddWithoutDelay atteint, cette valeur spécifie le retard supplémentaire à ajouter par groupe de ThreadsPerDelayStep threads, qui serait appliqué avant la création de chaque nouveau thread. .NET 6
System.Threading.ThreadPool.Blocking.MaxDelayMs Une fois le nombre de threads basé sur ThreadsToAddWithoutDelay atteint, cette valeur spécifie le retard 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 des heuristiques qui déterminent s’il y a 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 faible mémoire. Vous pouvez désactiver l’heuristique d’utilisation de la mémoire en fermant ce commutateur. .NET 7

Entrée en vigueur des paramètres de configuration

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

Exemples

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 quand il s’exécute 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 S/O N/A

Exemples

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>