WindowsサーバでCPU閾値を超過した瞬間に占有していたプロセスを確認する仕組みについて

お世話になります。

Windows Server 2008R2のCPU使用率の監視をしているのですが、
閾値を超過した場合、その瞬間にCPUを占有していたプロセス名、使用率を
確認したいのですが、何かいい仕組をご存知の方はいらっしゃいますでしょうか。

できれば、アクションで行うメール本文内に挿入できれば
メールを確認するのみで把握できるのでベストだと考えています。

例)pmonコマンドやLinuxでいうTopの結果を表示させるようなイメージ。

※Topのような結果を出力するツールはあるようですが、
 色々制約もあり、サーバ側に新たにインストールのは難しいかもしれません。。

メールを飛ばすスクリプトは以下を使用しています。
・sendmessage_smtp_php__iso-2022-jp-ms_for_after_PHP5.2.1.sh
・class.phpmailer.php

https://github.com/zabbix-jp/plugins/blob/master/notification/sendmessag...
https://github.com/zabbix-jp/plugins/tree/master/notification/sendmessag...

よろしくお願い致します。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー TNK の写真

CPU使用率のトリガーを契機に送るメール送信アクション内に、直
接トリガーに関連の無い値を埋め込むのは標準の機能だけではでき
ないと思います。

負荷が高くなった時に、どのプロセスが多くCPUを利用していたか
を把握するだけであれば、CPU使用率が閾値を超えた際のアクショ
ンとして、メール送信だけではなく、リモートでコマンドを実行し
てファイルに出力するようなことであれば実現可能だと思われます。

サーバ側に新たにインストールすることが難しいとのことですので、
標準で用意されているtasklistというコマンドであれば、topコマ
ンドとは違いますが、現在起動しているプロセスそれぞれがCPUや
メモリをどの程度利用しているかを確認することができます。

Windows上のコマンドプロンプトで、

 tasklist /V

などと実行してみてください。

返信有難う御座います。

コマンド実行してみました。イメージと近いのですがCPU Timeではなく、できればCPU使用率(できれば%)ととして出力できるようなコマンド・スクリプトはご存知でしょうか。

例えば、閾値90%だとして「閾値超過した際、占有していたプロセスがアンチウィルスソフトのプロセス名であれば静観とする」という運用をしたいのです。

CPU Timeで判断するのはちょっと難しいのかな。。と思いました。

ユーザー heya の写真

こんにちは。

適当に検索しただけなのですが、PsList というのが使えませんか?
http://moriya.xrea.jp/tdiary/20120328.html
http://mitsuakikawamorita.com/blog/?p=696
#windows に grep なんてあったっけ?

zip を解凍した中に pslist.exe があるのでこれを実行すればよさそうです。ただ、初回に限り EULA の同意確認ウィンドウが出て、 Agree を押すとそのことをレジストリに記憶しているようです(※)。これが「インストール」に該当するかどうかは微妙なところですが。
一応ヘルプには
You don't even need to install any client software on the remote computers at which you target them.
と書かれていました。
※手元の環境(Windows 7)では HKEY_CURRENT_USER\Software\Sysinternals\PsList に記録されていました。

引数で \\computer と指定できるようなので、他の Windows マシンに対しても実行できそうな感じですが、Zabbix Server は Windows じゃ動かないのでなんとも。

その他参考になるかどうか分からないけど、見つけたもの
http://melog.info/archives/2006/01/05050838.html
http://somethingforthepain.blog22.fc2.com/blog-entry-71.html
http://q.hatena.ne.jp/1220439074

ユーザー kng の写真

Windows環境であれば、パフォーマンスカウンタで
プロセスのCPU使用率を取れると思うのですが、
できませんでしたっけ?

特定プロセスが特定条件下に
於いてCPUを使用している場合は、静観というのが前提でしたら、パフォーマンスカウンタで取得して、該当しなければアラートにしてはいかがですか?

皆様ありがとうございます。

パフォーマンスカウンタでもプロセス毎に取れるのですね。
pslistもこれくらいなら大丈夫そうな気がしますので、スクリプトは苦手ですが、リモートコマンドとかでアクションでキックするとイメージ通りの結果が取れそうです。

ちょっと試してみます。

何度もすいません。。

PsList.exeを使用し、以下でアイテムとユーザパラメータを作成してみましたが、上手く取得できません。
コマンドプロンプトで「C:\work\pslist.exe -s 2」とすると普通に表示されるのですが。。

◆アイテム
キー:get.ps.list
データ型:テキスト

◆zabbix_agentd.conf
UserParameter=get.ps.list,C:\work\pslist.exe -s 2
※できればWindowsサーバ側にはログは残したくない。
※できれば2回目の結果のみ取得したい。

◆結果(zabbix_server.log)
17681:20140213:152832.031 Zabbix agent item [get.ps.list] on host [Windows2008] failed: another network error, wait for 15 seconds
17681:20140213:152916.055 temporarily disabling Zabbix agent checks on host [Windows2008]: host unavailable

となり、エージェントの状態が赤くなり「get value from agent failed cannot connect to [4] interrupted system call」となってしまい、アイテムを無効にしてWindowsサーバを再起動しないと回復しなくなってしまいました。

どなたかPsListを使用してZABBIXにアイテム登録されている方はいらっしゃいますでしょうか?

解決しました。Zabbix Agentに権限をつけてあげると取得できることを確認しました。
ありがとうございます。