アプリケーション プールの CPU 設定 <cpu>
概要
<applicationPools>
コレクション内の <add>
要素の <cpu>
要素は、アプリケーション プールで使用される CPU 使用率のパラメーターと CPU アクションの値を構成します。
NUMA サポート
Non-Uniform Memory Access (NUMA) は、プロセッサをそれら独自の専用メモリに関連付けるハードウェア ベースの方法です。 NUMA は、マルチプロセッサ サポート用の従来の対称型マルチプロセッサ (SMP) モデルの代わりとして、プロセッサ速度を向上させるために使用されます。 IIS 8 以降を設定して、NUMA でそのプロセスを分散させて関連付けすることができます。 NUMA の使用は CPU 要素で構成され、numaNodeAssignment 属性では、IIS ワーカー プロセスの開始時に IIS によって最適な NUMA ノードを識別でき、numaNodeAffinityMode 属性では、IIS ワーカー プロセスからのスレッドを NUMA ノードに関連付ける方法が決定されます。 また、NUMA は processModel 要素の MaxProcesses 属性を使用して構成されます。これを 0
に設定すると、NUMA ノードと同じ数のワーカー プロセスが IIS で自動的に実行されるように指定されます。 詳細については、「NUMA ハードウェアでの IIS 8.0 マルチコア スケーリング」を参照してください。
NUMA 選択ロジックとアフィニティの種類は、IIS が NUMA ハードウェアで実行されている場合にのみ、[詳細設定] ダイアログ ボックスで設定できます。
互換性
バージョン | メモ |
---|---|
IIS 10.0 | <cpu> 要素は、IIS 10.0 では変更されませんでした。 |
IIS 8.5 | <cpu> 要素は、IIS 8.5 では変更されませんでした。 |
IIS 8.0 | 調整動作を定義するために、action 属性に 2 つの列挙値が追加されました。 使用するプロセッサ グループの数を定義するために、processorGroup 属性が追加されました。 NUMA ノードの動作を指定するために、numaNodeAssignment 属性と numaNodeAffinityMode 属性が追加されました。 |
IIS 7.5 | <cpu> 要素は、IIS 7.5 では変更されませんでした。 |
IIS 7.0 | <cpu> 要素が IIS 7.0 で導入されました。 |
IIS 6.0 | <cpu> 要素は、IIS 6.0 の IIsApplicationPools メタベース プロパティの一部を置き換えます。 |
段取り
<applicationPools>
コレクションは、IIS 7 以降の既定のインストールに含まれています。
操作方法
CPU 構成設定を編集する方法
インターネット インフォメーション サービス (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) マネージャー] をダブルクリックします。
[接続] ウィンドウで、サーバー名を展開し、[アプリケーション プール] をクリックし、編集するアプリケーション プールをクリックします。
[操作] ウィンドウの [詳細設定...] をクリックします。
[詳細設定] ダイアログ ボックスで、編集する CPU プロパティをクリックし、ダイアログ ボックスのプロパティ値セクションの値を編集して [OK] をクリックします。 たとえば、[制限動作] を、[NoAction]、[KillW3wp]、[Throttle]、または [ThrottleUnderLoad] に変更できます。
Non-Uniform Memory Access (NUMA) ハードウェアで使用するように IIS を構成する方法
タスク バーで、[サーバー マネージャー] を選択し、[ツール]、[インターネット インフォメーション サービス (IIS) マネージャー] の順に選択します。
[接続] ウィンドウでサーバー名を展開し、[アプリケーション プール] をクリックします。
[アプリケーション プール] ウィンドウで、NUMA 用に構成するプールを選択します。
[アクション] ウィンドウで、[詳細設定] を選びます。
[プロセス モデル] で、[最大ワーカー プロセス数] を
0
に設定します。[CPU] で、[processorGroup]、[numaNodeAffinityMode]、および [numaNodeAssignment] を設定します。
OK をクリックします。
構成
属性
属性 | 説明 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
action |
省略可能な列挙型属性。 ワーカー プロセスが構成済みの CPU の制限を超えたときに IIS で実行されるアクションを構成します。 action 属性は、アプリケーション プールごとに構成されます。 action 属性には、次のいずれかの値を指定できます。 既定値は NoAction です。
|
||||||||||
limit |
省略可能な uint 属性。 resetInterval 属性によって指定された一定時間にアプリケーション プールのワーカー プロセスが消費できる CPU 時間の最大の割合 (1% の 1000 分の 1 単位) を構成します。 limit 属性によって設定された制限を超えると、イベントがイベント ログに書き込まれ、オプションのイベント セットをトリガーできます。 これらの省略可能なイベントは、action 属性によって決定されます。 注: IIS 8.5 以降では、IIS マネージャーの [CPU] ウィンドウで limit をパーセント単位で設定します。 IIS 8.0 では、IIS マネージャーの [CPU] ウィンドウで、 limit を 1% の 1000 分の 1 単位で設定します。 どちらの場合も、applicationHost.config の limit 属性は、1% の 1000 分の 1 単位になります。 既定値は 0 で、このとき CPU の制限は無効になります。 |
||||||||||
numaNodeAffinityMode |
省略可能な列挙型属性。 NUMA ノードにアフィニタイズされたプロセスのスレッドを、ノードのコアでスケジュールする方法を指定します。 numaNodeAffinityMode 属性には、次のいずれかの値を指定できます。 既定値は Soft です。
|
||||||||||
numaNodeAssignment |
省略可能な列挙型属性。 プロセスを関連付ける NUMA (Non-Uniform Memory Access) ノードを IIS で決定する方法を指定します。 NUMA ノードには、1 つのメモリ バンクを共有するコアのクラスターが含まれています。 この属性は、NUMA ノードが使用可能な場合にのみ、CPU の詳細設定で使用できます。 numaNodeAssignment 属性には、次のいずれかの値を指定できます。 既定値は Most Available Memory です。
|
||||||||||
processorGroup |
省略可能な int 属性。 使用されるプロセッサ グループの数 (0 から始まる)。 プロセッサ グループには複数のコアが含まれています。 プロセッサ グループ属性は、サーバーに複数のプロセッサ グループがある場合にのみ CPU 詳細設定で使用できます。 既定値は 0 です。つまり、1 つのプロセッサ グループが使用されることを意味します。 |
||||||||||
resetInterval |
省略可能な timeSpan 属性。 アプリケーション プールに関する CPU の監視と調整の制限のリセット期間 (分単位) を指定します。 最後のプロセス アカウンティング リセットから経過した分数が、このプロパティで指定された数に等しい場合、IIS ではログ記録間隔と制限間隔の両方の CPU タイマーがリセットされます。 重要: resetInterval の値は、ログ記録操作の間隔よりも大きくする必要があります。そうしないと、IIS ではログ記録を行う前にカウンターがリセットされ、プロセス アカウンティングが行われません。 注: IIS のプロセス アカウンティングでは Windows ジョブ オブジェクトを使用してプロセス全体の CPU 時間を監視するため、プロセス アカウンティングでは、IIS とは別のプロセスに分離されたアプリケーションのみがログに記録されて調整されます。 既定値は 00:05:00 です。 |
||||||||||
smpAffinitized |
省略可能な Boolean 属性です。 アプリケーション プールに割り当てられた特定のワーカー プロセスを、特定の CPU にも割り当てる必要があるかどうかを指定します。 このプロパティは、smpProcessorAffinityMask および smpProcessorAffinityMask2 属性と共に使用されます。 既定値は false です。 |
||||||||||
smpProcessorAffinityMask |
省略可能な uint 属性。 マルチプロセッサ コンピューターの 16 進数プロセッサ マスクを指定し、これは、アプリケーション プール内のワーカー プロセスがバインドされる CPU を示します。 このプロパティが有効になる前に、アプリケーション プールの smpAffinitized 属性を true に設定する必要があります。 注: 64 ビット コンピューターでは、smpProcessorAffinityMask 属性にはプロセッサ マスクの下位 DWORD が含まれており、smpProcessorAffinityMask2 属性にはプロセッサ マスクの上位 DWORD が含まれています。 32 ビット コンピューターでは、smpProcessorAffinityMask2 属性は効果はありません。 値を 1 に設定すると (バイナリの 00000000000000001 に対応)、アプリケーション プール内のワーカー プロセスは、最初のプロセッサでのみ実行されます。 値を 2 に設定すると (バイナリの 0000000000000010 に対応)、ワーカー プロセスは、2 番目のプロセッサでのみ実行されます。 値を 3 に設定すると (バイナリの 0000000000000011 に対応)、ワーカー プロセスは、1 番目と 2 番目の両方のプロセッサで実行されます。 注: このプロパティを 0 に設定しないでください。 これにより、対称型マルチプロセッシング (SMP) アフィニティが無効になり、エラー条件が作成されます。 つまり、1 つの CPU で実行されているプロセスは、有効期間を通じてその CPU に関連付けられたままにならないことを意味します。 既定値は 4294967295 です。 |
||||||||||
smpProcessorAffinityMask2 |
省略可能な uint 属性。 64 ビット マルチプロセッサ コンピューターの上位 DWORD 16 進数プロセッサ マスクを指定し、これは、アプリケーション プール内のワーカー プロセスがバインドされる CPU を示します。 このプロパティが有効になる前に、アプリケーション プールの smpAffinitized 属性を true に設定する必要があります。 注: 64 ビット コンピューターでは、smpProcessorAffinityMask 属性にはプロセッサ マスクの下位 DWORD が含まれており、smpProcessorAffinityMask2 属性にはプロセッサ マスクの上位 DWORD が含まれています。 32 ビット コンピューターでは、smpProcessorAffinityMask2 属性は効果はありません。 既定値は 4294967295 です。 |
子要素
なし。
構成サンプル
次の構成サンプルでは、DefaultAppPool という名前の 1 つのアプリケーション プールを構成し、CPU を 50% に設定し、10 分のリセット間隔で、ワーカー プロセスを強制終了するアクションを指定します。
<applicationPools>
<add name="DefaultAppPool">
<cpu limit="50000" action="KillW3wp" resetInterval="00:10:00" />
</add>
<applicationPoolDefaults>
<processModel identityType="NetworkService" />
</applicationPoolDefaults>
</applicationPools>
サンプル コード
次のコード サンプルでは、CPU の制限を超えたときにワーカー プロセスを強制終了するように既定のアプリケーション プールを構成し、リセット間隔を 4 分に構成します。
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
Note
AppCmd.exe を使用してこれらの設定を構成するときは、commit パラメーターを必ず 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