概觀
集合 <cpu> 中 <applicationPools> 元素的 <add> 元素會設定將用於應用程式集區之 CPU 使用量參數和 CPU 動作的值。
NUMA 支援
非統一記憶體存取 (NUMA) 是以硬體為基礎的方法,可將處理器與自己的專用記憶體產生關聯。 NUMA 可用來增加處理器速度,作為傳統對稱多處理器 (SMP) 模型的替代方式,以支援多處理器。 您可以設定 IIS 8 和更新版本,在 NUMA 上散發和親和其進程。 NUMA 的使用是由 numaNodeAssignment 屬性在 CPU 元素中設定,可讓 IIS 在 IIS 背景工作進程即將啟動時識別最佳的 NUMA 節點,以及決定 IIS 背景工作進程執行緒如何親和至 NUMA 節點的 numaNodeAffinityMode 屬性。 NUMA 也會使用 processModel 元素的 MaxProcesses 屬性進行設定,當設定為 0 時,指定 IIS 會自動執行與 NUMA 節點相同的背景工作進程數目。 如需詳細資訊,請參閱 NUMA 硬體上的 IIS 8.0 多核心調整。
只有在 IIS 在 NUMA 硬體上執行時,才能在 [ 進階設定 ] 對話方塊中設定 NUMA 選取邏輯和親和性類型。
相容性
| 版本 | 備註 |
|---|---|
| IIS 10.0 | 未在 IIS 10.0 中修改專案 <cpu> 。 |
| IIS 8.5 | 未在 IIS 8.5 中修改專案 <cpu> 。 |
| IIS 8.0 | 已將兩個列舉值新增至 action 屬性,以定義節流行為。 已 processorGroup 新增 屬性以定義所使用的處理器群組數目。
numaNodeAssignment已新增 和 numaNodeAffinityMode 屬性,以指定 NUMA 節點的行為。 |
| IIS 7.5 | 未在 IIS 7.5 中修改專案 <cpu> 。 |
| IIS 7.0 | 元素 <cpu> 是在 IIS 7.0 中引進。 |
| IIS 6.0 | 元素 <cpu> 會取代 IIS 6.0 IIsApplicationPools Metabase 屬性的部分。 |
安裝程式
集合 <applicationPools> 包含在 IIS 7 和更新版本的預設安裝中。
作法
如何編輯 CPU 組態設定
開啟 [Internet Information Services (IIS) 管理員:
如果您使用 Windows Server 2012 或 Windows Server 2012 R2:
- 在工作列上,依序按一下 [伺服器管理員]、[工具],然後按一下 [Internet Information Services (IIS) Manager]。
如果您使用 Windows 8 或 Windows 8.1:
- 按住Windows鍵,按字母X,然後按一下[主控台]。
- 按一下 [系統管理工具],然後按兩下 [ Internet Information Services (IIS) Manager]。
如果您使用 Windows Server 2008 或 Windows Server 2008 R2:
- 在工作列上,按一下 [ 開始],指向 [ 系統管理工具],然後按一下 [ Internet Information Services (IIS) 管理員]。
如果您使用 Windows Vista 或 Windows 7:
- 在工作列上,按一下 [開始],然後按一下[主控台]。
- 按兩下 [系統管理工具],然後按兩下 [ Internet Information Services] (IIS) Manager。
在 [ 連線 ] 窗格中,展開伺服器名稱,按一下 [ 應用程式集區],然後按一下您要編輯的應用程式集區。
在 [ 動作 ] 窗格中,按一下 [ 進階設定...]
在 [ 進階設定] 對話方塊中,按一下您要編輯的 CPU 屬性,然後在對話方塊的 [屬性值] 區段中編輯值,然後按一下 [ 確定]。 例如,您可以將 [限制動作 ] 變更為 NoAction、 KillW3wp、 Throttle或 ThrottleUnderLoad。
如何設定 IIS 以搭配非統一記憶體存取 (NUMA) 硬體使用
在工作列上,依序按一下 [伺服器管理員]、[工具],然後按一下 [Internet Information Services (IIS) Manager]。
在 [ 連線] 窗格中,展開伺服器名稱,然後按一下 [ 應用程式集區]。
在 [ 應用程式集區 ] 窗格中,選取您要為 NUMA 設定的集區。
在 [ 動作 ] 窗格中,選取 [ 進階設定]。
在 [進程模型]下,將 [背景工作進程上限 ] 設定為
0。
在 [CPU] 下,設定 processorGroup、 numaNodeAffinityMode和 numaNodeAssignment。
按一下 [確定]。
組態
屬性
| 屬性 | 描述 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
action |
選擇性列舉屬性。 設定 IIS 在背景工作進程超過其設定的 CPU 限制時所採取的動作。 動作屬性是以個別應用程式集區為基礎進行設定。 動作屬性可以是下列其中一個可能的值。 預設值是 NoAction。
|
||||||||||
limit |
選擇性 uint 屬性。 設定應用程式集區中背景工作進程在 1/1000 分之 1/1000 中的 CPU 時間百分比上限 (,) 允許在一段時間內取用背景工作進程,如 resetInterval 屬性所指示。 如果超過 limit 屬性所設定的限制,就會將事件寫入事件記錄檔,並觸發一組選擇性的事件。 這些選擇性事件是由動作屬性決定。 注意: 在 IIS 8.5 和更新版本中,在 IIS 管理員的 [CPU] 窗格中設定 百分比的限制 。 在 IIS 8.0 中 ,在 IIS 管理員的 [CPU] 窗格中,將 1/1000% 的限制設定為 1/1000。 在這兩種情況下, limit applicationHost.config 中的 屬性為 1/1000 分之一。 預設值為 0 ,這會停用 CPU 限制。 |
||||||||||
numaNodeAffinityMode |
選擇性列舉屬性。 指定如何在節點的核心上排程與 NUMA 節點親和化之進程的執行緒。 numaNodeAffinityMode 屬性可以是下列其中一個可能的值。 預設值是 Soft。
|
||||||||||
numaNodeAssignment |
選擇性列舉屬性。 指定 IIS 如何判斷哪些 NUMA (非統一記憶體存取) 節點,以將進程親和化。 NUMA 節點包含共用單一記憶體銀行的核心叢集。 只有在 NUMA 節點可用時,才會在 CPU 進階設定中使用這個屬性。 numaNodeAssignment 屬性可以是下列其中一個可能的值。 預設值是 Most Available Memory。
|
||||||||||
processorGroup |
選擇性 int 屬性。 (以零起始) 使用的處理器群組數目。 處理器群組包含多個核心。 只有在伺服器有多個處理器群組時,才會在 CPU 進階設定中提供處理器群組屬性。 預設值為 0 ,這表示會使用單一處理器群組。 |
||||||||||
resetInterval |
選擇性 timeSpan 屬性。 指定應用程式集區上 CPU 監視和節流限制) 分鐘 (重設期間。 當自上次進程會計重設以來經過的分鐘數等於此屬性所指定的數位時,IIS 會重設記錄和限制間隔的 CPU 計時器。 重要事項: resetInterval 值必須大於記錄作業之間的時間,否則 IIS 會在記錄發生之前重設計數器,而且不會發生進程會計。 注意: 由於 IIS 中的進程會計會使用 Windows 工作物件來監視整個進程的 CPU 時間,因此進程會計只會記錄和節流在個別進程中與 IIS 隔離的應用程式。 預設值是 00:05:00。 |
||||||||||
smpAffinitized |
選擇性的 Boolean 屬性。 指定是否也應該將指派給應用程式集區的特定背景工作進程指派給指定的 CPU。 這個屬性會與 smpProcessorAffinityMask 和 smpProcessorAffinityMask2 屬性搭配使用。 預設值是 false。 |
||||||||||
smpProcessorAffinityMask |
選擇性 uint 屬性。 指定多處理器電腦的十六進位處理器遮罩,指出應用程式集區中背景工作進程應該系結至哪個 CPU。 在此屬性生效之前,必須針對應用程式集區將 smpAffinitized 屬性設定為 true 。 注意: 在 64 位電腦上, smpProcessorAffinityMask 屬性包含處理器遮罩的低序 DWORD, 而 smpProcessorAffinityMask2 屬性包含處理器遮罩的高階 DWORD。 在 32 位電腦上, smpProcessorAffinityMask2 屬性沒有任何作用。 如果您將值設定為 1 (,其對應至二進位) 中的00000000000000001,則應用程式集區中的背景工作進程只會在第一個處理器上執行。 如果您將值設定為 2 (,其對應至二進位) 中的0000000000000010,背景工作進程只會在第二個處理器上執行。 如果您將值設定為 3 (,對應至二進位0000000000000011) 背景工作進程會在第一個和第二個處理器上執行。 注意: 請勿將此屬性設定為 0。 這麼做會停用對稱式多處理 (SMP) 親和性,並建立錯誤狀況。 這表示在一個 CPU 上執行的進程不會維持在該 CPU 存留期的關聯性。 預設值是 4294967295。 |
||||||||||
smpProcessorAffinityMask2 |
選擇性 uint 屬性。 指定 64 位多處理器電腦的高階 DWORD 十六進位處理器遮罩,指出應用程式集區中背景工作進程應該系結至哪個 CPU。 在此屬性生效之前,必須針對應用程式集區將 smpAffinitized 屬性設定為 true 。 注意: 在 64 位電腦上, smpProcessorAffinityMask 屬性包含處理器遮罩的低序 DWORD, 而 smpProcessorAffinityMask2 屬性包含處理器遮罩的高階 DWORD。 在 32 位電腦上, smpProcessorAffinityMask2 屬性沒有任何作用。 預設值是 4294967295。 |
子元素
無。
組態範例
下列組態範例會設定名為 DefaultAppPool 的單一應用程式集區,並將 CPU 設定為 50%,並執行動作來終止重設間隔為 10 分鐘的背景工作進程。
<applicationPools>
<add name="DefaultAppPool">
<cpu limit="50000" action="KillW3wp" resetInterval="00:10:00" />
</add>
<applicationPoolDefaults>
<processModel identityType="NetworkService" />
</applicationPoolDefaults>
</applicationPools>
範例程式碼
下列程式碼範例會將預設應用程式集區設定為在超過 CPU 限制時終止背景工作進程,並將重設間隔設定為四分鐘。
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