Partager via


Paramètres du processeur d’un pool d’applications <processeur>

Vue d’ensemble

L’élément <cpu> de l’élément <add> de la collection <applicationPools> configure des valeurs pour les paramètres d’utilisation du processeur et les actions du processeur qui seront utilisées dans les pools d’applications.

Prise en charge de NUMA

L’accès à la mémoire non uniforme (NUMA) est une méthode matérielle d’association de processeurs à leur propre mémoire dédiée. NUMA est utilisé pour augmenter la vitesse du processeur comme alternative au modèle de multiprocesseur symétrique traditionnel (SMP) pour la prise en charge du multiprocesseur. Vous pouvez configurer IIS 8 et ses versions ultérieures pour distribuer et créer une affinité avec ses processus sur NUMA. L’utilisation de NUMA est configurée dans l’élément processeur par l’attribut numaNodeAssignment qui permet à IIS d’identifier le nœud NUMA le plus optimal lorsque le processus de travail IIS est sur le point de démarrer et l’attribut numaNodeAffinityMode qui détermine comment les affinités sont créées entre les threads d’un processus de travail IIS sont et un nœud NUMA. NUMA est également configuré à l’aide de l’attribut MaxProcesses de l’élément processModel, qui, lorsqu’il est défini pour 0 spécifier que IIS exécute automatiquement le même nombre de processus de travail qu’il existe des nœuds NUMA. Pour plus d’informations, consultez Mise à l’échelle multicœur IIS 8.0 sur le matériel NUMA

La logique de sélection NUMA et le type d’affinité peuvent être définis dans la boîte de dialogue Paramètres avancés uniquement si IIS s’exécute sur du matériel NUMA.

Compatibilité

Version Notes
IIS 10.0 L’élément <cpu> n’a fait l’objet d’aucune modification dans IIS 10.0.
IIS 8.5 L’élément <cpu> n’a fait l’objet d’aucune modification dans IIS 8.5.
IIS 8.0 Deux valeurs d’énumération ont été ajoutées à l’ action attribut pour définir le comportement de limitation. L’attribut processorGroup a été ajouté pour définir le nombre de groupes de processeurs utilisés. Les attributs numaNodeAssignment et numaNodeAffinityMode ont été ajoutés pour spécifier le comportement des nœuds NUMA.
IIS 7.5 L’élément <cpu> n’a fait l’objet d’aucune modification dans IIS 7.5.
IIS 7.0 L’élément <cpu> a été introduit dans IIS 7.0.
IIS 6.0 L’élément <cpu> remplace les parties de la propriété métabase IIS 6.0 IIsApplicationPools.

Programme d’installation

La <applicationPools> collection est incluse dans l’installation par défaut d’IIS 7 et ses versions ultérieures.

Procédure

Comment modifier les paramètres de configuration du processeur

  1. Ouvrez le Gestionnaire des services Internet (IIS) :

    • Si vous utilisez Windows Server 2012 ou Windows Server 2012 R2 :

      • Dans la barre des tâches, cliquez sur Gestionnaire de serveur, cliquez sur Outils puis sur Gestionnaire Internet Information Services (IIS).
    • Si vous utilisez Windows 8 ou Windows 8.1 :

      • Maintenez la touche Windows enfoncée, appuyez sur la lettre X, puis cliquez sur Panneau de configuration.
      • Cliquez sur Outils d'administration, puis double-cliquez sur Gestionnaire des services Internet (IIS).
    • Si vous utilisez Windows Server 2008 ou Windows Server 2008 R2 :

      • Cliquez sur Démarrer, placez le curseur sur Outils d'administration, puis cliquez sur Gestionnaire Internet Information Services (IIS).
    • Si vous utilisez Windows Vista ou Windows 7 :

      • Dans la barre des tâches, cliquez sur Démarrer, puis sur Panneau de configuration.
      • Double-cliquez sur Outils d'administration, puis double-cliquez sur Gestionnaire des services Internet (IIS).
  2. Dans le volet Connexions, développez le nom du serveur, cliquez sur Pools d’applications puis cliquez sur le pool d’applications que vous souhaitez modifier.
    Screenshot of the Application Pools screen that populates from the Connections pane.

  3. Dans le volet Actions, cliquez sur Paramètres avancés...

  4. Dans la boîte de dialogue Paramètres avancés, cliquez sur la propriété du processeur que vous souhaitez modifier puis modifiez la valeur dans la section valeur de propriété de la boîte de dialogue, puis cliquez sur OK. Par exemple, vous pouvez remplacer l’action Limite par NoAction, KillW3wp, Throttleou ThrottleUnderLoad.
    Screenshot of the Advanced Settings dialog box's Throttle Under Load section.

Guide pratique pour configurer IIS à utiliser avec du matériel NUMA (Non Uniform Memory Access)

  1. Dans la barre des tâches, cliquez sur Gestionnaire de serveur, cliquez sur Outils, puis sur Gestionnaire Internet Information Services (IIS).

  2. Dans le volet Connexions, développez le nom du serveur, puis cliquez sur Pools d'applications.

  3. Dans le volet Pools d’applications, sélectionnez le pool que vous souhaitez configurer pour NUMA.

  4. Dans le volet Actions, sélectionnez Paramètres avancés.

  5. Sous Modèle de processus, définissez le nombre maximal de processus de travail sur 0.

    Screenshot of the Process Model section with the Maximum Worker Processes field set to 0.

  6. Sous Processeur, définissez processorGroup, numaNodeAffinityModeet numaNodeAssignment.

  7. Cliquez sur OK.

Configuration

Attributs

Attribut Description
action Attribut d’énumération facultatif. Configure l’action effectuée par IIS lorsqu’un processus de travail dépasse sa limite d’UC configurée. L’attribut d’action est configuré par pool d’applications.

L’attribut d’action peut être l’une des valeurs possibles suivantes. La valeur par défaut est NoAction.

Valeur Description
NoAction Aucune action n’est effectuée lorsque la limite du processeur est dépassée. Un avertissement est écrit dans le journal des événements.

La valeur numérique est 0.

KillW3wp Les processus de travail du pool d’applications qui dépassent leur limite d’UC sont forcés d’arrêter.

La valeur numérique est 1.

Throttle La consommation du processeur est limitée à la valeur définie dans Limite. L’intervalle Limite n’est pas utilisé et une entrée de journal des événements est générée.

La valeur numérique est 2.

ThrottleUnderLoad La consommation du processeur est limitée uniquement lorsqu’il y a une contention sur l’UC. L’intervalle Limite n’est pas utilisé et une entrée de journal des événements est générée.

La valeur numérique est 3.

limit Attribut uint facultatif. Configure le pourcentage maximal de temps processeur (en 1/1000ths d’un pourcentage) que les processus de travail dans un pool d’applications sont autorisés à consommer sur une période donnée, comme indiqué par l’attribut resetInterval. Si la limite définie par l’attribut limite est dépassée, un événement est écrit dans le journal des événements et un ensemble facultatif d’événements peut être déclenché. Ces événements facultatifs sont déterminés par l’attribut d’action.

Remarque :  dans IIS 8.5 et ses versions ultérieures, définissez la limite en pourcentage dans le volet Processeur du Gestionnaire d’IIS. Dans IIS 8.0, définissez la limite en 1/1000èmes d’un pourcentage dans le volet Processeur du Gestionnaire d’IIS. Dans les deux cas, l’attribut limit dans applicationHost.config est en 1/1000ths d’un pourcentage.

La valeur par défaut est 0, ce qui désactive la limitation du processeur.
numaNodeAffinityMode Attribut d’énumération facultatif. Spécifie comment les threads d’un processus qui crée une affinité avec un nœud NUMA sont planifiés sur les cœurs du nœud.

L’attribut numaNodeAffinityMode peut être l’une des valeurs possibles suivantes. La valeur par défaut est Soft.

Valeur Description
Soft Tant que les cœurs d’un nœud NUMA auxquels un processus créé des affinités sont disponibles, tous les threads du processus seront planifiés sur ces cœurs. Toutefois, si le planificateur ne peut pas planifier le processus sur les cœurs du nœud auquel il est affinité, il peut planifier le processus sur les cœurs d’un autre nœud NUMA.

La valeur numérique est 0.

Hard Tout thread d’un processus qui créé des affinités avec un nœud NUMA sera planifié sur les cœurs du nœud et uniquement sur ces cœurs. Aucun thread de ce processus n’est planifié sur les cœurs d’un autre nœud NUMA.

La valeur numérique est 1.

numaNodeAssignment Attribut d’énumération facultatif. Spécifie comment IIS détermine le nœud NUMA (accès à la mémoire non uniforme) auquel créer une affinité avec un processus. Un nœud NUMA contient des clusters de cœurs qui partagent une seule banque de mémoire. Cet attribut est disponible dans les paramètres avancés du processeur uniquement si les nœuds NUMA sont disponibles.

L’attribut numaNodeAssignment peut être l’une des valeurs possibles suivantes. La valeur par défaut est Most Available Memory.

Valeur Description
Most Available Memory Le processus sera affecté au nœud NUMA qui dispose de la mémoire la plus libre.

La valeur numérique est 0.

Windows Scheduling La planification Windows détermine le nœud NUMA auquel le processus est affecté.

La valeur numérique est 1.

processorGroup Attribut int facultatif. Nombre de groupes de processeurs utilisés (de base zéro). Un groupe de processeurs contient plusieurs cœurs. L’attribut Groupe de processeurs est disponible dans les paramètres avancés du processeur uniquement si le serveur a plusieurs groupes de processeurs.

La valeur par défaut est 0, ce qui signifie qu’un seul groupe de processeurs est utilisé.
resetInterval Attribut timeSpan facultatif. Spécifie la période de réinitialisation (en minutes) pour la surveillance et la limitation du processeur sur un pool d’applications. Lorsque le nombre de minutes écoulées depuis la dernière réinitialisation comptable du processus est égal au nombre spécifié par cette propriété, IIS réinitialise les minuteurs du processeur pour les intervalles de journalisation et de limite.

Important : La valeur resetInterval doit être supérieure à la durée entre les opérations de journalisation, sinon IIS réinitialise les compteurs avant la journalisation et la comptabilité des processus ne se produit pas.

Remarque :  Étant donné que la comptabilité des processus dans IIS utilise des objets de travail Windows pour surveiller les temps processeur pour l’ensemble du processus, la comptabilité des processus journalisera et limitera uniquement les applications isolées dans un processus distinct d’IIS.

La valeur par défaut est 00:05:00.
smpAffinitized Attribut booléen facultatif. Spécifie si un processus de travail particulier affecté à un pool d’applications doit également être affecté à un processeur donné. Cette propriété est utilisée avec les attributs smpProcessorAffinityMask et smpProcessorAffinityMask2.

La valeur par défaut est false.
smpProcessorAffinityMask Attribut uint facultatif. Spécifie le masque de processeur hexadécimal pour les ordinateurs multiprocesseurs, qui indique à quel processeur les processus de travail dans un pool d’applications doivent être liés. Avant que cette propriété ne prenne effet, l’attribut smpAffinitized doit être défini sur true pour le pool d’applications.

Remarque :  Sur les ordinateurs 64 bits, l’attribut smpProcessorAffinityMask contient le DWORD de faible ordre pour le masque de processeur, et l’attributsmpProcessorAffinityMask2 contient le DWORD de haut ordre pour le masque de processeur. Sur les ordinateurs 32 bits, l’attribut smpProcessorAffinityMask2 n’a aucun effet.

Si vous définissez la valeur sur 1 (qui correspond à 00000000000000001 en binaire), les processus de travail d’un pool d’applications s’exécutent uniquement sur le premier processeur. Si vous définissez la valeur sur 2 (ce qui correspond à 0000000000000010 en binaire), les processus de travail s’exécutent uniquement sur le deuxième processeur. Si vous définissez la valeur sur 3 (ce qui correspond à 0000000000000011 en binaire), les processus de travail s’exécutent à la fois sur les premier et deuxième processeurs.

Remarque :  ne définissez pas cette propriété sur 0. Cela désactive l’affinité symétrie multiprocesseur (SMP) et crée une condition d’erreur. Cela signifie que les processus s’exécutant sur un processeur ne restent pas affiliés à ce processeur tout au long de leur durée de vie.

La valeur par défaut est 4294967295.
smpProcessorAffinityMask2 Attribut uint facultatif. Spécifie le masque de processeur hexadécimal DWORD de haut ordre pour les ordinateurs multiprocesseurs 64 bits, ce qui indique le processeur auquel le processus de travail traite dans un pool d’applications. Avant que cette propriété ne prenne effet, l’attribut smpAffinitized doit être défini sur true pour le pool d’applications.

Remarque :  Sur les ordinateurs 64 bits, l’attribut smpProcessorAffinityMask contient le DWORD de faible ordre pour le masque de processeur, et l’attributsmpProcessorAffinityMask2 contient le DWORD de haut ordre pour le masque de processeur. Sur les ordinateurs 32 bits, l’attribut smpProcessorAffinityMask2 n’a aucun effet.

La valeur par défaut est 4294967295.

Éléments enfants

Aucune.

Exemple Configuration

L’exemple de configuration suivant configure un pool d’applications unique nommé DefaultAppPool et définit l’UC sur 50 %, avec une action pour tuer le processus de travail avec un intervalle de réinitialisation de 10 minutes.

<applicationPools>
   <add name="DefaultAppPool">
     <cpu limit="50000" action="KillW3wp" resetInterval="00:10:00" />
   </add>
   <applicationPoolDefaults>
     <processModel identityType="NetworkService" />
   </applicationPoolDefaults>
</applicationPools>

Exemple de code

Les exemples de code suivants configurent le pool d’applications par défaut pour tuer le processus de travail lorsqu’il dépasse la limite du processeur et configurez l’intervalle de réinitialisation sur 4 minutes.

AppCmd.exe

appcmd.exe set config -section:system.applicationHost/applicationPools /[name='DefaultAppPool'].cpu.action:"KillW3wp" /commit:apphost

appcmd.exe set config -section:system.applicationHost/applicationPools /[name='DefaultAppPool'].cpu.resetInterval:"00:04:00" /commit:apphost

Remarque

Vous devez veiller à définir le paramètre commit sur apphost quand vous utilisez AppCmd.exe pour configurer ces paramètres. Cela valide les paramètres de configuration dans la section d’emplacement appropriée dans le fichier ApplicationHost.config.

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample
{
   private static void Main()
   {
      using (ServerManager serverManager = new ServerManager())
      {
         Configuration config = serverManager.GetApplicationHostConfiguration();
         ConfigurationSection applicationPoolsSection = config.GetSection("system.applicationHost/applicationPools");
         ConfigurationElementCollection applicationPoolsCollection = applicationPoolsSection.GetCollection();
         ConfigurationElement addElement = FindElement(applicationPoolsCollection, "add", "name", @"DefaultAppPool");

         if (addElement == null) throw new InvalidOperationException("Element not found!");

         ConfigurationElement cpuElement = addElement.GetChildElement("cpu");
         cpuElement["action"] = @"KillW3wp";
         cpuElement["resetInterval"] = TimeSpan.Parse("00:04:00");

         serverManager.CommitChanges();
      }
   }

   private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
   {
      foreach (ConfigurationElement element in collection)
      {
         if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
         {
            bool matches = true;
            for (int i = 0; i < keyValues.Length; i += 2)
            {
               object o = element.GetAttributeValue(keyValues[i]);
               string value = null;
               if (o != null)
               {
                  value = o.ToString();
               }
               if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
               {
                  matches = false;
                  break;
               }
            }
            if (matches)
            {
               return element;
            }
         }
      }
      return null;
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration

Module Sample
   Sub Main()
      Dim serverManager As ServerManager = New ServerManager
      Dim config As Configuration = serverManager.GetApplicationHostConfiguration
      Dim applicationPoolsSection As ConfigurationSection = config.GetSection("system.applicationHost/applicationPools")
      Dim applicationPoolsCollection As ConfigurationElementCollection = applicationPoolsSection.GetCollection
      Dim addElement As ConfigurationElement = FindElement(applicationPoolsCollection, "add", "name", "DefaultAppPool")

      If (addElement Is Nothing) Then
         Throw New InvalidOperationException("Element not found!")
      End If

      Dim cpuElement As ConfigurationElement = addElement.GetChildElement("cpu")
      cpuElement("action") = "KillW3wp"
      cpuElement("resetInterval") = TimeSpan.Parse("00:04:00")

      serverManager.CommitChanges()
   End Sub

   Private Function FindElement(ByVal collection As ConfigurationElementCollection, ByVal elementTagName As String, ByVal ParamArray keyValues() As String) As ConfigurationElement
      For Each element As ConfigurationElement In collection
         If String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase) Then
            Dim matches As Boolean = True
            Dim i As Integer
            For i = 0 To keyValues.Length - 1 Step 2
               Dim o As Object = element.GetAttributeValue(keyValues(i))
               Dim value As String = Nothing
               If (Not (o) Is Nothing) Then
                  value = o.ToString
               End If
               If Not String.Equals(value, keyValues((i + 1)), StringComparison.OrdinalIgnoreCase) Then
                  matches = False
                  Exit For
               End If
            Next
            If matches Then
               Return element
            End If
         End If
      Next
      Return Nothing
   End Function


End Module

JavaScript

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";
var applicationPoolsSection = adminManager.GetAdminSection("system.applicationHost/applicationPools", "MACHINE/WEBROOT/APPHOST");
var applicationPoolsCollection = applicationPoolsSection.Collection;
var addElementPos = FindElement(applicationPoolsCollection, "add", ["name", "DefaultAppPool"]);

if (addElementPos == -1) throw "Element not found!";

var addElement = applicationPoolsCollection.Item(addElementPos);
var cpuElement = addElement.ChildElements.Item("cpu");
cpuElement.Properties.Item("action").Value = "KillW3wp";
cpuElement.Properties.Item("resetInterval").Value = "00:04:00";

adminManager.CommitChanges();

function FindElement(collection, elementTagName, valuesToMatch) {
   for (var i = 0; i < collection.Count; i++) {
      var element = collection.Item(i);
      if (element.Name == elementTagName) {
         var matches = true;
         for (var iVal = 0; iVal < valuesToMatch.length; iVal += 2) {
            var property = element.GetPropertyByName(valuesToMatch[iVal]);
            var value = property.Value;
            if (value != null) {
               value = value.toString();
            }
            if (value != valuesToMatch[iVal + 1]) {
               matches = false;
               break;
            }
         }
         if (matches) {
            return i;
         }
      }
   }
   return -1;
}

VBScript

Set adminManager = WScript.CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"
Set applicationPoolsSection = adminManager.GetAdminSection("system.applicationHost/applicationPools", "MACHINE/WEBROOT/APPHOST")
Set applicationPoolsCollection = applicationPoolsSection.Collection
addElementPos = FindElement(applicationPoolsCollection, "add", Array("name", "DefaultAppPool"))

If (siteElementPos = -1) Then
   WScript.Echo "Element not found!"
   WScript.Quit
End If

Set addElement = applicationPoolsCollection.Item(addElementPos)
Set cpuElement = addElement.ChildElements.Item("cpu")
cpuElement.Properties.Item("action").Value = "KillW3wp"
cpuElement.Properties.Item("resetInterval").Value = "00:04:00"

adminManager.CommitChanges()

Function FindElement(collection, elementTagName, valuesToMatch)
   For i = 0 To CInt(collection.Count) - 1
      Set element = collection.Item(i)
      If element.Name = elementTagName Then
         matches = True
         For iVal = 0 To UBound(valuesToMatch) Step 2
            Set property = element.GetPropertyByName(valuesToMatch(iVal))
            value = property.Value
            If Not IsNull(value) Then
               value = CStr(value)
            End If
            If Not value = CStr(valuesToMatch(iVal + 1)) Then
               matches = False
               Exit For
            End If
         Next
         If matches Then
            Exit For
         End If
      End If
   Next
   If matches Then
      FindElement = i
   Else
      FindElement = -1
   End If
End Function