Bagikan melalui


Pengaturan CPU untuk cpu Kumpulan <Aplikasi>

Gambaran Umum

Elemen <cpu><add> elemen dalam <applicationPools> koleksi mengonfigurasi nilai untuk parameter penggunaan CPU dan tindakan CPU yang akan digunakan dalam kumpulan aplikasi.

Dukungan NUMA

Akses Memori Non-Seragam (NUMA) adalah metode berbasis perangkat keras untuk mengaitkan prosesor ke memori khusus mereka sendiri. NUMA digunakan untuk meningkatkan kecepatan prosesor sebagai alternatif dari model multiprosesor simetris (SMP) tradisional untuk dukungan multiprosesor. Anda dapat mengatur IIS 8 dan yang lebih baru untuk mendistribusikan dan mengafinisikan prosesnya di NUMA. Penggunaan NUMA dikonfigurasi dalam elemen CPU oleh atribut numaNodeAssignment yang memungkinkan IIS mengidentifikasi simpul NUMA yang paling optimal ketika proses pekerja IIS akan dimulai, dan atribut numaNodeAffinityMode yang menentukan bagaimana utas dari proses pekerja IIS diafinitisasi ke simpul NUMA. NUMA juga dikonfigurasi menggunakan atribut MaxProcesses dari elemen processModel, yang ketika diatur ke 0 menentukan bahwa IIS secara otomatis menjalankan jumlah proses pekerja yang sama karena ada simpul NUMA. Untuk informasi selengkapnya, lihat Penskalaan Multicore IIS 8.0 pada Perangkat Keras NUMA.

Logika pemilihan NUMA dan jenis afinitas dapat diatur dalam kotak dialog Pengaturan Tingkat Lanjut hanya jika IIS berjalan pada perangkat keras NUMA.

Kompatibilitas

Versi Catatan
IIS 10.0 Elemen <cpu> tidak dimodifikasi di IIS 10.0.
IIS 8.5 Elemen <cpu> tidak dimodifikasi di IIS 8.5.
IIS 8.0 Dua nilai enum ditambahkan ke action atribut untuk menentukan perilaku pembatasan. Atribut processorGroup ditambahkan untuk menentukan jumlah grup prosesor yang digunakan. Atribut numaNodeAssignment dan numaNodeAffinityMode ditambahkan untuk menentukan perilaku simpul NUMA.
IIS 7.5 Elemen <cpu> tidak dimodifikasi dalam IIS 7.5.
IIS 7.0 Elemen <cpu> ini diperkenalkan di IIS 7.0.
IIS 6.0 Elemen menggantikan <cpu> bagian dari properti metabase IIS 6.0 IIsApplicationPools .

Siapkan

Koleksi <applicationPools> disertakan dalam penginstalan default IIS 7 dan yang lebih baru.

Bagaimana Caranya

Cara mengedit pengaturan konfigurasi CPU

  1. Buka Manajer Layanan Informasi Internet (IIS):

    • Jika Anda menggunakan Windows Server 2012 atau Windows Server 2012 R2:

      • Pada bilah tugas, klik Manajer Server, klik Alat, lalu klik Manajer Layanan Informasi Internet (IIS).
    • Jika Anda menggunakan Windows 8 atau Windows 8.1:

      • Tahan tombol Windows, tekan huruf X, lalu klik Panel Kontrol.
      • Klik Alat Administratif, lalu klik dua kali Manajer Layanan Informasi Internet (IIS).
    • Jika Anda menggunakan Windows Server 2008 atau Windows Server 2008 R2:

      • Pada taskbar, klik Mulai, arahkan ke Alat Administratif, lalu klik Manajer Layanan Informasi Internet (IIS).
    • Jika Anda menggunakan Windows Vista atau Windows 7:

      • Pada taskbar, klik Mulai, lalu klik Panel Kontrol.
      • Klik dua kali Alat Administratif, lalu klik dua kali Manajer Layanan Informasi Internet (IIS).
  2. Di panel Koneksi , perluas nama server, klik Kumpulan Aplikasi, lalu klik kumpulan aplikasi yang ingin Anda edit.
    Cuplikan layar Kumpulan Aplikasi yang terisi dari panel Koneksi.

  3. Di panel Tindakan , klik Pengaturan Tingkat Lanjut...

  4. Dalam kotak dialog Pengaturan Tingkat Lanjut , klik properti CPU yang ingin Anda edit, lalu edit nilai di bagian nilai properti dari kotak dialog, lalu klik OK. Misalnya, Anda dapat mengubah Limit Action menjadi NoAction, KillW3wp, Throttle, atau ThrottleUnderLoad.
    Cuplikan layar bagian Pembatasan di Bawah Muat kotak dialog Pengaturan Tingkat Lanjut.

Cara mengonfigurasi IIS untuk digunakan dengan perangkat keras Non-Uniform Memory Access (NUMA)

  1. Pada bilah tugas, klik Manajer Server, klik Alat, lalu klik Manajer Layanan Informasi Internet (IIS).

  2. Di panel Koneksi , perluas nama server, lalu klik Kumpulan Aplikasi.

  3. Di panel Kumpulan Aplikasi , pilih kumpulan yang ingin Anda konfigurasi untuk NUMA.

  4. Di panel Tindakan , pilih Pengaturan Tingkat Lanjut.

  5. Di bawah Model Proses, atur Proses Pekerja Maksimum ke 0.

    Cuplikan layar bagian Model Proses dengan bidang Proses Pekerja Maksimum diatur ke 0.

  6. Di bawah CPU, atur processorGroup, numaNodeAffinityMode, dan numaNodeAssignment.

  7. Klik OK.

Konfigurasi

Atribut

Atribut Deskripsi
action Atribut enum opsional. Mengonfigurasi tindakan yang dilakukan IIS saat proses pekerja melebihi batas CPU yang dikonfigurasi. Atribut tindakan dikonfigurasi berdasarkan kumpulan per aplikasi.

Atribut tindakan dapat menjadi salah satu nilai yang mungkin berikut ini. Nilai defaultnya adalah NoAction.

Nilai Deskripsi
NoAction Tidak ada tindakan yang diambil ketika batas CPU terlampaui. Peringatan ditulis ke log peristiwa.

Nilai numerik adalah 0.

KillW3wp Proses pekerja kumpulan aplikasi yang melebihi batas CPU mereka akan dipaksa untuk dimatikan.

Nilai numerik adalah 1.

Throttle Konsumsi CPU terbatas pada nilai yang ditetapkan dalam Batas. Interval Batas tidak digunakan dan entri log peristiwa dihasilkan.

Nilai numerik adalah 2.

ThrottleUnderLoad Konsumsi CPU hanya terbatas ketika ada ketidakcocokan pada CPU. Interval Batas tidak digunakan dan entri log peristiwa dihasilkan.

Nilai numerik adalah 3.

limit Atribut uint opsional. Mengonfigurasi persentase maksimum waktu CPU (dalam 1/1000 persen) yang diproses pekerja dalam kumpulan aplikasi diizinkan untuk digunakan selama jangka waktu tertentu seperti yang ditunjukkan oleh atribut resetInterval. Jika batas yang ditetapkan oleh atribut batas terlampaui, peristiwa ditulis ke log peristiwa dan serangkaian peristiwa opsional dapat dipicu. Peristiwa opsional ini ditentukan oleh atribut tindakan.

Catatan: Di IIS 8.5 ke atas, tetapkan batas dalam persen di panel CPU IIS Manager. Di IIS 8.0, tetapkan batas dalam 1/1000 persen di panel CPU Manajer IIS. Untuk kedua kasus, limit atribut dalam applicationHost.config berada di 1/1000ths dari satu persen.

Nilai defaultnya adalah 0, yang menonaktifkan pembatasan CPU.
numaNodeAffinityMode Atribut enum opsional. Menentukan bagaimana utas proses yang diafinisiskan ke simpul NUMA akan dijadwalkan pada inti simpul.

Atribut numaNodeAffinityMode dapat menjadi salah satu nilai yang mungkin berikut. Nilai defaultnya adalah Soft.

Nilai Deskripsi
Soft Selama inti dalam node NUMA tempat proses diafinitisasi tersedia, semua utas proses akan dijadwalkan pada inti tersebut. Namun, jika penjadwal tidak dapat menjadwalkan proses pada inti simpul yang diafinitisasi, penjadwal dapat menjadwalkan proses pada inti di simpul NUMA lain.

Nilai numerik adalah 0.

Hard Setiap utas proses yang ditefinisikan ke simpul NUMA akan dijadwalkan pada inti simpul dan hanya inti tersebut. Tidak ada utas proses tersebut yang akan dijadwalkan pada inti di simpul NUMA lain.

Nilai numerik adalah 1.

numaNodeAssignment Atribut enum opsional. Menentukan bagaimana IIS akan menentukan simpul NUMA (akses memori non-seragam) mana yang akan diafinisiskan prosesnya. Simpul NUMA berisi kluster inti yang berbagi satu bank memori. Atribut ini tersedia di Pengaturan Tingkat Lanjut CPU hanya jika simpul NUMA tersedia.

Atribut numaNodeAssignment dapat menjadi salah satu nilai yang mungkin berikut. Nilai defaultnya adalah Most Available Memory.

Nilai Deskripsi
Most Available Memory Proses ini akan ditetapkan ke simpul NUMA yang memiliki memori bebas paling banyak.

Nilai numerik adalah 0.

Windows Scheduling Penjadwalan Windows akan menentukan simpul NUMA mana yang ditetapkan prosesnya.

Nilai numerik adalah 1.

processorGroup Atribut int opsional. Jumlah grup prosesor yang digunakan (berbasis nol). Grup prosesor berisi beberapa inti. Atribut Grup Prosesor tersedia di Pengaturan Tingkat Lanjut CPU hanya jika server memiliki beberapa grup prosesor.

Nilai defaultnya adalah 0, yang berarti bahwa satu grup prosesor digunakan.
resetInterval Atribut timeSpan opsional. Menentukan periode reset (dalam menit) untuk batas pemantauan dan pembatasan CPU pada kumpulan aplikasi. Ketika jumlah menit berlalu sejak proses terakhir akuntansi direset sama dengan angka yang ditentukan oleh properti ini, IIS mengatur ulang timer CPU untuk interval pengelogan dan batas.

Penting: Nilai resetInterval harus lebih besar dari waktu antara operasi pengelogan, jika tidak, IIS akan mengatur ulang penghitung sebelum pengelogan terjadi, dan akuntansi proses tidak akan terjadi.

Catatan: Karena akuntansi proses di IIS menggunakan objek pekerjaan Windows untuk memantau waktu CPU untuk seluruh proses, akuntansi proses hanya akan mencatat dan membatasi aplikasi yang terisolasi dalam proses terpisah dari IIS.

Nilai defaultnya adalah 00:05:00.
smpAffinitized Atribut Boolean opsional. Menentukan apakah proses pekerja tertentu yang ditetapkan ke kumpulan aplikasi juga harus ditetapkan ke CPU tertentu. Properti ini digunakan bersama dengan atribut smpProcessorAffinityMask dan smpProcessorAffinityMask2 .

Nilai defaultnya adalah false.
smpProcessorAffinityMask Atribut uint opsional. Menentukan masker prosesor heksadesimal untuk komputer multi-prosesor, yang menunjukkan ke CPU mana proses pekerja dalam kumpulan aplikasi harus terikat. Sebelum properti ini berlaku, atribut smpAffinitized harus diatur ke true untuk kumpulan aplikasi.

Catatan: Pada komputer 64-bit, atribut smpProcessorAffinityMask berisi DWORD berurutan rendah untuk masker prosesor, dan atribut smpProcessorAffinityMask2 berisi DWORD pesanan tinggi untuk masker prosesor. Pada komputer 32-bit, atribut smpProcessorAffinityMask2 tidak berpengaruh.

Jika Anda mengatur nilai ke 1 (yang sesuai dengan 00000000000000001 dalam biner), proses pekerja dalam kumpulan aplikasi hanya berjalan pada prosesor pertama. Jika Anda mengatur nilai ke 2 (yang sesuai dengan 0000000000000010 dalam biner), proses pekerja hanya berjalan pada prosesor kedua. Jika Anda mengatur nilai ke 3 (yang sesuai dengan 0000000000000011 dalam biner), proses pekerja berjalan pada prosesor pertama dan kedua.

Catatan: Jangan atur properti ini ke 0. Melakukannya menonaktifkan afinitas multiproscessing simetris (SMP) dan membuat kondisi kesalahan. Ini berarti bahwa proses yang berjalan pada satu CPU tidak akan tetap berafiliasi dengan CPU tersebut sepanjang masa pakainya.

Nilai defaultnya adalah 4294967295.
smpProcessorAffinityMask2 Atribut uint opsional. Menentukan masker prosesor heksadesimal DWORD berurutan tinggi untuk komputer multi-prosesor 64-bit, yang menunjukkan CPU mana yang harus diproses pekerja dalam kumpulan aplikasi. Sebelum properti ini berlaku, atribut smpAffinitized harus diatur ke true untuk kumpulan aplikasi.

Catatan: Pada komputer 64-bit, atribut smpProcessorAffinityMask berisi DWORD berurutan rendah untuk masker prosesor, dan atribut smpProcessorAffinityMask2 berisi DWORD pesanan tinggi untuk masker prosesor. Pada komputer 32-bit, atribut smpProcessorAffinityMask2 tidak berpengaruh.

Nilai defaultnya adalah 4294967295.

Elemen Anak

Tidak ada.

Sampel Konfigurasi

Sampel konfigurasi berikut mengonfigurasi satu kumpulan aplikasi bernama DefaultAppPool dan mengatur CPU menjadi 50%, dengan tindakan untuk mematikan proses pekerja dengan interval reset 10 menit.

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

Kode Sampel

Sampel kode berikut mengonfigurasi kumpulan aplikasi default untuk menghentikan proses pekerja ketika melebihi batas CPU, dan mengonfigurasi interval reset menjadi empat menit.

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

Catatan

Anda harus memastikan untuk mengatur parameter penerapan ke apphost saat Anda menggunakan AppCmd.exe untuk mengonfigurasi pengaturan ini. Ini menerapkan pengaturan konfigurasi ke bagian lokasi yang sesuai dalam file 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