読者です 読者をやめる 読者になる 読者になる

Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

WMIによるサーバー監視メモ

これは2005年に投稿したエントリーで、以前のブログから引き継いだものに加筆したものです。

必要に迫られてWMI(Windows Management Instrumentation)を利用したスクリプトを作成することになりました。基本的にはWindows提供のパフォーマンス・モニタを利用してできることなのですが、期待することが実現できないため、あえてスクリプトを作成した次第です。

スクリプト中でWMIを利用するにはインスタンス化しなければなりません。例えばCPU全体のCPU時間を取得するならば、

Dim p_cpuuse
Set p_cpuuse = GetObject("winmgmts:!\\" & "" & Server & "" "\root\cimv2:Win32_PerfRawData_PerfOS_Processor.Name='_Total'")

もしくは

Dim myWMI
Dim myCPU
set myWMI = GetObject("winmgmts:!\\" & myServer & "\root\cimv2")
set myCPU = myWMI.get("Win32_PerfRawData_PerfOS_Processor.Name='_Total'")

個人的には後者の書き方が好みです。

Win32クラス名だけでなく、Nameプロパティを指定しなければなりません。例えば、複数のCPUを搭載している場合、どのCPUを確認するか、もしくは全CPUを単体として確認するのかを指定しなければならないということです。先の記述では、単体としての全CPUの値を取得しています。このようなケースに当てはまる要素は、次のコードでNameの一覧を取得できます。

Option Explicit
Dim objWMI
Dim strComputer
dim colClass
dim objClass
strComputer = "."
Set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colClass = objWMI.ExecQuery("Select * from Win32_PerfRawData_PerfNet_Server",,48)
WScript.Echo "Query: Win32_PerfRawData_PerfOS_System::Name"
On Error Resume Next
For Each objClass in colClass
WScript.Echo "Name: " & objClass.Name
Next
Set objClass = Nothing
Set colClass = Nothing
Set objWMI = Nothing

先のケースに当てはまらない場合、例えば、Win32_PerfRawData_PerfNet_ServerなどではNullが返されます。このようなクラスをインスタンス化する場合には、Nameプロパティへ@を指定します。こんな感じです。

set mySVR = myWMI.get("Win32_PerfRawData_PerfNet_Server=@")

ちなみにパフォーマンス・モニタで取得可能な項目はほとんどWin32クラスで網羅されています。リファレンスとしてこちらが有用でしょう。

参照すべきクラスと、それが保持するプロパティさえ分かれば、後はインスタンス化したものから必要なプロパティを参照するだけです。例えば、サーバー内のファイル・オープン数とサーバー・セッションを参照したければ、

Dim myWMI
Dim mySVR
set myWMI = GetObject("winmgmts:!\\" & myServer & "\root\cimv2")
set mySVR = myWMI.get("Win32_PerfRawData_PerfNet_Server=@")
MsgBox mySVR.FilesOpen
MsgBox mySVR.ServerSessions
set mySVR = nothing
set myWMI = nothing

今回は、これをを利用して次の機能を持つスクリプトを作成しました。

  1. 監視対象サーバーを別ファイルの一覧から読み込む。
  2. 5分間隔で、連続23時間55分以上、24時間未満、監視を続ける。
  3. 監視項目はタブ区切りのCSVファイルで出力する。
  4. エラーはイベント・ログへ出力する。

監視項目は以下の通りです。

  1. PercentProcessorTime
  2. AvailableMBytes
  3. FileReadBytesPerSec
  4. FileWriteBytesPerSec
  5. FilesOpen
  6. LogonPerSec
  7. PoolNonPagedBytes
  8. PoolNonPagedFailures
  9. PoolPagedBytes
  10. PoolPagedFailures
  11. ServerSessions

ちなみに.Net Framework環境ではパフォーマンス監視用クラスが提供されているので、こちらを利用すればより容易に実現できます。ウチの場合、W2K、2003混在環境で、W2KにFrameworkをインストールするわけにも行かず、Win32クラスを利用している次第です。

このスクリプトは次のハイパーリンクからダウンロードすることができます。
performance_monitor.zip