パフォーマンス ログのススメ

こんにちは。 Windows サポートの水上です。
今回は、パフォーマンスの問題が発生した際にお願いしたい、パフォーマンス ログの採取についてご紹介します。

"理由はわからないけど、とにかく PC ・サーバーが遅くて困っている!"
- そんなときはパフォーマンス ログ

パフォーマンス関連のお問い合わせの背景をお伺いすると、システム パフォーマンスの問題の解決に取り組む際の手がかりがなくて困っている、と仰るお客様が多くいらっしゃいます。
このようなとき、私たちはパフォーマンス ログの採取・提供をお願いしています。

パフォーマンス ログとは、 Windows や Windows 上で実行されるアプリケーションのパフォーマンス情報の記録です。
Windows では、標準でパフォーマンス ログを採取する機能が備えられており、データ コレクター セットで定義したパフォーマンス カウンター (情報採取項目) の数値をファイルに書き出すことができます。

PC やサーバーのパフォーマンスの低下は、さまざまな要因で発生します。

  • CPU への負荷が大きく、 CPU 処理待ちが発生している。
  • I/O 割り込みなど優先度の高い処理が多く、一般の処理が滞りがちになっている。
  • 処理が "待ち (WAIT)" の状態のまま止まってしまっている。
  • メモリ不足が発生している。
  • ディスク I/O でボトルネックが発生している。

原因を特定し対策を実施する際には、闇雲に調査を進めないためにも、まずはどの観点で調査を進めるべきかを明確にする必要があります。
パフォーマンス ログを見れば、 CPU、メモリ、ディスク、ネットワークなど、さまざまなリソースの状況を一度に確認することができ、調査の初動をスムーズにできます。
そのため、パフォーマンス関連のお問い合わせを頂戴した際には、必ずと言ってよいほど、パフォーマンス ログの採取をお願いしています。

本稿では、一般的なパフォーマンス ログの採取手順についてご紹介します。
この手順でパフォーマンス ログを採取・解析することで、問題の切り分けにお役立ていただけると思います。
また、マイクロソフトのサポートにお問い合わせいただくときも、パフォーマンス ログがすでに手元にあると、調査がスムーズに始められます。

パフォーマンス ログ採取の設定手順

私たちがパフォーマンス ログの採取をお願いするときは、以下の手順でご採取いただくようご案内しています。

  1. 管理者権限で起動したコマンド プロンプトにて下記コマンドを実行し、データ コレクター セットを作成します。

    logman create counter AskCore-Triage -c "\Cache\*" "\LogicalDisk(*)\*" "\Memory\*" "\Network Adapter(*)\*" "\Network Interface(*)\*" "\PhysicalDisk(*)\*" "\Process(*)\*" "\Processor(*)\*" "\Processor Information(*)\*" "\Server\*" "\System\*" "\Paging File(*)\*" "\Database(*)\*" "\Server Work Queues(*)\*" "\Objects\*" -si 00:00:15 -cnf 24:00:00 -v NNNNNN -o %systemdrive%\PerfLogs\Admin\AskCore-Triage

  2. 引き続き、管理者権限で起動したコマンド プロンプトにて下記コマンドを実行し、ログの採取を開始します。

    logman start AskCore-Triage

  3. 引き続き、管理者権限で起動したコマンド プロンプトにて下記コマンドを実行し、再起動後も自動的にパフォーマンス ログの採取が開始されるよう、起動時に実行されるタスクを作成します。

    schtasks /create /tn \Microsoft\Windows\PLA\AskCoreTriageLogOnStart /sc onstart /tr "logman start AskCore-Triage" /ru system

  4. 事象の再現を待ちます。

    +++ この間、バックグラウンドでシステム リソースの状態が記録されます。 +++

  5. 事象の再現を確認したら、管理者権限で起動したコマンド プロンプトで下記コマンドを実行し、ログの採取を停止します。

    logman stop AskCore-Triage

  6. <システム ドライブ (通常 C)>:\PerfLogs\Admin\AskCore-Triage にログ ファイルが格納されたフォルダーが作成されるので、回収します。

上記手順により、CPU、メモリ、ディスク、ネットワークなど、調査の手がかりになるパフォーマンス カウンターのデータを一括して 15 秒ごとに採取します。
1 時間あたり最大で 200 MB のログ ファイルが出力される場合がありますが、ログ ファイルは 24 時間に 1 回分割されるので、古いログを順次退避・削除することで、ディスク容量の逼迫を避けることができます。
また、 logman create コマンドにオプションを追加することで、循環ログにすることも可能です。

パフォーマンス ログを採取するデータ コレクター セットは、パフォーマンス モニター (perfmon.exe) を使用して GUI 上で作成することも可能です。
しかし、 3000 個以上もあるカウンター (実際に私の PC で確認すると 3513 個のカウンターがあります) から必要なカウンターを GUI 上で選別するのは大変な苦労です。
現に、 "これだけたくさんあるカウンターの中からどれを選べばよいのかわからない" とのお問い合わせも頂戴しています。
そのため、上記のような、コマンドを使用し一括してパフォーマンス カウンターを記録する手順をご案内しています。

採取したログはどうするか?

パフォーマンス モニター (perfmon.exe) を使用し、採取したパフォーマンス ログの確認することが可能です。 (既定で関連付けが設定されています。)
ログ ファイルを開いたのち、 [カウンターの追加] メニュー (グラフ上を右クリックすると選択できます) から、画面上に表示するパフォーマンス カウンターを追加することもできます。
また、 relog コマンド を使用しログを CSV 形式に変換すれば、ご自身で Excel などを使用して数値解析することも可能です。

まず最初に確認したいカウンターは、次のとおりです:

  • \Processor(_Total)\% Processor Time -> CPU 使用率が高騰し、負荷が過剰になっていないか?
  • \Processor(_Total)\% Privilaged Time -> 優先度の高い処理の負荷が過剰になっていないか?
  • \System\Processor Queue Length -> CPU 割り当て待ちの処理が発生してないか?
  • \Memory\Available Bytes -> メモリ不足が生じていないか?
  • \LogicalDisk\% Idle Time -> ディスクの負荷が過剰になっていないか?
  • \LogicalDisk\Avg. Disk Queue Length -> ディスクのリソース待ちが慢性的に発生していないか?

上記カウンターの状況を踏まえ、次のようなアクション プランを検討します。

  • 他のパフォーマンス カウンターや関連のパフォーマンス カウンターの確認。 (例: メモリ不足による処理遅延の疑いがある際に、 \Paging File(_Total)\% Usage や \Memory\Pages Output/sec などを確認する。)
  • Windows Performance Recorder (WPR) を使用したログの追加採取・詳細調査。 (例: CPU 使用率の高騰やディスク アイドル率の低下が見られるときに、具体的にどの処理がリソースを消費しているかを WPR のログにより確認する。)
  • ダンプによるメモリ使用状況の確認。

なお、パフォーマンスの問題に関するお問い合わせとして、パフォーマンス ログと併せてマイクロソフトのサポートにご連絡いただければ、ログの解析から次のアクション プランのご提案まで、問題の解決にむけ全面的にご支援いたしますので、ぜひご検討ください。

日ごろからパフォーマンス ログ

ディスクに余裕がある環境では、日ごろからパフォーマンス ログを採取しておくことをおすすめします。

冒頭でお伝えしたように、パフォーマンスの問題でお問い合わせいただくと、私たちはかなりの高い頻度でパフォーマンス ログの採取・提供をお願いしています。
なぜなら、確実かつ迅速に課題を解決するには、パフォーマンス ログを根拠に適切な調査方針を決めることが重要となるからです。
このときに、すでに採取されているパフォーマンス ログがあれば、調査がスムーズに進む可能性が高くなります。
逆に、問題発生時のパフォーマンス ログがなく、ログ採取の設定をしたけど今度は問題が再発しない - こうなってしまうと、調査が行き詰ってしまうことにもなりかねません。

パフォーマンス ログは、システムの負荷が小さく、採取したまま放置することができるので、発生頻度が低くいつ起きるかわからない事象の記録にも向いています。
古いログ ファイルの削除や循環式ログの設定など、適切な設定さえ行えば、ログ ファイルによりディスク容量を食いつぶす心配もありません。
そのため、 "転ばぬ先の杖" として、パフォーマンス ログを日常的に採取することは、効果的な戦略となります。

パフォーマンス ログは万能ではない

パフォーマンス ログは便利ではありますが、万能ではありません。

たとえば、 CPU 負荷やメモリ負荷が高い状況では、具体的にどの処理が負荷を高めているのかを確認する必要がありますが、パフォーマンス ログでは処理を特定することはできません。
また、処理が待ち状態で止まってしまっていることが原因の場合、待ち状態の処理はリソースをほとんど消費せず、パフォーマンス ログ上ではあたかも何も問題がないように見えるため、別の情報を採取する必要があります。

パフォーマンス ログは初動で活躍し、原因特定のフェーズでは別途詳細な情報採取が必要であるということを覚えておいてください。