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
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).
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.
Dans le volet Actions, cliquez sur Paramètres avancés...
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.
Guide pratique pour configurer IIS à utiliser avec du matériel NUMA (Non Uniform Memory Access)
Dans la barre des tâches, cliquez sur Gestionnaire de serveur, cliquez sur Outils, puis sur Gestionnaire Internet Information Services (IIS).
Dans le volet Connexions, développez le nom du serveur, puis cliquez sur Pools d'applications.
Dans le volet Pools d’applications, sélectionnez le pool que vous souhaitez configurer pour NUMA.
Dans le volet Actions, sélectionnez Paramètres avancés.
Sous Modèle de processus, définissez le nombre maximal de processus de travail sur
0
.Sous Processeur, définissez processorGroup, numaNodeAffinityModeet numaNodeAssignment.
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 .
|
||||||||||
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 .
|
||||||||||
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 .
|
||||||||||
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