Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ü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
Ö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.
Erweitern Sie im Bereich Verbindungen den Servernamen, klicken Sie auf Anwendungspools, und klicken Sie dann auf den Anwendungspool, den Sie bearbeiten möchten.
Klicken Sie im Bereich Aktionen auf Erweiterte Einstellungen...
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.
Konfigurieren von IIS für die Verwendung mit nicht einheitlicher Speicherzugriff (NUMA)-Hardware
Klicken Sie in der Taskleiste auf Server-Manager, dann auf Tools, und dann auf den Internet Information Services (IIS) Manager.
Erweitern Sie im Bereich Verbindungen den Servernamen, und klicken Sie anschließend auf Anwendungspools.
Wählen Sie im Bereich Anwendungspools den Pool aus, den Sie für NUMA konfigurieren möchten.
Wählen Sie im Bereich Aktion die Option Erweiterte Einstellungen aus.
Legen Sie unter Prozessmodell Maximale Arbeitsprozesse auf
0
fest.Legen Sie unter CPU processorGroup,numaNodeAffinityMode undnumaNodeAssignment fest.
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 .
|
||||||||||
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 .
|
||||||||||
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 .
|
||||||||||
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