2013年11月11日月曜日

監視したい。とても。とても。

監視したいわけです。
PCを。
ずいぶん前の続きです。

でもって、rrdtoolをHotSaNICからつかうんダヨネとか決定してみたわけですが、HotSaNICそのものはデータを集めてきてrrdtoolに記録をお願いしたり、定期的にホームページ用のグラフをrrdtoolにお願いして作っていただいたりしているデーモンなわけです。(perlの!)

ということは、windowsを監視したいンですけど。というときにすべきなのはwindowsからいかにして情報をせしめるか、というだけの話になるわけです。

で、C#、実はずっとずっと昔ASPとかなんとかで業務アプリを作ったことはありますが本職はCなので離れていました。
しかし、OpenHardwareMonitorのコードが実に楽し気だったのでそいつでwindows側のエージェントというか問い合わせに答えるプログラムを書いたら半日もたたずにできてしまいました。

なんといっても大きかったのは、C#でWQLを発行するのが異常に楽だという点につきます。
また、streamにgzipをかませることができるので、電文を小さくすることが簡単にできたというのも大きい。
ソケットも扱いが楽で、非同期通信の仕組みもよくできている。bsdソケットとはかけ離れているけど、まさしくwindowsライクなライブラリのつくり。これも組みやすさに大いに寄与しますね。

オブジェクトをnewしたあと作成者が意図した段階でdeleteできない、こういうたぐいのCGつき言語のモヤモヤ感は否めませんが、javaよりずっと使いやすい言語ですね。

あとはHotSaNIC側で問い合わせスクリプトを書くだけです。
肝は以下のWQLでしょう。

DISKIO
こいつはwindowsが持つパフォーマンスデータからディスクの稼働状況を取得します。
なお、後置詞にPersecとか書いてあるメンバがありますが、これは嘘です。
累計された数値です。したがって、オーバーフロー対策は必要です。
(root/cimv2)

select     
    DiskWritesPersec,         -- ディスク書き込み回数
    DiskReadsPersec,          -- 読み込み回数
    Timestamp_PerfTime,   -- 現在のPC側の時間(tick)
    Frequency_PerfTime,    -- 1秒当たりのtick数
    DiskReadBytesPersec,  -- ディスク読み込みバイト数
    DiskWriteBytesPersec, -- 書き込みバイト数
    Name                             -- デバイス名
from
          Win32_PerfRawData_PerfDisk_PhysicalDisk

上記が分かれば、単位時間当たりのリード・ライト回数と転送レートが計算できます。
もっとざっくりやりたければ、tick時間なんか無視して、前回問い合わせ時間~今回問い合わせ時間は問い合わせした側が分かっているわけですから、Timestamp_PerfTimeと
Frequency_PerfTimeは無視してもよいでしょう。

NETWORK TRAFFIC
NICの転送量を取得します。
これもPersecはper secondを意味しません。
(root/cimv2)

select
    Name,                              --デバイス名
           BytesReceivedPersec,     --受信バイト数
    BytesSentPersec,             --送信バイト数
    PacketsReceivedPersec,   --受信パケット数
    PacketsSentPersec           --送信パケット数
from
    Win32_PerfRawData_Tcpip_NetworkInterface

これもDISKIOと同様、どんどん累計していきますから単位時間当たりのリード・ライト回数と転送レートが計算できます。
問合せ間隔を基準にするなら、その間の平均転送量が分かりますね。

DISK消費量
まあ、これは言うまでもないですね。
(root/cimv2)

select
           Caption,
           FreeSpace,
           Size
from
           Win32_LogicalDisk

CPU負荷
こいつも言うまでもないでしょうが、一つ違いは論理コア数分と、トータルの平均が取れるというところでしょう。
 (root/cimv2)

select
    name,                     -- Where句で指定した名前
    PercentIdleTime,   -- アイドル時間の割合
    PercentUserTime,  -- ユーザ時間
    PercentPrivilegedTime, -- カーネル時間(みたいなもんだ)
    PercentInterruptTime   -- 割り込み処理で費やした時間
from
    Win32_PerfRawData_PerfOS_Processor
where
    name='_Total';

私のPCはCore i7なので8+1の9種類の情報を取ってきます。
where句でnameに_Totalを指定すれば平均、0~7を指定すれば各論理コアの値が取れます。
上記の例では平均をとってきます。
ただ、これだけとっても問い合わせた時のスナップショットですから、表現には一工夫いるでしょう。

メモリ使用状況
こいつも言うまでもありませんね。メンバ名(RDB式に言えばカラム名)そのまんまの値をとってきます。
 (root/cimv2)

select
    FreePhysicalMemory,
    TotalVisibleMemorySize,
    TotalVirtualMemorySize,
    FreeVirtualMemory
from
    Win32_OperatingSystem

惜しむらくは、物理メモリ上にキャッシュされた容量を取得する方法を探しきれなかったことです。
タスクマネージャでは表示しているので、どこかにそういった情報を計算できる元ネタがあるはずなのですが・・・
特にWindowsNT6.0たるVistaからキャッシュが登場して以来、以後ますます洗練されてきており、WindowsNT6.2たるWindows8、6.3たる8.1(ややこしいな)でのグラフは面白かろうと思ったのですが。

まあ、仮想メモリと物理メモリの利用量が分かれば、swapされた量もわかりますから、まずよしとしましょう。

連続稼働時間
これも、まあそのまんまです。
(root/cimv2)

select
    LastBootUpTime
from
    Win32_OperatingSystem

この値と現在時刻を比較すればすぐわかります。
但し、スリープ中の時間を差し引くかどうかは考えどころです。
とはいえ、スリープ中はエージェントも応答できませんから、グラフに欠落ができます。
それを見れば一発でわかるという考え方もありますね。
まあ、スリープ中もシステムは停止しているわけではありませんから、累積させる方向がよいでしょう。

HDD温度
さてお待ちかね、ここからがsmartmontoolsとOpenHardwareMonitorの出番です。
(root/openhardwaremonitor)

select
    Parent,   -- ドライブの種別
    Value     -- 温度
from
    sensor
where
    sensortype='Temperature' and Parent='/hdd/0'

実を言うと、Windows8のころはOpenHardwareMonitorでは温度は取得できていませんでした。
ですが、怪しかったIntelのHDD管理ツールをWindows8.1にはあえてインストールしませんでした。
すると、OpenHardwareMonitorで温度が取得できることを確認しました。
そこで、8まではsmartmontoolsのコマンドをたたく方式でクライアントを作っていましたが、サーバ側のスクリプトを変更してWQLを発行するように変更しました。

where句にsensortypeとparentがありますが、sensortypeは温度を指定します。Parent句にはWindowsでいうところのUNCパスで表現されるドライブ番号を利用して指定します。
disk0なら/hdd/0 といった具合です。

CPU,GPUクロック、温度、ファン回転数
ここは画面の都合上一気に取得します。
(root/openhardwaremonitor)

 select
    name,           -- 名称
    sensortype,   -- センサのタイプ
    value            -- 値
from
    sensor
where
    sensortype = 'Temperature' or sensortype = 'Fan' or sensortype = 'Clock'

上記のクエリを発行すると、一気にCPUのパッケージ温度、コアごとの温度とクロック数、GPUの温度とクロック数、GPU,CPUおよびケース・電源ファンの回転数を取得することができます。

以上を収集しておけば、グラフを見てニヤつくには十分でしょう。

これら収集したデータを、もともとHotSaNICが収集している元ネタに置き換えるだけで完成です。
実際に作成された一か月半分のグラフをお見せしたいところですが、なにせ監視対象がPCだけあってPCを操作している時間がまるわかりなため、お見せすることができません。

PC側のエージェントは私の管理下にありますからご希望の方があれば無保証無サポートで差し上げることができます。
HotSaNIC側のライセンスがはっきりしないのでこちらはそのままお分けできませんが、私が書いたコード分についてはお分けすることができます。ただし若干の書き換えが必要になります(問い合わせ先のマシン名や設定ファイルなど。HotSaNICに対する知識はある程度必要になるでしょう)。
当然こちらも無保証無サポートとなりますが、まあどちらもそんなもんいらないよね。

グラフを見てニヤつけるような人には。

春夏秋冬の移り変わりを感じることもできますよ。
あなたも是非、監視するまでもないマシンの諸元をグラフ化してみよう!

0 件のコメント:

コメントを投稿