Condividi tramite


Impostazioni CPU per una CPU del pool <di applicazioni>

Panoramica

L'elemento <cpu> dell'elemento <add> nella <applicationPools> raccolta configura i valori per i parametri di utilizzo della CPU e le azioni della CPU che verranno usate nei pool di applicazioni.

Supporto NUMA

NUMA (Non-Uniform Memory Access) è un metodo basato su hardware per associare i processori alla propria memoria dedicata. NUMA viene usato per aumentare la velocità del processore come alternativa al modello multiprocessore simmetrico (SMP) tradizionale per il supporto multiprocessore. È possibile configurare IIS 8 e versioni successive per distribuire e affinizzare i processi in NUMA. L'uso di NUMA viene configurato nell'elemento CPU dall'attributo numaNodeAssignment che consente a IIS di identificare il nodo NUMA più ottimale quando il processo di lavoro IIS sta per essere avviato e l'attributo numaNodeAffinityMode che determina come i thread di un processo di lavoro IIS vengono affinizzati a un nodo NUMA. NUMA viene configurato anche usando l'attributo MaxProcesses dell'elemento processModel, che quando impostato su 0 specifica che IIS esegue automaticamente lo stesso numero di processi di lavoro in cui sono presenti nodi NUMA. Per altre informazioni, vedere Ridimensionamento multicore di IIS 8.0 su hardware NUMA.

La logica di selezione e il tipo di affinità NUMA possono essere impostati nella finestra di dialogo Impostazioni avanzate solo se IIS è in esecuzione su hardware NUMA.

Compatibilità

Versione Note
IIS 10.0 L'elemento <cpu> non è stato modificato in IIS 10.0.
IIS 8,5 L'elemento <cpu> non è stato modificato in IIS 8.5.
IIS 8,0 Due valori di enumerazione sono stati aggiunti all'attributo per definire il action comportamento di limitazione. L'attributo processorGroup è stato aggiunto per definire il numero di gruppi di processori usati. Gli numaNodeAssignment attributi e numaNodeAffinityMode sono stati aggiunti per specificare il comportamento dei nodi NUMA.
IIS 7,5 L'elemento <cpu> non è stato modificato in IIS 7.5.
IIS 7.0 L'elemento <cpu> è stato introdotto in IIS 7.0.
IIS 6.0 L'elemento <cpu> sostituisce parti della proprietà metabase IIS 6.0 IIsApplicationPools .

Installazione

La <applicationPools> raccolta è inclusa nell'installazione predefinita di IIS 7 e versioni successive.

Procedure

Come modificare le impostazioni di configurazione della CPU

  1. Aprire Gestione Internet Information Services (IIS):

    • Se si usa Windows Server 2012 o Windows Server 2012 R2:

      • Sulla barra delle applicazioni fare clic su Server Manager, scegliere Strumenti, quindi fare clic su Gestione Internet Information Services (IIS).
    • Se si usa Windows 8 o Windows 8.1:

      • Tenere premuto il tasto Windows, premere la lettera X e quindi fare clic su Pannello di controllo.
      • Fare clic su Strumenti di amministrazione, quindi fare doppio clic su Gestione Internet Information Services (IIS).
    • Se si usa Windows Server 2008 o Windows Server 2008 R2:

      • Sulla barra delle applicazioni fare clic su Start, scegliere Strumenti di amministrazione, quindi fare clic su Gestione Internet Information Services (IIS).
    • Se si usa Windows Vista o Windows 7:

      • Sulla barra delle applicazioni fare clic su Start e quindi su Pannello di controllo.
      • Fare doppio clic su Strumenti di amministrazione, quindi fare doppio clic su Gestione Internet Information Services (IIS).
  2. Nel riquadro Connessioni espandere il nome del server, fare clic su Pool di applicazioni e quindi sul pool di applicazioni che si desidera modificare.
    Screenshot della schermata Pool di applicazioni che viene popolata dal riquadro Connessioni.

  3. Nel riquadro Azioni fare clic su Impostazioni avanzate...

  4. Nella finestra di dialogo Impostazioni avanzate fare clic sulla proprietà CPU che si desidera modificare, quindi modificare il valore nella sezione del valore della proprietà della finestra di dialogo e quindi fare clic su OK. Ad esempio, puoi modificare l'azione Limite su NoAction, KillW3wp, Throttle o ThrottleUnderLoad.
    Screenshot della sezione Limitazione in caricamento della finestra di dialogo Impostazioni avanzate.

Come configurare IIS per l'uso con hardware NUMA (Non-Uniform Memory Access)

  1. Sulla barra delle applicazioni fare clic su Server Manager, scegliere Strumenti, quindi fare clic su Gestione Internet Information Services (IIS).

  2. Nel riquadro Connessioni espandere il nome del server e quindi fare clic su Pool di applicazioni.

  3. Nel riquadro Pool di applicazioni selezionare il pool da configurare per NUMA.

  4. Nel riquadro Azioni selezionare Impostazioni avanzate.

  5. In Modello di processo impostare Numero massimo processi di lavoro su 0.

    Screenshot della sezione Process Model con il campo Maximum Worker Processes impostato su 0.

  6. In CPU impostare processorGroup, numaNodeAffinityMode e numaNodeAssignment.

  7. Fare clic su OK.

Configurazione

Attributi

Attributo Descrizione
action Attributo di enumerazione facoltativo. Configura l'azione eseguita da IIS quando un processo di lavoro supera il limite di CPU configurato. L'attributo action viene configurato in base al pool di applicazioni.

L'attributo action può essere uno dei valori possibili seguenti. Il valore predefinito è NoAction.

Valore Descrizione
NoAction Non viene eseguita alcuna azione quando viene superato il limite di CPU. Viene scritto un avviso nel registro eventi.

Il valore numerico è 0.

KillW3wp I processi di lavoro del pool di applicazioni che superano il limite di CPU verranno costretti ad arrestarsi.

Il valore numerico è 1.

Throttle Il consumo della CPU è limitato al valore impostato in Limite. L'intervallo limite non viene utilizzato e viene generata una voce del registro eventi.

Il valore numerico è 2.

ThrottleUnderLoad Il consumo della CPU è limitato solo quando è presente una contesa sulla CPU. L'intervallo limite non viene utilizzato e viene generata una voce del registro eventi.

Il valore numerico è 3.

limit Attributo uint facoltativo. Configura la percentuale massima di tempo di CPU (in 1/1000simi dell'1%) consentita ai processi di lavoro in un pool di applicazioni in un periodo di tempo, come indicato dall'attributo resetInterval. Se viene superato il limite impostato dall'attributo limit, viene scritto un evento nel registro eventi e può essere attivato un set facoltativo di eventi. Questi eventi facoltativi sono determinati dall'attributo action.

Nota: In IIS 8.5 e versioni successive impostare il limite in percentuale nel riquadro CPU di Gestione IIS. In IIS 8.0 impostare il limite in 1/1000simi del 1% nel riquadro CPU di Gestione IIS. Per entrambi i casi, l'attributo limit in applicationHost.config è espresso in 1/1000simi di uno%.

Il valore predefinito è 0, che disabilita la limitazione della CPU.
numaNodeAffinityMode Attributo di enumerazione facoltativo. Specifica il modo in cui i thread di un processo affinizzato a un nodo NUMA verranno pianificati nei core del nodo.

L'attributo numaNodeAffinityMode può essere uno dei valori possibili seguenti. Il valore predefinito è Soft.

Valore Descrizione
Soft Se sono disponibili i core in un nodo NUMA a cui è disponibile un processo di affinità, tutti i thread del processo verranno pianificati su tali core. Tuttavia, se l'utilità di pianificazione non può pianificare il processo sui core del nodo a cui è affinizzato, può pianificare il processo in core in un altro nodo NUMA.

Il valore numerico è 0.

Hard Qualsiasi thread di un processo affinizzato a un nodo NUMA verrà pianificato nei core del nodo e solo nei core del nodo. Nessun thread di tale processo verrà pianificato in core in un altro nodo NUMA.

Il valore numerico è 1.

numaNodeAssignment Attributo di enumerazione facoltativo. Specifica il modo in cui IIS determinerà il nodo NUMA (accesso alla memoria non uniforme) a cui eseguire l'affinità di un processo. Un nodo NUMA contiene cluster di core che condividono una singola banca di memoria. Questo attributo è disponibile nelle impostazioni avanzate della CPU solo se sono disponibili nodi NUMA.

L'attributo numaNodeAssignment può essere uno dei valori possibili seguenti. Il valore predefinito è Most Available Memory.

Valore Descrizione
Most Available Memory Il processo verrà assegnato al nodo NUMA con la maggior quantità di memoria disponibile.

Il valore numerico è 0.

Windows Scheduling La pianificazione di Windows determinerà il nodo NUMA a cui è assegnato il processo.

Il valore numerico è 1.

processorGroup Attributo int facoltativo. Numero di gruppi di processori utilizzati (in base zero). Un gruppo di processori contiene più core. L'attributo Processor Group è disponibile nelle impostazioni avanzate cpu solo se il server dispone di più gruppi di processori.

Il valore predefinito è 0, ovvero viene usato un singolo gruppo di processori.
resetInterval Attributo timeSpan facoltativo. Specifica il periodo di reimpostazione (in minuti) per il monitoraggio della CPU e i limiti di limitazione per un pool di applicazioni. Quando il numero di minuti trascorsi dall'ultima reimpostazione contabile del processo è uguale al numero specificato da questa proprietà, IIS reimposta i timer della CPU sia per la registrazione che per gli intervalli di limite.

Importante: il valore resetInterval deve essere maggiore del tempo tra le operazioni di registrazione. In caso contrario, IIS reimposta i contatori prima che si sia verificata la registrazione e la contabilità del processo non si verificherà.

Nota: Poiché la contabilità dei processi in IIS usa oggetti processo di Windows per monitorare i tempi di CPU per l'intero processo, la contabilità dei processi registra e limita solo le applicazioni isolate in un processo separato da IIS.

Il valore predefinito è 00:05:00.
smpAffinitized Attributo booleano facoltativo. Specifica se un determinato processo di lavoro assegnato a un pool di applicazioni deve essere assegnato anche a una determinata CPU. Questa proprietà viene usata insieme agli attributi smpProcessorAffinityMask e smpProcessorAffinityMask2 .

Il valore predefinito è false.
smpProcessorAffinityMask Attributo uint facoltativo. Specifica la maschera del processore esadecimale per i computer con più processori, che indica a quale CPU deve essere associato il processo di lavoro in un pool di applicazioni. Prima che questa proprietà venga applicata, l'attributo smpAffinitized deve essere impostato su true per il pool di applicazioni.

Nota: Nei computer a 64 bit, l'attributo smpProcessorAffinityMask contiene il DWORD di ordine basso per la maschera del processore e l'attributo smpProcessorAffinityMask2 contiene il DWORD di ordine elevato per la maschera del processore. Nei computer a 32 bit l'attributo smpProcessorAffinityMask2 non ha alcun effetto.

Se si imposta il valore su 1 (che corrisponde a 00000000000000001 in formato binario), i processi di lavoro in un pool di applicazioni vengono eseguiti solo sul primo processore. Se si imposta il valore su 2 (che corrisponde a 0000000000000010 in formato binario), i processi di lavoro vengono eseguiti solo sul secondo processore. Se si imposta il valore su 3 (che corrisponde a 0000000000000011 in formato binario), i processi di lavoro vengono eseguiti sia sul primo che sul secondo processore.

Nota: Non impostare questa proprietà su 0. In questo modo viene disabilitata l'affinità SMP (Symmetric MultiProcessing) e viene creata una condizione di errore. Ciò significa che i processi in esecuzione su una CPU non rimarranno associati a tale CPU per tutta la loro durata.

Il valore predefinito è 4294967295.
smpProcessorAffinityMask2 Attributo uint facoltativo. Specifica la maschera del processore esadecimale DWORD di ordine elevato per i computer multiprocessore a 64 bit, che indica a quale CPU deve essere associato il processo di lavoro in un pool di applicazioni. Prima che questa proprietà venga applicata, l'attributo smpAffinitized deve essere impostato su true per il pool di applicazioni.

Nota: Nei computer a 64 bit, l'attributo smpProcessorAffinityMask contiene il DWORD di ordine basso per la maschera del processore e l'attributo smpProcessorAffinityMask2 contiene il DWORD di ordine elevato per la maschera del processore. Nei computer a 32 bit l'attributo smpProcessorAffinityMask2 non ha alcun effetto.

Il valore predefinito è 4294967295.

Elementi figlio

Nessuno.

Esempio di configurazione

L'esempio di configurazione seguente configura un singolo pool di applicazioni denominato DefaultAppPool e imposta la CPU su 50%, con un'azione per terminare il processo di lavoro con un intervallo di reimpostazione di 10 minuti.

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

Codice di esempio

Gli esempi di codice seguenti configurano il pool di applicazioni predefinito per terminare il processo di lavoro quando supera il limite di CPU e configurare l'intervallo di reimpostazione su quattro minuti.

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

Nota

È necessario assicurarsi di impostare il parametro commit su apphost quando si usa AppCmd.exe per configurare queste impostazioni. In questo modo le impostazioni di configurazione vengono confermate nella sezione relativa al percorso appropriato nel file 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