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, unDelayStepMs
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>