Параметры ЦП для ЦП пула приложений <>

Общие сведения

Элемент <cpu><add> элемента в <applicationPools> коллекции настраивает значения для параметров использования ЦП и действий ЦП, которые будут использоваться в пулах приложений.

Поддержка NUMA

Неоднородный доступ к памяти (NUMA) — это аппаратный метод связывания процессоров с собственной выделенной памятью. NUMA используется для увеличения скорости процессора в качестве альтернативы традиционной симметричной многопроцессорной модели (SMP) для поддержки многопроцессоров. Вы можете настроить IIS 8 и более поздних версий для распространения и сопоставления процессов в NUMA. Использование NUMA настраивается в элементе ЦП с помощью атрибута numaNodeAssignment, который позволяет СЛУЖБАм IIS определить наиболее оптимальный узел NUMA, когда рабочий процесс IIS вот-вот запустится, и атрибутом numaNodeAffinityMode, который определяет, как потоки из рабочего процесса IIS сопоставляются с узлом NUMA. NUMA также настраивается с помощью атрибута MaxProcesses элемента processModel, который, если задано значение 0 , указывает, что службы IIS автоматически запускают то же количество рабочих процессов, что и узлы NUMA. Дополнительные сведения см. в разделе Многоядерное масштабирование IIS 8.0 на оборудовании NUMA.

Логику выбора NUMA и тип сходства можно задать в диалоговом окне Дополнительные параметры , только если службы IIS работают на оборудовании NUMA.

Совместимость

Версия Примечания
IIS 10.0 Элемент <cpu> не был изменен в IIS 10.0.
IIS 8,5 Элемент <cpu> не был изменен в IIS 8.5.
IIS 8,0 Для определения поведения регулирования в атрибут были добавлены action два значения перечисления. Атрибут processorGroup был добавлен для определения количества используемых групп процессоров. Атрибуты numaNodeAssignment и numaNodeAffinityMode были добавлены для указания поведения узлов NUMA.
IIS 7,5 Элемент <cpu> не был изменен в IIS 7.5.
IIS 7.0 Элемент <cpu> появился в IIS 7.0.
IIS 6,0 Элемент <cpu> заменяет части свойства метабазы IIsApplicationPools IIS 6.0.

Настройка

Коллекция включена <applicationPools> в установку iis 7 по умолчанию и более поздних версий.

Инструкции

Изменение параметров конфигурации ЦП

  1. Откройте диспетчер служб IIS.

    • Если вы используете Windows Server 2012 или Windows Server 2012 R2:

      • На панели задач щелкните диспетчер сервера, инструменты, а затем диспетчер служб IIS.
    • Если вы используете Windows 8 или Windows 8.1:

      • Удерживая нажатой клавишу Windows, нажмите букву X и щелкните панель управления.
      • Щелкните Администрирование, а затем дважды щелкните диспетчер служб IIS.
    • Если вы используете Windows Server 2008 или Windows Server 2008 R2:

      • На панели задач нажмите кнопку Пуск, наведите указатель на пункт Администрирование, а затем щелкните Диспетчер служб IIS.
    • Если вы используете Windows Vista или Windows 7:

      • На панели задач нажмите кнопку Пуск, а затем выберите пункт панель управления.
      • Дважды щелкните элемент Администрирование, а затем дважды щелкните диспетчер служб IIS.
  2. В области Подключения разверните имя сервера, щелкните Пулы приложений, а затем выберите пул приложений, который требуется изменить.
    Снимок экрана: экран

  3. В области Действия щелкните Дополнительные параметры...

  4. В диалоговом окне Дополнительные параметры выберите свойство ЦП, которое требуется изменить, затем измените значение в разделе значения свойства диалогового окна и нажмите кнопку ОК. Например, можно изменить действие ограничения на NoAction, KillW3wp, Throttle или ThrottleUnderLoad.
    Снимок экрана: раздел

Настройка СЛУЖБ IIS для использования с оборудованием NUMA

  1. На панели задач щелкните диспетчер сервера, инструменты, а затем диспетчер служб IIS.

  2. В области Подключения разверните имя сервера и щелкните Пулы приложений.

  3. В области Пулы приложений выберите пул, который нужно настроить для NUMA.

  4. В области Действия выберите Дополнительные параметры.

  5. В разделе Модель процесса задайте для параметра Максимальное число рабочих процессов значение 0.

    Снимок экрана: раздел

  6. В разделе ЦП задайте processorGroup, numaNodeAffinityMode и numaNodeAssignment.

  7. Нажмите кнопку ОК.

Конфигурация

Атрибуты

Атрибут Описание
action Необязательный атрибут перечисления. Настраивает действие, выполняемое службами IIS, когда рабочий процесс превышает заданное ограничение ЦП. Атрибут действия настраивается для каждого пула приложений.

Атрибут action может иметь одно из следующих возможных значений. Значение по умолчанию — NoAction.

Значение Описание
NoAction При превышении предела ЦП никакие действия не предпринимаются. Предупреждение записывается в журнал событий.

Числовое значение равно 0.

KillW3wp Рабочие процессы пула приложений, превышающие предел ЦП, будут вынуждены завершить работу.

Числовое значение равно 1.

Throttle Потребление ЦП ограничено значением, заданным в разделе Ограничение. Интервал ограничения не используется, и создается запись журнала событий.

Числовое значение равно 2.

ThrottleUnderLoad Потребление ЦП ограничено только в случае состязания за ЦП. Интервал ограничения не используется, и создается запись журнала событий.

Числовое значение равно 3.

limit Необязательный атрибут uint. Настраивает максимальный процент времени ЦП (в 1/1000ths от одного процента), который рабочие процессы в пуле приложений могут использовать в течение определенного периода времени, как указано в атрибуте resetInterval. При превышении ограничения, установленного атрибутом limit, событие записывается в журнал событий и может быть активирован необязательный набор событий. Эти необязательные события определяются атрибутом action.

Примечание: В IIS 8.5 и более поздних версий задайте ограничение в процентах на панели ЦП диспетчера IIS. В IIS 8.0 установите ограничение в 1/1000 в один процент на панели ЦП диспетчера IIS. В обоих случаях limit атрибут в applicationHost.config имеет значение 1/1000ths от одного процента.

Значение по умолчанию — 0, которое отключает ограничение ЦП.
numaNodeAffinityMode Необязательный атрибут перечисления. Указывает, как потоки процесса, сопоставленного с узлом NUMA, будут планироваться в ядрах узла.

Атрибут numaNodeAffinityMode может иметь одно из следующих возможных значений. Значение по умолчанию — Soft.

Значение Описание
Soft Пока доступны ядра в узле NUMA, с которым связан процесс, все потоки процесса будут запланированы на эти ядра. Однако если планировщик не может запланировать процесс на ядрах узла, с которым он связан, он может запланировать процесс на ядрах в другом узле NUMA.

Числовое значение равно 0.

Hard Любой поток процесса, который связан с узлом NUMA, будет запланирован на ядра узла и только эти ядра. Потоки этого процесса не будут планироваться на ядрах в другом узле NUMA.

Числовое значение равно 1.

numaNodeAssignment Необязательный атрибут перечисления. Указывает, как службы IIS будут определять, с каким узлом NUMA (неоднородным доступом к памяти) будет сопоставлен процесс. Узел NUMA содержит кластеры ядер, которые совместно используют один банк памяти. Этот атрибут доступен в дополнительных параметрах ЦП, только если доступны узлы NUMA.

Атрибут numaNodeAssignment может быть одним из следующих возможных значений. Значение по умолчанию — Most Available Memory.

Значение Описание
Most Available Memory Процесс будет назначен узлу NUMA с наибольшим объемом свободного объема памяти.

Числовое значение равно 0.

Windows Scheduling Планирование Windows определяет, на каком узле NUMA назначен процесс.

Числовое значение равно 1.

processorGroup Необязательный атрибут int. Количество используемых групп процессоров (отсчитывается от нуля). Группа процессоров содержит несколько ядер. Атрибут Группа процессоров доступен в дополнительных параметрах ЦП, только если сервер имеет несколько групп процессоров.

Значение по умолчанию — 0, что означает, что используется одна группа процессоров.
resetInterval Необязательный атрибут timeSpan. Указывает период сброса (в минутах) для мониторинга ЦП и ограничений регулирования в пуле приложений. Если количество минут, прошедшее с момента последнего сброса учета процесса, равно числу, указанному этим свойством, IIS сбрасывает таймеры ЦП как для ведения журнала, так и для предельного интервала.

Важно! Значение resetInterval должно быть больше времени между операциями ведения журнала, в противном случае IIS сбросит счетчики перед ведением журнала, а учет процессов не будет выполняться.

Примечание: Так как учет процессов в IIS использует объекты заданий Windows для отслеживания времени ЦП для всего процесса, учет процессов будет регистрировать и регулировать только приложения, изолированные в отдельном процессе от IIS.

Значение по умолчанию — 00:05:00.
smpAffinitized Дополнительный логический атрибут. Указывает, следует ли назначать определенный рабочий процесс, назначенный пулу приложений, данному ЦП. Это свойство используется вместе с атрибутами smpProcessorAffinityMask и smpProcessorAffinityMask2 .

Значение по умолчанию — false.
smpProcessorAffinityMask Необязательный атрибут uint. Указывает шестнадцатеричную маску процессора для многопроцессорных компьютеров, которая указывает, к какому ЦП должны быть привязаны рабочие процессы в пуле приложений. Прежде чем это свойство вступит в силу, атрибуту smpAffinitized необходимо задать значение true для пула приложений.

Примечание: На 64-разрядных компьютерах атрибут smpProcessorAffinityMask содержит DWORD низкого порядка для маски процессора, а атрибут smpProcessorAffinityMask2 содержит DWORD высокого порядка для маски процессора. На 32-разрядных компьютерах атрибут smpProcessorAffinityMask2 не действует.

Если задать значение 1 (что соответствует 00000000000000001 в двоичном файле), рабочие процессы в пуле приложений выполняются только на первом процессоре. Если задать значение 2 (что соответствует 0000000000000010 в двоичном файле), рабочие процессы будут выполняться только на втором процессоре. Если задать значение 3 (что соответствует 0000000000000011 в двоичном формате), рабочие процессы выполняются как на первом, так и на втором процессорах.

Примечание: Не устанавливайте для этого свойства значение 0. Это отключает симметричное сходство многопроцессорной обработки (SMP) и создает условие ошибки. Это означает, что процессы, работающие на одном ЦП, не будут связаны с этим ЦП в течение всего времени их существования.

Значение по умолчанию — 4294967295.
smpProcessorAffinityMask2 Необязательный атрибут uint. Задает шестнадцатеричную маску процессора DWORD высокого порядка для 64-разрядных многопроцессорных компьютеров, которая указывает, к какому ЦП должны быть привязаны рабочие процессы в пуле приложений. Прежде чем это свойство вступит в силу, атрибуту smpAffinitized необходимо задать значение true для пула приложений.

Примечание: На 64-разрядных компьютерах атрибут smpProcessorAffinityMask содержит DWORD низкого порядка для маски процессора, а атрибут smpProcessorAffinityMask2 содержит DWORD высокого порядка для маски процессора. На 32-разрядных компьютерах атрибут smpProcessorAffinityMask2 не действует.

Значение по умолчанию — 4294967295.

Дочерние элементы

Отсутствует.

Образец конфигурации

Следующий пример конфигурации настраивает один пул приложений с именем DefaultAppPool и устанавливает для ЦП значение 50 % с действием для завершения рабочего процесса с интервалом сброса в 10 минут.

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

Пример кода

В следующих примерах кода настраивается пул приложений по умолчанию для завершения рабочего процесса при превышении предела ЦП, а интервал сброса настраивается на четыре минуты.

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

Примечание

При использовании AppCmd.exe для настройки этих параметров для параметра apphostфиксации необходимо задать значение . Это зафиксирует параметры конфигурации в соответствующем разделе расположения в файле 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