Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Общие сведения
Элемент <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 по умолчанию и более поздних версий.
Инструкции
Изменение параметров конфигурации ЦП
Откройте диспетчер служб 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.
В области Подключения разверните имя сервера, щелкните Пулы приложений, а затем выберите пул приложений, который требуется изменить.
В области Действия щелкните Дополнительные параметры...
В диалоговом окне Дополнительные параметры выберите свойство ЦП, которое требуется изменить, затем измените значение в разделе значения свойства диалогового окна и нажмите кнопку ОК. Например, можно изменить действие ограничения на NoAction, KillW3wp, Throttle или ThrottleUnderLoad.
Настройка СЛУЖБ IIS для использования с оборудованием NUMA
На панели задач щелкните диспетчер сервера, инструменты, а затем диспетчер служб IIS.
В области Подключения разверните имя сервера и щелкните Пулы приложений.
В области Пулы приложений выберите пул, который нужно настроить для NUMA.
В области Действия выберите Дополнительные параметры.
В разделе Модель процесса задайте для параметра Максимальное число рабочих процессов значение
0.
В разделе ЦП задайте processorGroup, numaNodeAffinityMode и numaNodeAssignment.
Нажмите кнопку ОК.
Конфигурация
Атрибуты
| Атрибут | Описание | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
action |
Необязательный атрибут перечисления. Настраивает действие, выполняемое службами IIS, когда рабочий процесс превышает заданное ограничение ЦП. Атрибут действия настраивается для каждого пула приложений. Атрибут action может иметь одно из следующих возможных значений. Значение по умолчанию — NoAction.
|
||||||||||
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.
|
||||||||||
numaNodeAssignment |
Необязательный атрибут перечисления. Указывает, как службы IIS будут определять, с каким узлом NUMA (неоднородным доступом к памяти) будет сопоставлен процесс. Узел NUMA содержит кластеры ядер, которые совместно используют один банк памяти. Этот атрибут доступен в дополнительных параметрах ЦП, только если доступны узлы NUMA. Атрибут numaNodeAssignment может быть одним из следующих возможных значений. Значение по умолчанию — Most Available Memory.
|
||||||||||
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