Mengelola Proses Pekerja dan AppDomain di IIS 7 dengan WMI

oleh Tim Ammann

Pembuatan skrip WMI memungkinkan Anda mengelola proses pekerja dan domain aplikasi (AppDomains) di IIS dengan relatif mudah. Proses pekerja IIS diluncurkan oleh Layanan Aktivasi Proses Windows (WAS) dan dijalankan oleh W3wp.exe. Proses pekerja dapat berisi AppDomain yang biasanya dibuat sebagai respons terhadap permintaan halaman .aspx.

Artikel ini menjelaskan cara menyelesaikannya, hanya dengan beberapa baris VBScript, tugas-tugas berikut:

  • Melihat permintaan yang sedang dijalankan untuk proses pekerja
  • Mendapatkan status semua proses pekerja
  • Membongkar AppDomain tertentu atau semua AppDomain
  • Menampilkan semua AppDomain dan propertinya

Langkah Pertama

  1. Pastikan IIS dan pembuatan skrip diaktifkan.

    a. Jika Anda menggunakan Windows Vista, buka Panel Kontrol, Program dan Fitur, lalu Fitur Windows. Di bagian "Alat Manajemen Web", pilih "Skrip dan Alat Manajemen IIS" untuk mengaktifkan skrip. b. Jika Anda menggunakan Windows ServerĀ® 2008, buka Manajer Server. Gunakan Wizard Tambahkan Peran untuk menginstal server Web IIS. Pada halaman Pilih Layanan Peran, di bagian Alat Manajemen, pilih "Skrip dan Alat Manajemen IIS."

  2. Jalankan perintah sebagai administrator. Untuk membuka jendela Prompt Perintah yang ditinggikan, klik Mulai, arahkan ke Semua Program, klik Aksesori, klik kanan Prompt Perintah, lalu klik Jalankan sebagai administrator. Jika Anda membuka shell perintah sebagai administrator, semua aplikasi yang Anda jalankan dari shell perintah tersebut akan berjalan sebagai administrator.

  3. Simpan file skrip dalam format teks dengan ekstensi .vbs. Mereka dapat dijalankan pada prompt perintah dengan menggunakan sintaks "cscript.exe <scriptname.vbs>".

  4. Sebelum memulai, buat cadangan file System32\inetsrv\config\applicationhost.config dengan alat AppCmd. Salinan cadangan akan memungkinkan Anda memulihkan IIS ke keadaan semula hanya dengan menyalin versi asli di kemudian hari. Untuk membuat cadangan, ikuti langkah-langkah berikut:

    a. Buka jendela Prompt Perintah yang ditingkatkan.
    b. Ketik cd %Windir%\system32\inetsrv\ c.Type appcmd tambahkan backupName untuk mencadangkan file ApplicationHost.config, di mana backupName adalah nama yang Anda tentukan untuk cadangan. Direktori dengan nama cadangan yang Anda tentukan akan dibuat di %Windir%\system32\inetsrv\backup bawah direktori. Jika Anda tidak menentukan nama, appcmd akan menghasilkan nama direktori secara otomatis menggunakan tanggal dan waktu saat ini.

Proses Pekerja

Bagian ini memperlihatkan kepada Anda cara mengambil permintaan yang sedang dijalankan untuk setiap proses pekerja di server Web. Anda kemudian mempelajari cara menampilkan PID proses setiap pekerja, status, dan kumpulan aplikasi tempatnya berada.

Dapatkan Permintaan Eksekusi

Salah satu fitur baru IIS yang menarik adalah kemampuan untuk melihat permintaan yang saat ini dijalankan dalam proses pekerja. Anda dapat melakukan ini dengan metode WorkerProcess.GetExecutingRequests.

Metode WorkerProcess.GetExecutingRequests melaporkan dalam rekam jepret dengan cara permintaan yang dijalankan pada saat metode dijalankan. Karena sebagian besar permintaan dijalankan dengan sangat cepat, mungkin tidak mudah bagi Anda untuk menguji metode secara manual dengan browser Web. Untuk alasan ini, Anda akan membuat halaman Web hanya untuk tujuan ini.

Gunakan notepad untuk memasukkan teks berikut ke dalam file teks. Kemudian, simpan file dengan menggunakan nama Sleep.aspx.

<%  System.Threading.Thread.Sleep(30000)
Response.Write ("I'm finally finished...") %>

Letakkan file Sleep.aspx di direktori konten situs Web default: %systemdrive%\inetpub\wwwroot.

File Sleep.aspx yang Anda buat memaksa permintaan halaman Web memakan waktu 30 detik untuk dijalankan. Ini akan memberi Anda waktu untuk menjalankan skrip yang akan menampilkan GetExecutingRequests dalam tindakan.

Metode GetExecutingRequests mengambil variabel array kosong sebagai parameter OUT, yang kemudian diisi dengan objek HttpRequest. Anda dapat melakukan iterasi melalui permintaan ini untuk menampilkan atribut untuk setiap permintaan. Skrip berikut mengambil output objek HttpRequest dan menampilkan modul, kata kerja, nama host, dan URL saat ini untuk setiap permintaan.

Salin skrip berikut ke notepad dan simpan dengan nama file GetRequests.vbs.

Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
Set oWorkerProcesses = oWebAdmin.InstancesOf("WorkerProcess")
     
For Each oWorkerProcess In oWorkerProcesses
    ' Place the requests queued for a process into an array variable.
    oWorkerProcess.GetExecutingRequests arrReqs
    
    ' Show the number of requests queued.
    If IsNull(arrReqs) Then
        WScript.Echo "No currently executing requests."

    Else
        ' Display the number of requests.
        WScript.Echo "Number of currently executing requests: " & _
            UBound(arrReqs) + 1
        WScript.Echo
  
        ' List the properties of each request.
        For Each oRequest In arrReqs
            WScript.Echo "Module: " & "[" & oRequest.CurrentModule & "]"
            WScript.Echo "Verb:" & "[" & oRequest.Verb & "]"
            WScript.Echo "HostName: " & "[" & oRequest.HostName & "]"
            WScript.Echo "Url: " & "[" & oRequest.Url & "]"
            WScript.Echo
        Next
    End If
Next

Buka jendela prompt perintah yang ditingkatkan dan navigasikan ke direktori tempat Anda menyimpan file GetRequests.vbs.

Sebelum Anda menjalankan skrip, ketik http://localhost/sleep.aspx ke bilah alamat browser Web. Ini akan memulai eksekusi permintaan dan mengatur browser yang berputar selama 30 detik saat menunggu untuk merender halaman Sleep.aspx.

Saat browser masih menunggu untuk merender halaman, jalankan skrip dengan mengetik berikut ini di jendela prompt perintah yang baru saja Anda buka:

Cscript.exe GetRequests.vbs

Output sampel

Output yang Anda lihat akan menyerupai berikut ini.

Number of currently executing requests: 2
Module: [ManagedPipelineHandler]
Verb:[GET]
HostName: [localhost]
Url: [/MyApp/]
Module: [ManagedPipelineHandler]
Verb:[GET]
HostName: [localhost]
Url: [/MyApp/default.aspx]

Mendapatkan Status Proses Pekerja

Objek WorkerProcess di penyedia IIS WMI memiliki metode GetState yang mengungkapkan apakah proses pekerja dimulai, berjalan, atau berhenti. WorkerProcess juga memiliki dua properti yang menarik minat kami di sini: ApplicationPool dan PID. Properti ApplicationPool mewakili kumpulan aplikasi tempat proses pekerja berada. Properti PID berisi ID proses yang secara unik mengidentifikasi proses pekerja.

Anda dapat menggunakan kode berikut untuk mencantumkan setiap proses pekerja PID dan status, dan kumpulan aplikasinya. Jika tidak ada proses pekerja yang berjalan, skrip akan keluar secara diam-diam. Salin kode ke notepad dan simpan dengan nama file GetState.vbs.

' Connect to the WMI WebAdministration namespace. 
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration") 
       
' Get the worker process instances. 
Set oWorkerProcesses = oWebAdmin.InstancesOf("WorkerProcess") 
       
' Get the ID of each worker process in the application pool and report its status. 
For Each oWorkerProcess In oWorkerProcesses 
       
    ' Report the worker process state via the GetStateDescription helper function. 
    WScript.Echo "WorkerProcess " & oWorkerProcess.ProcessID & ": " & _ 
        GetStateDescription(oWorkerProcess.GetState) 
    WScript.Echo "Application Pool: " & oWorkerProcess.AppPoolName
    WScript.Echo 
Next 

' The helper function translates the return value into text. 
Function GetStateDescription(StateCode) 
    Select Case StateCode 
        Case 0 
            GetStateDescription = "Starting" 
        Case 1 
            GetStateDescription = "Running" 
        Case 2 
            GetStateDescription = "Stopping" 
        Case 3 
            GetStateDescription = "Unknown" 
       
        Case Else 
            GetStateDescription = "Undefined value." 
    End Select 
End Function

Buka jendela prompt perintah yang ditingkatkan dan navigasikan ke direktori tempat Anda menyimpan file GetState.vbs. Jalankan skrip dengan mengetik berikut ini di jendela prompt perintah yang baru saja Anda buka:

Cscript.exe GetState.vbs

Output sampel

Output Anda harus menyerupai ini:

WorkerProcess 1336: Running 
Application Pool: DefaultAppPool 
       
WorkerProcess 3680: Running 
Application Pool: Classic .NET AppPool 
       
WorkerProcess 1960: Running 
Application Pool: NewAppPool

Sekarang setelah Anda belajar menggunakan skrip WMI untuk mengungkapkan rahasia proses pekerja, lakukan hal yang sama untuk domain aplikasi.

AppDomains

Pertama kali permintaan untuk halaman ASP.NET diterima, modul mesin terkelola IIS membuat domain aplikasi (AppDomain) dalam memori. AppDomain memproses permintaan untuk halaman aspx, atau halaman apa pun yang menggunakan kode terkelola. Membongkar dan menghitung AppDomains dengan menggunakan WMI itu mudah, dan bagian ini menunjukkan kepada Anda cara melakukan keduanya.

Membongkar AppDomain Tertentu

Bongkar AppDomain di IIS 7 ke atas bekerja agak berbeda dari di IIS 6.0. Sedangkan perintah IIS 6.0 AppUnload membongkar aplikasi ASP di luar proses, metode AppDomain.Unload IIS 7 ke atas hanya membongkar domain aplikasi ASP.NET. Fungsionalitas AppUnload telah hilang karena mode kompatibilitas IIS 5.0 yang didukungnya tidak lagi ada di IIS 7 ke atas.

Untuk membongkar AppDomain tertentu, Anda harus dapat mengidentifikasinya secara unik. Objek AppDomain memiliki tiga properti utama: ApplicationPath, ID, dan SiteName. Namun, hanya salah satu dari ini mungkin cukup untuk tujuan Anda.

Kebetulan, properti ID AppDomain bukan angka, tetapi jalur yang terlihat seperti ini:

/LM/W3SVC/1/ROOT

"1" di jalur yang tercantum adalah ID Situs (secara default, 1 sesuai dengan situs Web default.) Jika Anda harus membuat daftar AppDomains server Anda dan propertinya terlebih dahulu, lihat bagian "Menghitung AppDomains" nanti di artikel ini.

Skrip berikutnya membongkar AppDomain yang disebut "Northwind." Skrip melakukan iterasi melalui AppDomains yang tersedia sampai menemukan yang memiliki ApplicationPath yang cocok. Salin kode ke notepad, ganti "Northwind" dengan jalur aplikasi AppDomain pilihan Anda, dan simpan file dengan nama AppDomainUnload.vbs.

Buka jendela prompt perintah yang ditingkatkan dan navigasikan ke direktori tempat Anda menyimpan file AppDomainUnload.vbs. Jalankan skrip dengan mengetik berikut ini di jendela prompt perintah yang baru saja Anda buka:

Cscript.exe AppDomainUnload.vbs
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
Set oAppDomains = oWebAdmin.ExecQuery("SELECT * FROM AppDomain")

' Unload only the Northwind application domain.
For Each oAppDomain In oAppDomains
    If oAppDomain.ApplicationPath = "/Northwind/" Then 
        oAppDomain.Unload
        Exit For 
    End If 
Next

Membongkar Semua AppDomain

Membongkar semua AppDomain di server bahkan lebih mudah: Anda cukup mengambilnya, melakukan iterasi melaluinya, dan membongkar masing-masing secara bergiliran.

Contoh berikut membongkar semua domain aplikasi di server Web IIS. Perhatikan bagaimana kueri WQL sederhana (WQL adalah versi SQL WMI) digunakan untuk mengambil AppDomains.

Salin kode ke notepad dan simpan file dengan nama AppDomainUnloadAll.vbs. Buka jendela prompt perintah yang ditingkatkan dan navigasikan ke direktori tempat Anda menyimpan file AppDomainUnloadAll.vbs. Jalankan skrip dengan mengetik berikut ini di jendela prompt perintah yang baru saja Anda buka:

Cscript.exe AppDomainUnloadAll.vbs
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")

' Get all the application domains on the Web server.
Set oAppDomains = oWebAdmin.ExecQuery("SELECT * FROM AppDomain")

' Unload all the application domains.
For Each oAppDomain In oAppDomains
    oAppDomain.Unload
Next

Sebagai alternatif untuk sintaks kueri WQL, Anda dapat menggunakan metode WMI InstancesOf, seperti yang Anda lakukan sebelumnya dengan WorkerProcess:

Set oAppDomains = oWebAdmin.InstancesOf("AppDomain")

Menghitung AppDomains

Anda dapat menampilkan semua AppDomain yang sedang berjalan dan propertinya dengan menggunakan pendekatan yang mirip dengan skrip sebelumnya. Berikut adalah daftar properti AppDomain:

  • ApplicationPath
  • Id
  • IsIdle
  • PhysicalPath
  • ProcessId
  • SiteName

Skrip berikut menunjukkan semua properti untuk setiap AppDomain kecuali properti Jalur Fisik, tetapi Anda dapat menambahkannya dengan cukup mudah. Untuk kenyamanan, skrip menampilkan properti kunci dan run-time secara terpisah.

Salin kode ke notepad dan simpan file dengan nama AppDomainProps.vbs. Buka jendela prompt perintah yang ditingkatkan dan navigasikan ke direktori tempat Anda menyimpan file AppDomainProps.vbs. Jalankan skrip dengan mengetik berikut ini di jendela prompt perintah yang baru saja Anda buka:

Cscript.exe AppDomainProps.vbs
'Connect to the WMI WebAdministration namespace
Set oWebAdmin = GetObject("winmgmts:root\WebAdministration")
Set oAppDomains = oWebAdmin.InstancesOf("AppDomain")
WScript.Echo "AppDomain Count: " & oAppDomains.Count
WScript.Echo 
ADCounter = 0
For Each oAppDomain In oAppDomains
    ADCounter = ADCounter + 1
    WScript.Echo "---- AppDomain " & ADCounter & " of " & _
                oAppDomains.Count & " ----" & vbCrLf
    WScript.Echo "[ Key properties ]"
    WScript.Echo "ID: " & oAppDomain.ID
    WScript.Echo "Site Name: " & oAppDomain.SiteName
    WScript.Echo "Application Path: " & oAppDomain.ApplicationPath
    WScript.Echo
    WScript.Echo "[ Run-time properties ]"
    WScript.Echo "Process ID: " & oAppDomain.ProcessID
    WScript.Echo "Is idle: " & oAppDomain.IsIdle
    WScript.Echo vbCrLf
Next

Output sampel

Output Anda akan terlihat seperti berikut:

AppDomain Count: 3
---- AppDomain 1 of 3 ----
[ Key properties ]
ID: /LM/W3SVC/1/ROOT
Site Name: Default Web Site
Application Path: /

[ Run-time properties ]
Process ID: 3608
Is idle: False

---- AppDomain 2 of 3 ----
[ Key properties ]
ID: /LM/W3SVC/2/ROOT/ContosoApp
Site Name: ContosoSite
Application Path: /ContosoApp/

[ Run-time properties ]
Process ID: 3608
Is idle: True

---- AppDomain 3 of 3 ----
[ Key properties ]
ID: /LM/W3SVC/1/ROOT/Fabrikam
Site Name: Default Web Site
Application Path: /Fabrikam/

[ Run-time properties ]
Process ID: 2552
Is idle: False

Kesimpulan

Artikel ini menunjukkan beberapa teknik pembuatan skrip WMI dasar untuk mengambil informasi tentang proses pekerja IIS dan AppDomain. Metode WMI InstanceOf dan kueri WQL digunakan untuk mengambilnya. Berikut adalah tinjauan singkat tentang tugas yang disajikan dan metode yang digunakan:

  • Lihat permintaan yang sedang dijalankan untuk proses pekerja: WorkerProcess.GetExecutingRequests
  • Mendapatkan status semua proses pekerja: WorkerProcess.GetState
  • Membongkar AppDomain tertentu atau semua AppDomains: AppDomain.Unload