アプリケーション プールの CPU 設定 <cpu>

  • 概要
  • 互換性
  • セットアップ
  • 方法
  • 構成
  • サンプル コード

※本ページに挿入されている画像をクリックすると、画像全体が別ウィンドウで表示されます。

概要

<applicationPools> コレクション内の <add> 要素の <cpu> 要素は、アプリケーション プールで使用される CPU 使用率パラメーターと CPU 処理の値を構成します。

互換性

  IIS 7.0 IIS 6.0
注意 <cpu> は IIS 7.0 で新たに導入された要素です。

<cpu> 要素は、IIS 6.0 の IIsApplicationPools メタベース プロパティの一部に代わるものです。

セットアップ

<applicationPools> コレクションは、IIS 7.0 の既定のインストールに含まれています。

方法

ラピッド フェール保護構成設定の編集方法

  1. タスク バーで [スタート] ボタンをクリックし、[管理ツール] をポイントして [インターネット インフォメーション サービス (IIS) マネージャー] をクリックします。

  2. [接続] ウィンドウで当該サーバー名を展開して [アプリケーション プール] をクリックし、編集するアプリケーション プールをクリックします。

    拡大

  3. [操作] ウィンドウで [詳細設定] をクリックします。

  4. [詳細設定] ダイアログ ボックスで、編集する CPU プロパティをクリックし、ダイアログ ボックスのプロパティ値のセクションで値を編集して、[OK] をクリックします。たとえば、[制限動作][NoAction] または [KillW3wp] に変更できます。

    拡大

構成

属性

属性 説明
action オプションの enum 属性。

構成された CPU の制限をワーカー プロセスが超えたときに実行される IIS の処理を構成します。action 属性の構成はアプリケーション プールごとに行います。

action 属性には、次のいずれかの値を指定できます。既定値は NoAction です。



--------------------------------------------------------------------------------------------------

値: KillW3wp

説明:

  • CPU の制限を超えたアプリケーション プールのワーカー プロセスは強制的にシャットダウンされます。
  • 数値は 1 です。

値: NoAction

説明:

  • CPU の制限を超えても何も処理は行われません。警告がイベント ログに書き込まれます。
  • 数値は 0 です。
limit オプションの uint 属性。

resetInterval 属性で指定された期間中にアプリケーション プールのワーカー プロセスが消費できる CPU 時間の最大割合 (1/1000 パーセント単位) を構成します。limit 属性で設定された制限を超えた場合、イベントがイベント ログに書き込まれます。また、オプションのイベント セットがトリガーされるように指定できます。これらのオプションのイベントは、action 属性で決定します。

既定値は 0 で、CPU 制限は無効になります。

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 (2 進法で 00000000000000001 に相当) に設定した場合、アプリケーション プールのワーカー プロセスは、1 番目のプロセッサでのみ実行されます。値を 2 (2 進法で 0000000000000010 に相当) に設定した場合、ワーカー プロセスは、2 番目のプロセッサでのみ実行されます。値を 3 (2 進法で 0000000000000011 に相当) に設定した場合、ワーカー プロセスは、1 番目と 2 番目の両方のプロセッサで実行されます。

: このプロパティを 0 に設定しないでください。0 に設定すると、対称型マルチプロセッシング (SMP) アフィニティが無効になり、エラー状況が発生します。つまり、ある 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

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 value = Null Then
               value = CStr(value)
            End If
            If Not value = 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