はじめに
仕事では運用チームに属しています。30近いWindows ServerのPCを監視している中で、たまによくわからない現象が発生します。
某N社に連絡すると現象が発生したときのログを取得して送ってくださいというメールが届きます。
そんなわけで自分のところに再度現象が発生するまでパフォーマンスログを仕掛けるようにとの依頼がきました。
パフォーマンスログ
Windowsではパフォーマンスモニターを使用することでパフォーマンスログを取得できます。
下記サイトを参考にパフォーマンスモニターをGUIで設定することができます。
[SQL Troubleshooting] 第2回 : Tips -パフォーマンス ログの採取方法 (Windows Server 2003 ~ Windows Server 2012 R2)
複数台を運用している際、どのサーバーにも共通のモニターを設定したい場合にはインポートとエクスポート機能がある。
Windowsのパフォーマンスモニターの設定エクスポート、インポート
コマンドライン
パフォーマンスモニターにはコマンドラインを使用することができます。
typeperfコマンドとlogmanコマンドの2種類あります。
logmanコマンドは、GUIで設定したデータコレクターセットを使用する場合に便利です。
プログラム
今回はtypeperfコマンドを使用した例とします。
下記の3ファイルを同じフォルダ内に配置します。
- CounterItems.txt
- PerLog.bat
- PerLogTask.bat
CounterItems.txt
取得するパフォーマンスログをテキストファイルに設定します。
\LogicalDisk(*)\*
\Memory\*
\Network Interface(*)\*
\Process(*)\*
\Processor(*)\*
\PhysicalDisk(*)\*
\Server\*
\System\*
PerLog.bat
パフォーマンスログを取得します。
今回は30秒間隔で1日中取得する設定を行います。
cfオプションには取得するパフォーマンスログ(CounterItems.txt)を指定します。
siオプションは間隔(秒)の30
を指定します。
scオプションは回数で2880
を指定します。
(1日は60分 x 24時間=1440分、間隔が30秒なので60/30=2、最終結果は 1440 x 2 = 2880)
fオプションはファイル種類でバイナリーのbin
を指定します。
oオプションは出力ファイル名で、counter_yyyyMMddHHmm.blg
形式となります。
1日中だと130MByteくらいの容量となりますので、3世代管理として実行する度に一番古いファイルを削除するようにしています。
最初はforfilesコマンドを使用して経過日数で世代管理としていたのですが、長期休暇でサーバーを再起動した際に経過日数だとバックアップファイルが無くなると指摘があったため、ファイル数による世代管理に修正しました。
【bat】経過日数およびファイル数で古いファイルを削除する方法
cd /d %~dp0
set time_tmp=%time: =0%
set dt=%date:/=%%time_tmp:~0,2%%time_tmp:~3,2%
REM 3世代管理として一番古いファイルを削除します。
for /f "skip=2" %%a in ('dir /b /o-d *.blg') do del %%a
REM 30秒間隔で1日中取得する。
typeperf -cf CounterItems.txt -si 30 -sc 2880 -f bin -o counter_%dt%.blg
exit 0
PerLogTask.bat
タスクスケジューラで指定するバッチとなります。
運用でタスクスケジューラの状態の監視もしており、0以外だと監視通知が届いてしまうのを回避するためです。そのため監視不要の場合は、タスクスケジューラでPerLog.batを指定すればいいです。
今回はタスクスケジューラから指定する場合、PerLogTask.batを指定します。
こうしないと1日中動作するため「0x41301:現在タスクを実行中です」状態となります。
@echo off
cd /d %~dp0
rem PerLog.batを呼び出す
start PerLog.bat
exit 0
最後に
パフォーマンスモニターのGUIって初見だと何がなんだか分かりにくいんですよね、使いこなせばいいんでしょうけど。ということでコマンド実行した方が直感的に分かりやすい。