Freigeben über


CPU-Einstellungen für eine Anwendungspool-<cpu>

Übersicht

Das <cpu> Element des <add> Elements in der <applicationPools> Auflistung konfiguriert Werte für CPU-Auslastungsparameter und CPU-Aktionen, die in Anwendungspools verwendet werden.

NUMA-Unterstützung

Nicht einheitlicher Speicherzugriff (NUMA) ist eine hardwarebasierte Methode zum Zuordnen von Prozessoren zu ihrem eigenen dedizierten Speicher. NUMA wird verwendet, um die Prozessorgeschwindigkeit als Alternative zum herkömmlichen symmetrischen Multiprozessormodell (SMP) für die Unterstützung von Multiprozessoren zu erhöhen. Sie können IIS 8 und höher einrichten, um seine Prozesse auf NUMA zu verteilen und zu affinitisieren. Die Verwendung von NUMA wird im CPU-Element durch das numaNodeAssignment-Attribut konfiguriert, mit dem IIS den optimalen NUMA-Knoten identifizieren kann, wenn der IIS-Arbeitsprozess gestartet wird, und das numaNodeAffinityMode-Attribut, das bestimmt, wie die Threads aus einem IIS-Arbeitsprozess zu einem NUMA-Knoten affinitiert sind. NUMA wird auch mithilfe des MaxProcesses-Attributs des processModel-Elements konfiguriert, das bei Einstellung auf 0 festlegt, dass IIS automatisch dieselbe Anzahl von Arbeitsprozessen ausführt wie NUMA-Knoten. Weitere Informationen finden Sie unter IIS 8.0 Multicore-Skalierung auf NUMA-Hardware.

Die NUMA-Auswahllogik und der Affinitätstyp können im Dialogfeld Erweiterte Einstellungen nur festgelegt werden, wenn IIS auf NUMA-Hardware ausgeführt wird.

Kompatibilität

Version Hinweise
IIS 10.0 Das <cpu> Element wurde in IIS 10.0 nicht geändert.
IIS 8.5 Das <cpu> Element wurde in IIS 8.5 nicht geändert.
IIS 8.0 Dem action Attribut wurden zwei Enumerationswerte hinzugefügt, um das Einschränkungsverhalten zu definieren. Das processorGroup Attribut wurde hinzugefügt, um die Anzahl der verwendeten Prozessorgruppen zu definieren. Die Attribute numaNodeAssignment und numaNodeAffinityMode wurden hinzugefügt, um das Verhalten von NUMA-Knoten anzugeben.
IIS 7.5 Das <cpu> Element wurde in IIS 7.5 nicht geändert.
IIS 7.0 Das <cpu> Element wurde in IIS 7.0 eingeführt.
IIS 6.0 Das <cpu> Element ersetzt Teile der IIS 6.0 IIsApplicationPools-Metabasiseigenschaft.

Setup

Die <applicationPools> Auflistung ist in der Standardinstallation von IIS 7 und höher enthalten.

Gewusst wie

So bearbeiten Sie CPU-Konfigurationseinstellungen

  1. Öffnen Sie den Internet Information Services (IIS) Manager:

    • Wenn Sie Windows Server 2012 oder Windows Server 2012 R2 verwenden:

      • Klicken Sie in der Taskleiste auf Server-Manager, dann auf Tools und dann auf den Internet Information Services (IIS) Manager.
    • Wenn Sie Windows 8 oder Windows 8.1 verwenden:

      • Halten Sie die Windows-Taste gedrückt, drücken Sie den Buchstaben X, und klicken Sie dann auf Systemsteuerung.
      • Klicken Sie auf Verwaltung und doppelklicken Sie dann auf den Internet Information Services (IIS) Manager.
    • Wenn Sie Windows Server 2008 oder Windows Server 2008 R2 verwenden:

      • Klicken Sie auf der Taskleiste auf Start, zeigen Sie auf Verwaltung und dann auf den Internet Information Services (IIS) Manager.
    • Wenn Sie Windows Vista oder Windows 7 verwenden:

      • Klicken Sie auf der Taskleiste auf Start und dann auf Systemsteuerung.
      • Doppelklicken Sie auf Verwaltung und doppelklicken Sie dann auf den Internet Information Services (IIS) Manager.
  2. Erweitern Sie im Bereich Verbindungen den Servernamen, klicken Sie auf Anwendungspools, und klicken Sie dann auf den Anwendungspool, den Sie bearbeiten möchten.
    Screenshot of the Application Pools screen that populates from the Connections pane.

  3. Klicken Sie im Bereich Aktionen auf Erweiterte Einstellungen...

  4. Klicken Sie im Dialogfeld Erweiterte Einstellungen auf die CPU-Eigenschaft, die Sie bearbeiten möchten, und bearbeiten Sie dann den Wert im Eigenschaftenwertabschnitt des Dialogfelds, und klicken Sie dann auf OK. Sie können z. B. die Einschränkungsaktion auf NoAction, KillW3wp, Throttle oder ThrottleUnderLoad ändern.
    Screenshot of the Advanced Settings dialog box's Throttle Under Load section.

Konfigurieren von IIS für die Verwendung mit nicht einheitlicher Speicherzugriff (NUMA)-Hardware

  1. Klicken Sie in der Taskleiste auf Server-Manager, dann auf Tools, und dann auf den Internet Information Services (IIS) Manager.

  2. Erweitern Sie im Bereich Verbindungen den Servernamen, und klicken Sie anschließend auf Anwendungspools.

  3. Wählen Sie im Bereich Anwendungspools den Pool aus, den Sie für NUMA konfigurieren möchten.

  4. Wählen Sie im Bereich Aktion die Option Erweiterte Einstellungen aus.

  5. Legen Sie unter Prozessmodell Maximale Arbeitsprozesse auf 0 fest.

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

  6. Legen Sie unter CPU processorGroup,numaNodeAffinityMode undnumaNodeAssignment fest.

  7. Klicken Sie auf OK.

Konfiguration

Attribute

Attribut Beschreibung
action Optionales Enumerationsattribut. Konfiguriert die Aktion, die IIS ausführt, wenn ein Arbeitsprozess seinen konfigurierten CPU-Grenzwert überschreitet. Das Aktionsattribute wird pro Anwendungspool konfiguriert.

Das Aktionsattribute kann einer der folgenden möglichen Werte sein. Der Standardwert ist NoAction.

Wert Beschreibung
NoAction Es wird keine Aktion ausgeführt, wenn der CPU-Grenzwert überschritten wird. Eine Warnung wird in das Ereignisprotokoll geschrieben.

Der numerische Wert ist 0.

KillW3wp Arbeitsprozesse für Anwendungspools, die ihren CPU-Grenzwert überschreiten, werden gezwungen, herunterzufahren.

Der numerische Wert ist 1.

Throttle Der CPU-Verbrauch ist auf den in "Limit" festgelegten Wert beschränkt. Das Limit-Intervall wird nicht verwendet, und ein Ereignisprotokolleintrag wird generiert.

Der numerische Wert ist 2.

ThrottleUnderLoad Der CPU-Verbrauch ist nur begrenzt, wenn es einen Konflikt auf der CPU gibt. Das Limit-Intervall wird nicht verwendet, und ein Ereignisprotokolleintrag wird generiert.

Der numerische Wert ist 3.

limit Optionales uint-Attribut. Konfiguriert den maximalen Prozentsatz der CPU-Zeit (in 1/1000stel Prozent), den die Arbeitsprozesse in einem Anwendungspool über einen Zeitraum verbrauchen dürfen, wie durch das Attribut resetInterval angegeben. Wenn der durch das Limit-Attribut festgelegte Grenzwert überschritten wird, wird ein Ereignis in das Ereignisprotokoll geschrieben und ein optionaler Satz von Ereignissen kann ausgelöst werden. Diese optionalen Ereignisse werden durch das Aktionsattribute bestimmt.

Hinweis: Legen Sie in IIS 8.5 und höher im CPU-Bereich des IIS-Managers das Limit in Prozent fest. Legen Sie in IIS 8.0 das Limit in 1/1000 von 1 Prozent im CPU-Bereich des IIS-Managers fest. In beiden Fällen beträgt das limit Attribut in applicationHost.config 1/1000stel Prozent.

Der Standardwert ist 0, wodurch die CPU-Begrenzung deaktiviert wird.
numaNodeAffinityMode Optionales Enumerationsattribut. Gibt an, wie die Threads eines Prozesses, der zu einem NUMA-Knoten affinitiert ist, auf den Kernen des Knotens geplant werden.

Das numaNodeAffinityMode-Attribut kann einer der folgenden möglichen Werte sein. Der Standardwert ist Soft.

Wert Beschreibung
Soft Solange die Kerne in einem NUMA-Knoten, zu dem ein Prozess affinitiert ist, verfügbar sind, werden alle Threads des Prozesses für diese Kerne geplant. Wenn der Planer den Prozess jedoch nicht für die Kerne des Knotens planen kann, zu dem er affinitiert ist, kann er den Prozess auf Kernen in einem anderen NUMA-Knoten planen.

Der numerische Wert ist 0.

Hard Jeder Thread eines Prozesses, der zu einem NUMA-Knoten affinitiert ist, wird auf den Kernen des Knotens und nur auf diesen Kernen geplant. Für Kerne in einem anderen NUMA-Knoten werden keine Threads dieses Prozesses geplant.

Der numerische Wert ist 1.

numaNodeAssignment Optionales Enumerationsattribut. Gibt an, wie IIS bestimmt, mit welchem NUMA-Knoten (nicht einheitlicher Speicherzugriff) ein Prozess affinitiert werden soll. Ein NUMA-Knoten enthält Cluster von Kernen, die eine einzelne Speicherbank gemeinsam nutzen. Dieses Attribut ist nur in den erweiterten CPU-Einstellungen verfügbar, wenn NUMA-Knoten verfügbar sind.

Das numaNodeAssignment-Attribut kann einer der folgenden möglichen Werte sein. Der Standardwert ist Most Available Memory.

Wert Beschreibung
Most Available Memory Der Prozess wird dem NUMA-Knoten zugewiesen, der den größten Arbeitsspeicher frei hat.

Der numerische Wert ist 0.

Windows Scheduling Die Windows-Planung bestimmt, welchem NUMA-Knoten der Prozess zugewiesen ist.

Der numerische Wert ist 1.

processorGroup Optionales Int-Attribut. Die Anzahl der verwendeten Prozessorgruppen (nullbasiert). Eine Prozessorgruppe enthält mehrere Kerne. Das Prozessorgruppen-Attribut ist nur in den erweiterten CPU-Einstellungen verfügbar, wenn der Server über mehrere Prozessorgruppen verfügt.

Der Standardwert lautet 0, was bedeutet, dass eine einzelne Prozessorgruppe verwendet wird.
resetInterval Optionales timeSpan-Attribut. Gibt den Zurücksetzungszeitraum (in Minuten) für die CPU-Überwachung und Einschränkungsgrenzwerte für einen Anwendungspool an. Wenn die Anzahl der Minuten seit dem letzten Zurücksetzen der Prozessbuchhaltung der durch diese Eigenschaft angegebenen Anzahl entspricht, setzt IIS die CPU-Timer sowohl für die Protokollierung als auch für die Grenzwertintervalle zurück.

Wichtig: Der Wert resetInterval muss größer sein als die Zeit zwischen Protokollierungsvorgängen. Andernfalls setzt IIS die Zähler zurück, bevor die Protokollierung stattgefunden hat, und es erfolgt keine Prozessabrechnung.

Hinweis: Da die Prozessabrechnung in IIS Windows-Auftragsobjekte verwendet, um CPU-Zeiten für den gesamten Prozess zu überwachen, protokolliert die Prozessabrechnung nur Anwendungen, die in einem separaten Prozess von IIS isoliert sind.

Der Standardwert ist 00:05:00.
smpAffinitized Optionales boolesches Attribut. Gibt an, ob ein bestimmter Arbeitsprozess, der einem Anwendungspool zugewiesen ist, auch einer bestimmten CPU zugewiesen werden soll. Diese Eigenschaft wird zusammen mit den Attributen smpProcessorAffinityMask und smpProcessorAffinityMask2 verwendet.

Der Standardwert ist false.
smpProcessorAffinityMask Optionales uint-Attribut. Gibt die Hexadezimalprozessormaske für Computer mit mehreren Prozessorn an, die angibt, an welche CPU die Arbeitsprozesse in einem Anwendungspool gebunden werden sollen. Bevor diese Eigenschaft wirksam wird, muss das Attribut smpAffinitized für den Anwendungspool auf true festgelegt werden.

Hinweis: Auf 64-Bit-Computern enthält das smpProcessorAffinityMask-Attribut das niederwertige DWORD für die Prozessormaske und das smpProcessorAffinityMask2-Attribut das höherwertige DWORD für die Prozessormaske. Auf 32-Bit-Computern hat das Attribut smpProcessorAffinityMask2 keine Auswirkung.

Wenn Sie den Wert auf 1 festlegen (der 00000000000000001 in der Binärdatei entspricht), werden die Arbeitsprozesse in einem Anwendungspool nur auf dem ersten Prozessor ausgeführt. Wenn Sie den Wert auf 2 festlegen (der 0000000000000010 in der Binärdatei entspricht), werden die Arbeitsprozesse nur auf dem zweiten Prozessor ausgeführt. Wenn Sie den Wert auf 3 (was 0000000000000011 binär entspricht) festlegen, werden die Arbeitsprozesse sowohl auf den ersten als auch auf den zweiten Prozessoren ausgeführt.

Hinweis: Legen Sie diese Eigenschaft nicht auf 0 fest. Dadurch wird die SMP-Affinität (symmetrisches Multiprocessing) deaktiviert und eine Fehlerbedingung erstellt. Dies bedeutet, dass Prozesse, die auf einer CPU ausgeführt werden, nicht während ihrer gesamten Lebensdauer mit dieser CPU verbunden bleiben.

Der Standardwert ist 4294967295.
smpProcessorAffinityMask2 Optionales uint-Attribut. Gibt die DWORD-Hexadezimalprozessormaske für 64-Bit-Multiprozessorcomputer in hoher Reihenfolge an, die angibt, an welche CPU die Arbeitsprozesse in einem Anwendungspool gebunden werden sollen. Bevor diese Eigenschaft wirksam wird, muss das Attribut smpAffinitized für den Anwendungspool auf true festgelegt werden.

Hinweis: Auf 64-Bit-Computern enthält das smpProcessorAffinityMask-Attribut das niederwertige DWORD für die Prozessormaske und das smpProcessorAffinityMask2-Attribut das höherwertige DWORD für die Prozessormaske. Auf 32-Bit-Computern hat das Attribut smpProcessorAffinityMask2 keine Auswirkung.

Der Standardwert ist 4294967295.

Untergeordnete Elemente

Keine.

Konfigurationsbeispiel

Im folgenden Konfigurationsbeispiel wird ein einzelner Anwendungspool mit dem Namen DefaultAppPool konfiguriert und die CPU auf 50 % festgelegt, wobei eine Aktion zum Beenden des Arbeitsprozesses mit einem Zurücksetzungsintervall von 10 Minuten erfolgt.

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

Beispielcode

Die folgenden Codebeispiele konfigurieren den Standardanwendungspool so, dass der Arbeitsprozess beendet wird, wenn er das CPU-Limit überschreitet, und konfigurieren das Zurücksetzungsintervall auf vier Minuten.

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

Hinweis

Sie müssen unbedingt den Commitparameter auf apphost festlegen, wenn Sie AppCmd.exe verwenden, um diese Einstellungen zu konfigurieren. Dadurch werden die Konfigurationseinstellungen auf den entsprechenden Speicherortabschnitt in der Datei ApplicationHost.config festgelegt.

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