このドキュメントでは、Cisco CallManager サーバでのメモリ リークの問題をデバッグするために PsList ユーティリティを使用する方法について説明します。 Windows オペレーティング システムは、プロセス CPU およびメモリ使用量に関する詳細情報を表示するために管理者が使用する Performance Monitor ユーティリティをサポートします。 ただし、Performance Monitor ユーティリティが起動してから開始されたプロセスのメモリ使用率はキャプチャされません。 PsList には、このギャップを埋める役割があります。
注: PsList は無料ユーティリティです。 SysInternals からダウンロードできます。
次の項目に関する知識が推奨されます。
Windows オペレーティング システム
Cisco CallManager
Windows パフォーマンス モニタ
このドキュメントの情報は、次のソフトウェアとハードウェアのバージョンに基づくものです。
Cisco CallManager
本書の情報は、特定のラボ環境にあるデバイスに基づいて作成されたものです。 このドキュメントで使用するすべてのデバイスは、初期(デフォルト)設定の状態から起動しています。 稼働中のネットワークで作業を行う場合、コマンドの影響について十分に理解したうえで作業してください。
ドキュメント表記の詳細は、『シスコ テクニカル ティップスの表記法』を参照してください。
PsList のデフォルト動作では、ローカル システムで現在動作しているすべてのプロセスの CPU 中心の情報が表示されます。 プロセスごとにリストされる情報には、プロセスの実行時刻、カーネル モードとユーザ モードでのプロセス実行時間、OS がプロセスに割り当てた物理メモリ量が含まれます。 コマンドライン スイッチにより、メモリ中心のプロセス情報、スレッド統計、3 種類すべてのデータのいずれかを表示できます。
ユーティリティの形式は次のとおりです。
pslist [-?] [-d] [-m] [-x][-t][-s [n] [-r n]][\\computer [-u username] [-p password]] [name | pid]
それぞれのパラメータについて、次のリストで詳しく説明します。
-か。 —出力 値に使用するサポートされたオプションおよび測定単位を表示する。
--d—このスイッチでは、システムでアクティブなすべてのスレッドの PsList show 統計が表示され、そのプロセスでスレッドがまとめられます。
--m—このスイッチでは、デフォルトの CPU 中心の情報ではなく、PsList show memory を中心とした情報がプロセスごとに表示されます。
--x—このスイッチでは、指定したプロセスごとに、CPU、メモリ、スレッドの情報が表示されます。
--t—プロセスのツリーが表示されます。
--s [n]—タスク マネージャの更新モードと同じようなモードで PsList が動作します。 動作する秒数を任意に指定してこのモードを中断するには、Esc キーを押します。
--r n—タスク マネージャ モードの秒単位の更新レートです(デフォルトは 1)。
name—システムで動作しているすべてのプロセスをリストする代わりに、指定プロセス名で始まるプロセスに PsList のスキャンを絞り込みます。 たとえば pslist exp では、「exp」で始まるすべてのプロセスの統計が表示されます。 これには Explorer が含まれます。
--u—このパラメータはユーザ名を表します。 リモート システムのプロセスを削除するが、実行しているアカウントにリモート システムの管理者権限がない場合は、このコマンド ライン オプションを使用して管理者としてログインする必要があります。 -p オプションを指定してパスワードを含めない場合は、PsList によってパスワードを求められますが、入力したパスワードは画面に表示されません。
--p—このパラメータはパスワードを表します。 このオプションにより、コマンド ラインでログイン パスワードを指定できるので、バッチ ファイルから PsList を使用できます。 アカウント名を指定して -p オプションを省略した場合は、PsList によって対話形式でパスワードを求められます。
\ \ローカルシステムのためのプロセス 情報を示すかわりにコンピューター、PsList は規定 される NT Windows 2000 システムのための情報を示します。 自分のセキュリティ クレデンシャルではリモート システムからパフォーマンス カウンタ情報を取得できない場合は、リモート システムにログインするためのユーザ名とパスワードを -u スイッチで指定してください。
pid—システムで動作しているすべてのプロセスをリストする代わりに、指定したプロセス ID(PID)のプロセスのみに PsList のスキャンを絞り込みます。 たとえば pslist 53 では、PID が 53 であるプロセスの統計が表示されます。
Cisco CallManager サーバで PsList を設定するには、次の手順を実行します。
メモ帳などのアプリケーションでバッチ ファイル(memory.bat)を作成します。 バッチ ファイルの内容は次のとおりです。
echo %date% %time% >>c:\cron\mem.txt c:\dnld\pslist.exe -m >>c:\cron\mem.tx
Cisco CallManager サーバで Task Scheduler サービスを有効にします。
定期的に実行するようにバッチ ファイルをスケジュールします。
間隔を 10 分にすることを推奨します。 この間隔は、問題の必要性に従って調整できます。 実行には数秒しかかからないので、負荷は増加しません。
[Start] をクリックして [Settings] にカーソルを合わせ、[Control Panel] をクリックします。
[Scheduled Tasks] をダブルクリックします。
[Next] をクリックします。
[Browse] をクリックします。
ナビゲートして、スケジュールするプログラムを選択します。
この場合、ディレクトリは cron(図 2 の矢印 A を参照)、プログラムは mem.txt(図 2 の矢印 B を参照)です。
図 2: スケジュールするプログラムの選択
[Open] をクリックします。
注: タスク ウィザードを使用する場合は、[Open advanced properties for this task when I click Finish] をオンにしてから [Finish] をクリックして作業を続けます。
このタスクの名前を入力します。
[Daily] をクリックします。
[Next] をクリックします。
このタスクを開始する日時を選択します。
[Next] をクリックします。
ユーザの名前とパスワードを入力します。 タスクは、そのユーザが開始したものとして実行されます。
[Next] をクリックします。
[Open advanced properties for this task when I click Finish] をオンにしてから [Finish] をクリックし、作業を続けます。
[Schedule] をクリックします。
[Advanced] をクリックします。
[Repeat task] をオンにし、タスクを繰り返す時間(分または時間)を指定します。
[OK] を 2 回クリックします。
使用量の拡大を待機します。
ログを収集します。 PsList の実行のたびに、次のように出力されます。
Process memory detail for EVOICE-R16-CM1: Name Pid VM WS Priv Priv Pk Faults NonP Page Idle 0 0 16 0 0 1 0 0 System 8 1676 224 24 164 562211 0 0 SMSS 204 5256 376 1076 2760 886 1 6 CSRSS 232 30880 2604 1556 1592 2333 7 61 WINLOGON 256 35580 1296 7084 8800 16883 66 35 SERVICES 284 127396 89808 4032 6636 6713985 622 122 .. .. 13:15:29.35
注: 終了したら、スケジュールしたジョブを無効にしてください。 無効にしないと、ログでディスクがいっぱいになります。
ログを解析してインスタンス番号を各行の先頭に付けるには、pslistmem.pl スクリプトを使用します。
#!/usr/bin/perl $inst=0; #init var to count number of instances $tinfo=""; #init var to store date/time info while($_ = <STDIN>){ #if this line contains a timestamp like 11:11:11.11 if (/(\d+:\d+:\d+.\d+)/){ $inst++; #increment the instance counter $tinfo=$_; #save time/date to append to all rows of this instance next; # skip to next line of input } #if this line contains a word followed by at least 8 numbers if (/((\w)(\s)+(\d)+(\s)+(\d)+(\s)+(\d)+(\s)+(\d)+(\s)+(\d)+(\s)+(\d)+(\s)+(\d)+(\s)+(\d)+)/){ tr/\r\n//d; #strip CR LF to keep the date/time on the same line print "$inst\t$_\t$tinfo"; # print instance counter, input line, then date/time for this instance next; # skip to next line of input }
このスクリプトにより、PsList からの出力の最初のセットでは、すべての行の先頭に番号 1 が付きます。 2 番目のセットでは番号 2 が付きます(図 2 の矢印 A、B、C を参照)。 ヘッダー行は取り除かれます。 このため、PID で並べ替えて、最初の列を使用して行を一時的な順序にすることができます。
注: この Perl スクリプトを実行するには、ActivePerl などの Perl インタープリタを www.activestate.com からダウンロードする必要があります。
次の出力が示すように、pslistmam.pl スクリプトを起動します。
cat mem.txt | pslistmem.pl | sort -k 3 >out.txt
Mem.txt と out.txt はそれぞれ、pslistmem.pl の入力ファイルと出力ファイルを表します。 出力はプロセス名で並べ替えられます。 出力 ファイルでは(Figure3 を参照して下さい)、1 カラムは付加される一定数です 2 カラムはプロセス名です、3 カラムはプロセス ID、4 カラムです Virtual Memory (VM)です、5 カラムはワーキング セット(WS)、6 カラムですプライベート バイト数であり、7 カラムはプライベート バイト数のピークです。 VM、WS、プライベート バイト カウントの傾向を監視すると、特定のプロセスによるメモリ消費の一般傾向が分かります。
図 3: PsListMem.pl スクリプトの出力