[独自翻訳] 実行時情報の照会と変更(Webサイトの状態、アプリケーションプール状態、現在実行しているリクエスト)

This post is a translation of the article specified below.
本投稿は IIS.NET の記事をブログオーナーが独自に翻訳したものです。参考情報としてご利用ください。

ウォークスルーの一覧は [独自翻訳] IIS 7.0 PowerShell プロバイダ を使ってみよう!  をご覧ください。

/* 原文*/

Querying and Changing Run-time Data (Web-Site State, Application Pool State, Currently Executing Requests)
https://learn.iis.net/page.aspx/439/powershell-provider-run-time-data

/*翻訳*/

前のウォークスルーでは IIS の構成設定をクエリーあるいは変更する方法を学びました。さて、まだ未開のエリアがあります。実行時情報です。

はじめに

一般的に物事・状態は時とともに変化します。IIS も同様です。サイトは起動・停止しますし、アプリケーションプールはリサイクル・タイムアウトします。また、リクエストが来てレスポンスが送られ、AppDomain も作成され、シャットダウンされます。IIS7 では RSCA (run-time state and control API) というインタフェースを内部で何が起きているかをモニターするために実装しました。

補足:IIS7の大きな特徴の一つがブラックボックス化の改善ともいえる RSCA と呼ばれるこの新 API です。これが何をするかというと実行しているその時点のスナップショットを公開する機能を持ったAPIで、今まで「IIS は中で何が起きているのか本当にわからない」というご意見・印象に対して一石を投じるものになります。つまり、ある時点で各実行プロセス(ワーカープロセス)内で何が起きているのか、ワークプロセスが今 どの状態にあるのかをプログラム的にアクセス可能なのです。標準で付属のツールでもこの API を生かした機能がついています。IIS マネージャ、appcmd.exe、WMI、MWA(.NETおクラス)それぞれで実行時情報をアクセスできるようになっています。ここでは Windows PowerShell で同様にこの API を生かそうということです。

IIS 7.0 PowerShell プロバイダはこのインタフェースを使い、IIS ネームスペースを通じてその部分的なデータを公開します。サイトやアプリケーションプールの状態は Get-WebItemState、Start-WebItem、Stop-WebItem そして Restart-WebItem コマンドレットを通じて設定できます。現在実行されているワーカープロセス、現在う実行されているリクエスト そして ロードされた AppDomain のような実行時情報が IIS ネームスペースを通じて公開されます。

本ウォークスルーは前のウォークスルーで作成されたサイト、アプリケーション、仮想ディレクトリを利用します。

サイトとアプリケーションプールの状態

まずは Web サイトの状態をクエリーするところから始めましょう。

サイト状態

PS IIS:\> cd Sites
PS IIS:\Sites> Get-WebItemState IIS:\Sites\DemoSite
Started

DemoSite を停止するには Stop-WebItem コマンドレットを使います。

PS IIS:\Sites> Stop-WebItem DemoSite
PS IIS:\Sites> Get-WebItemState IIS:\Sites\DemoSite
Stopped

開始も同様に行います。

PS IIS:\Sites> Start-WebItem DemoSite
PS IIS:\Sites> Get-WebItemState IIS:\sites\DemoSite
Started

アプリケーションプール状態

アプリケーションプールでも同じことをしてみましょう。

PS IIS:\> cd AppPools
PS IIS:\AppPools> Get-WebItemState DemoAppPool
Started
PS IIS:\AppPools> Stop-WebItem DemoAppPool
PS IIS:\AppPools> Get-WebItemState DemoAppPool
Stopped

AppPools ノードには state というプロパティがあります。ではちょっと楽しんで以下の例をやってみましょう。スピーカー(あるいはヘッドホン)をオンにして以下のコマンドを実行してみましょう。

dir 'iis:\AppPools' | foreach {[void](new-object -com Sapi.SPVoice).Speak("Application Pool State:");}{$poolState = "Application Pool " + $_.Name +" is " + $_.State;$poolState;[void](new-object -com Sapi.SPVoice).Speak($poolState);}

補足:私の日本語環境でもなかなかいい英語の発音で読み上げしてくれました。(●^o^●)

さあ それでは DemoAppPool をまた開始しましょう。

PS IIS:\AppPools> Start-WebItem DemoAppPool

アプリケーションプールをリサイクルする

アプリケーションプールが他(サイトなど)と違うのはリサイクルさせることができることです。アプリケーションプールをリサイクルするためのコマンドレットは Restart-WebItem で Recycle-WebItem ではありません。PowerShell はかなり厳密なネーミング原則があって、Restart-WebItem という名称にせざるを得ませんでした。さあ今までの例を下記のようにもう少し拡張してみましょう。

  1. 'Default Web Site' のデフォルトページをリクエストする
  2. このリクエストを処理しているワーカープロセスの PID(プロセスID)をクエリーする
  3. アプリケーションプールをリサイクルする
  4. もう一度 PID をクエリーして プロセスが再起動されたことを確認する

1. デフォルトページをリクエストする

Net.WebClient クラスを使って https://localhost/ をリクエストします。HTML出力を完全に画面に表示するのではなく、レスポンスの長さだけ表示します。

PS IIS:\AppPools> $response = (new-object Net.WebClient).DownloadString("https://localhost/")
PS IIS:\AppPools> $response.Length
689

2. ワーカープロセスの PID をクエリーする

あなたのマシンでほかにアクティブな Web サイトやアプリケーションが無い前提を置くと、以下のコマンドは一つのPIDを返すはずです。

PS IIS:\AppPools> get-process w3wp | select processname,id

ProcessName Id
----------- --
w3wp 3684

実はワーカープロセスに到達するにはもっといい方法が本ウォークスルーの後の方で出てきます。

3. アプリケーションプールをリサイクルする

Restart-WebItem コマンドレットを使ってアプリケーションプールをリサイクルします。

PS IIS:\AppPools> Restart-WebItem DefaultAppPool

4. 再度 ワーカープロセスの PID をクエリーする

アプリケーションプールのリサイクルが成功するとプロセスの ID は変わっているはずです。

PS IIS:\AppPools> get-process w3wp | select processname,id

ProcessName Id
----------- --
w3wp 5860

ワーカープロセスとリクエスト

get-process コマンドレットではどのアプリケーションプールがどのプロセスで実行されているかを判断するのに使うことはできません。ただ、これは下記の要領で簡単に実行できます。

PS IIS:\AppPools> dir DefaultAppPool\WorkerProcesses

Process State Handles Start Time
Id
-------- ----- ------- ----------
6612 Running 326 3/28/2008 12:20:27 PM 

補足:日付などはマシンの設定に従った書式で表示されます。

現在実行しているリクエスト

あなたのマシンが運用環境にあるマシンでないなら現在実行しているリクエストを探すのは結構大変です。Internet Explorer でリクエストを実行して PowerShell コンソールに戻ってくるころには終わってしまっているからです。下記を実施することで少しお手伝いできます。長い時間実行されるリクエストを生成します。

Set-Content "$env:systemdrive\inetpub\wwwroot\long.aspx" "<%@ Page language=`"C#`"%><%System.Threading.Thread.Sleep(30000);Response.Write(`"slept for 30 seconds`");%>"

現在実行しているリクエストを確認するには下記のコマンドを入力してください。(メモ: get-item に使うプロセスの ID はあなたのマシンでは異なりますので dir で得た PID を使いましょう。)

PS IIS:\AppPools\DefaultAppPool\WorkerProcesses> dir

Process State Handles Start Time
Id
-------- ----- ------- ----------
6612 Running 737 3/31/2008 8:18:15 AM

PS IIS:\AppPools\DefaultAppPool\WorkerProcesses> (get-item 6612).GetRequests(0)

requestId : d8000001800000f5
connectionId : d8000001600000f3
verb : GET
url : /long.aspx
siteId : 1

あるいはスタートしてからどれだけの時間が経過したかを見たいのであれば、下記を実行します。

PS IIS:\AppPools\DefaultAppPool\WorkerProcesses> (get-item 6612).GetRequests(0) | select url,timeElapsed

url timeElapsed
--- -----------
/long.aspx 2637

まとめ

完了です。本ウォークスルーでは IIS アプリケーションプールやサイトの状態をクエリーし、開始 あるいは 停止する方法も学びました。また現在実行しているワーカープロセスやリクエストを参照する方法も学びました。

/* 翻訳 終わり*/

Comments

  • Anonymous
    January 01, 2003
    This post is a translation of the article specified below. 本投稿は IIS.NET の記事をブログオーナーが独自に翻訳したものです。参考情報としてご利用ください。