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
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).
Nel riquadro Connessioni espandere il nome del server, fare clic su Pool di applicazioni e quindi sul pool di applicazioni che si desidera modificare.
Nel riquadro Azioni fare clic su Impostazioni avanzate...
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.
Come configurare IIS per l'uso con hardware NUMA (Non-Uniform Memory Access)
Sulla barra delle applicazioni fare clic su Server Manager, scegliere Strumenti, quindi fare clic su Gestione Internet Information Services (IIS).
Nel riquadro Connessioni espandere il nome del server e quindi fare clic su Pool di applicazioni.
Nel riquadro Pool di applicazioni selezionare il pool da configurare per NUMA.
Nel riquadro Azioni selezionare Impostazioni avanzate.
In Modello di processo impostare Numero massimo processi di lavoro su
0
.In CPU impostare processorGroup, numaNodeAffinityMode e numaNodeAssignment.
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 .
|
||||||||||
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 .
|
||||||||||
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 .
|
||||||||||
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