Configurações de CPU para um pool de aplicativos <cpu>
Visão geral
O elemento <cpu>
do elemento <add>
na coleção <applicationPools>
configura valores para parâmetros de uso da CPU e ações de CPU que serão usadas em pools de aplicativos.
Suporte ao NUMA
O NUMA (acesso não uniforme a memória) é um método baseado em hardware de associar processadores à sua própria memória dedicada. O NUMA é usado para aumentar a velocidade do processador como uma alternativa ao modelo SMP (multiprocessador simétrico) tradicional para suporte a vários processadores. Você pode configurar o IIS 8 e posterior para distribuir e criar afinidade entre seus processos no NUMA. O uso do NUMA é configurado no elemento CPU pelo atributo numaNodeAssignment que permite ao IIS identificar o nó NUMA mais ideal quando o processo de trabalho do IIS está prestes a ser iniciado, e o atributo numaNodeAffinityMode que determina como foi criada afinidade entre os threads de um processo de trabalho do IIS e um nó NUMA. O NUMA também é configurado usando o atributo MaxProcesses do elemento processModel, que, quando definido como 0
, especifica que o IIS executa automaticamente a mesma quantidade de processos de trabalho que a quantidade de nós NUMA. Para obter mais informações, consulte Dimensionamento multicore do IIS 8.0 no hardware NUMA.
A lógica de seleção do NUMA e o tipo de afinidade podem ser definidos na caixa de diálogo Configurações Avançadas somente se o IIS estiver em execução no hardware NUMA.
Compatibilidade
Versão | Observações |
---|---|
IIS 10.0 | O elemento <cpu> não foi modificado no IIS 10.0. |
IIS 8.5 | O elemento <cpu> não foi modificado no IIS 8.5. |
IIS 8.0 | Dois valores de enumeração foram adicionados ao atributo action para definir o comportamento de limitação. O atributo processorGroup foi adicionado para definir o número de grupos de processadores usados. Os atributos numaNodeAssignment e numaNodeAffinityMode foram adicionados para especificar o comportamento dos nós NUMA. |
IIS 7.5 | O elemento <cpu> não foi modificado no IIS 7.5. |
IIS 7.0 | O elemento <cpu> foi introduzido no IIS 7.0. |
IIS 6,0 | O elemento <cpu> substitui partes da propriedade de metabase IIsApplicationPools do IIS 6.0. |
Instalação
A coleção <applicationPools>
está incluída na instalação padrão do IIS 7 e posteriores.
Instruções
Como editar as configurações da CPU
Abra o Gerenciador dos Serviços de Informações da Internet (IIS):
Caso você esteja usando o Windows Server 2012 ou o Windows Server 2012 R2:
- Na barra de tarefas, clique em Gerenciador do Servidor, em Ferramentas e em Gerenciador dos Serviços de Informações da Internet (IIS).
Se você estiver usando o Windows 8 ou Windows 8.1:
- Mantenha pressionada a tecla Windows, pressione a letra X e clique em Painel de Controle.
- Clique em Ferramentas Administrativas e clique duas vezes em Gerenciador dos Serviços de Informações da Internet (IIS).
Caso você esteja usando o Windows Server 2008 ou o Windows Server 2008 R2:
- Na barra de tarefas, clique em Iniciar, vá para Ferramentas Administrativas e clique em Gerenciador dos Serviços de Informações da Internet (IIS).
Se você estiver usando o Windows Vista ou Windows 7:
- Na barra de tarefas, clique em Iniciar e, depois, em Painel de Controle.
- Clique duas vezes em Ferramentas Administrativas e clique duas vezes em Gerenciador dos Serviços de Informações da Internet (IIS).
No painel Conexões, expanda o nome do servidor e clique em Pools de Aplicativos e no pool de aplicativos que deseja editar.
No painel Ações, clique em Configurações Avançadas...
Na caixa de diálogo Configurações Avançadas, clique na propriedade da CPU que deseja editar, edite o valor na seção de valor da propriedade da caixa de diálogo e clique em OK. Por exemplo, você pode alterar Limit Action para NoAction, KillW3wp, Throttleou ThrottleUnderLoad.
Como configurar o IIS para uso com o hardware NUMA (acesso não uniforme à memória)
Na barra de tarefas, clique em Gerenciador do Servidor, em Ferramentas e em Gerenciador dos Serviços de Informações da Internet (IIS).
No painel Conexões, expanda o nome do servidor e clique em Pools de Aplicativos.
No painel Pools de Aplicativos, selecione o pool que deseja configurar para NUMA.
No painel Ações, selecione Configurações Avançadas.
Em Modelo de Processo, defina o Máximo de Processos de Trabalho como
0
.Em CPU, defina processorGroup, numaNodeAffinityMode e numaNodeAssignment.
Clique em OK.
Configuração
Atributos
Atributo | Descrição | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
action |
Atributo de enumeração opcional. Configura a ação que o IIS executa quando um processo de trabalho excede o limite de CPU configurado. O atributo de ação é configurado por pool de aplicativos. O atributo action pode ser um dos valores possíveis a seguir. O valor padrão é NoAction .
|
||||||||||
limit |
Atributo uint opcional. Configura o percentual máximo de tempo de CPU (em 1/1000 de um por cento) que os processos de trabalho em um pool de aplicativos têm permissão para consumir durante um período de tempo, conforme indicado pelo atributo resetInterval. Se o limite definido pelo atributo limit for excedido, um evento será gravado no log de eventos e um conjunto opcional de eventos poderá ser disparado. Esses eventos opcionais são determinados pelo atributo action. Observação: no IIS 8.5 ou superior, defina limit em porcentagem no painel CPU do Gerenciador do IIS. No IIS 8.0, defina limit em 1/1000 de um por cento no painel CPU do Gerenciador do IIS. Para ambos os casos, o atributo limit em applicationHost.config está em 1/1000 de um por cento. O valor padrão é 0 , que desabilita a limitação da CPU. |
||||||||||
numaNodeAffinityMode |
Atributo de enumeração opcional. Especifica como os threads de um processo para o qual foi criada afinidade com um nó NUMA serão agendados nos núcleos do nó. O atributo numaNodeAffinityMode pode ser um dos valores possíveis a seguir. O valor padrão é Soft .
|
||||||||||
numaNodeAssignment |
Atributo de enumeração opcional. Especifica como o IIS determinará a qual nó NUMA (acesso não uniforme a memória) para a afinidade de um processo. Um nó NUMA contém clusters de núcleos que compartilham um único banco de memória. Esse atributo estará disponível nas Configurações Avançadas da CPU somente se os nós NUMA estiverem disponíveis. O atributo numaNodeAssignment pode ser um dos valores possíveis a seguir. O valor padrão é Most Available Memory .
|
||||||||||
processorGroup |
Atributo int opcional. O número de grupos de processadores usados (baseado em zero). Um grupo de processadores contém vários núcleos. O atributo Processor Group estará disponível nas Configurações Avançadas da CPU somente se o servidor tiver vários grupos de processadores. O valor padrão é 0 , o que significa que um único grupo de processadores é usado. |
||||||||||
resetInterval |
Atributo timeSpan opcional. Especifica o período de redefinição (em minutos) para os limites de monitoramento e limitação da CPU em um pool de aplicativos. Quando o número de minutos decorrido desde a última redefinição da contabilização de processos é igual ao número especificado por essa propriedade, o IIS redefine os temporizadores de CPU para os intervalos de registro em log e limite. Importante: o valor resetInterval deve ser maior que o tempo entre operações de log; caso contrário, o IIS redefinirá os contadores antes do registro em log e a contabilização de processos não ocorrerá. Observação: como a contabilização de processos no IIS usa objetos de trabalho do Windows para monitorar os tempos de CPU de todo o processo, ela só registrará e limitará os aplicativos isolados em um processo separado do IIS. O valor padrão é 00:05:00 . |
||||||||||
smpAffinitized |
Atributo booliano opcional. Especifica se um determinado processo de trabalho atribuído a um pool de aplicativos também deve ser atribuído a uma determinada CPU. Essa propriedade é usada junto com os atributos smpProcessorAffinityMask e smpProcessorAffinityMask2. O valor padrão é false . |
||||||||||
smpProcessorAffinityMask |
Atributo uint opcional. Especifica a máscara de processador hexadecimal para computadores com vários processadores, que indica a qual CPU os processos de trabalho em um pool de aplicativos devem ser associados. Antes que essa propriedade entre em vigor, o atributo smpAffinitized deve ser definido como true para o pool de aplicativos. Observação: em computadores de 64 bits, o atributo smpProcessorAffinityMask contém o DWORD de baixa ordem para a máscara de processador e o atributo smpProcessorAffinityMask2 contém o DWORD de alta ordem para a máscara de processador. Em computadores de 32 bits, o atributo smpProcessorAffinityMask2 não tem efeito. Se você definir o valor como 1 (que corresponde a 00000000000000001 em binário), os processos de trabalho em um pool de aplicativos serão executados apenas no primeiro processador. Se você definir o valor como 2 (que corresponde a 0000000000000010 em binário), os processos de trabalho serão executados apenas no segundo processador. Se você definir o valor como 3 (que corresponde a 0000000000000011 em binário), os processos de trabalho serão executados no primeiro e no segundo processadores. Observação: não defina essa propriedade como 0. Isso desabilita a afinidade de SMP (multiprocessamento simétrico) e cria uma condição de erro. Isso significa que os processos em execução em uma CPU não permanecerão afiliados a essa CPU durante todo o tempo de vida. O valor padrão é 4294967295 . |
||||||||||
smpProcessorAffinityMask2 |
Atributo uint opcional. Especifica a máscara de processador hexadecimal DWORD de alta ordem para computadores multiprocessadores de 64 bits, o que indica a qual CPU os processos de trabalho em um pool de aplicativos devem ser associados. Antes que essa propriedade entre em vigor, o atributo smpAffinitized deve ser definido como true para o pool de aplicativos. Observação: em computadores de 64 bits, o atributo smpProcessorAffinityMask contém o DWORD de baixa ordem para a máscara de processador e o atributo smpProcessorAffinityMask2 contém o DWORD de alta ordem para a máscara de processador. Em computadores de 32 bits, o atributo smpProcessorAffinityMask2 não tem efeito. O valor padrão é 4294967295 . |
Elementos filho
Nenhum.
Exemplo de configuração
O exemplo de configuração a seguir configura um único pool de aplicativos chamado DefaultAppPool e define a CPU como 50%, com uma ação para encerrar o processo de trabalho com um intervalo de redefinição de 10 minutos.
<applicationPools>
<add name="DefaultAppPool">
<cpu limit="50000" action="KillW3wp" resetInterval="00:10:00" />
</add>
<applicationPoolDefaults>
<processModel identityType="NetworkService" />
</applicationPoolDefaults>
</applicationPools>
Exemplo de código
Os exemplos de código a seguir configuram o pool de aplicativos padrão para encerrar o processo de trabalho quando ele exceder o limite da CPU e configurar o intervalo de redefinição como quatro minutos.
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
Observação
Defina o parâmetro commit para apphost
quando usar AppCmd.exe para definir essas configurações. Isso confirma as definições de configuração para a seção de local apropriado no arquivo 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