Skip to content

MS_TroubleshootingToolsList

nishi_74322014 edited this page Aug 3, 2026 · 1 revision

障害対応に使用するツールの一覧

概要

障害対応で使用する、監視・プロファイル・デバッグ系ツールを用途別に纏めています。

移行メモ: 本ページは Windows XP 〜 Windows 7 / Server 2008 R2 世代の記述が中心。 Sysinternals 系(Process Monitor / Process Explorer / Handle)と Debugging Tools for Windows(WinDbg / UMDH 等)は現在も現役だが、 マネージド系のプロファイラは大半が開発終了しており、 現行は dotnet-counters / dotnet-trace / dotnet-dump / dotnet-gcdump(.NET 診断ツール) と WinDbg + SOS を使う。

ツールの利用ポイント

監視・プロファイル ツールやサポートツールは、「サーバーの監視」のフローチャート中の

  • 原因の把握、解決策の決定
  • サポートを活用して解決策を決定する。

の部分で使用します。

障害対応のノウハウと利用可能なツールを把握しておくことで、

  • 問題発生時に、セルフ・サポートが可能になります。
  • また、セルフ・サポートが困難な場合もサポート・エンジニアとの連携がスムーズになります。
    • サポート・エンジニアと連携可能な範囲はどこか?
    • サポート・エンジニアに提供してもらえる情報は何か?
    • サポート・エンジニアに提供すべき情報は何か?

システム情報収集

監視系

各種リソース

パフォーマンス カウンタ

パフォーマンス カウンタを参照。

Windowsタスクマネージャ

Windows OS付属の簡易的な各種リソース監視ツール。

プロセス監視

Process Monitor

プロセス監視(各種イベント監視)

Process Explorer

プロセス監視 / ハンドル数調査 / ユーザモードダンプ取得

  • Windows Sysinternals > Process Explorer
    • プロセスツリー、タイプ、使用しているDLL、ハンドル、
      イメージ(EXE)、性能情報、TCP/IPソケット、.NETバージョンなどの
      様々な情報の確認できる。また、使用しているDLL、ハンドルの検索機能も持つ。
    • プロセスの開始・終了、ユーザ・モード・プロセス・ダンプの取得も可能(ハングダンプ相当)。
    • GDIオブジェクトの数、また、GDIオブジェクトが消費するプールの上限値を確認できる。
      (ただし、これにはWinDbgをインストールして、シンボルサーバを設定する必要がある)

Sysinternals Handle

このプログラムの GUI ベースのバージョンは、Process Explorer

アプリケーション固有ログ

例えば

DB監視

  • SQL Server系(SQL Server 問題の分析方法: MS_SQLServerProblemAnalysis.md

WAS監視

クラスタ監視

クラスタログ

ネットワーク監視・プロファイル

ツール

  • Wireshark(MS_WiresharkUsage.md
    • パケットキャプチャとパケット分析
    • 管理:マクロ分析、プロファイル:ミクロ分析

ログ

  • ネットワークモニタツール
    • Wireshark(MS_WiresharkUsage.md
  • 負荷分散装置のログ
  • ファイアウォール装置のログ
  • スイッチのログ

デバッグ ツールセット

Debugging Tools for Windows

Windows Performance Recorder (WPR)

トレースデータを採取するコンポーネント

Windows Performance Analyzer (WPA)

トレースデータを GUI で表すコンポーネント

※ WPR / WPA は現在 Windows ADK(Windows Performance Toolkit)に含まれる。

ライブ・デバッグ・ダンプ取得・分析

IISライブ・デバッグ、ダンプ取得・分析

アンマネージド・ヒープ解析

  • UMDH:User Mode Dump Heap

プロファイラ

ユーザモード

Visual Studio

  • Visual Studioデバッガ
  • VS2005パフォーマンスツール
    • パフォーマンス Visual Studio プロファイラでアプリケーションのボトルネックを見つける
  • Visual Studioプロファイラ
    Visual Studio 2010 Premium / Ultimate付属のマネージド・コード・プロファイラ

※ 現行は Visual Studio の「パフォーマンス プロファイラー」(Alt+F2)に統合されており、 CPU 使用率・メモリ割り当て・.NET オブジェクト割り当てなどを Community でも計測できる。

CLR Profiler

マネージド・コード・プロファイラ(メソッドの呼出回数・時間、メモリ割当・消費、オブジェクト接続・ルート追跡)

SOS.dll (SOS拡張)

マネージド・コード・プロファイラ(ライブ・デバッグ & ダンプ分析)(.NETのメモリ・リーク

Managed Stack Explorer

マネージド・コード・プロファイラ(スレッド ダンプ)

DevPartner Studio

マネージド・コード・プロファイラ

その他のマネージド・コード・プロファイラ

  • 商用:dotTRACE(JetBrains)
  • 無償:NProf
  • 無償:EQATEC Profiler

補足(最新化): CLR Profiler、Managed Stack Explorer(CodePlex 閉鎖)、 DevPartner Studio、NProf、EQATEC Profiler はいずれも入手・利用が困難。 現行の .NET では、以下のクロスプラットフォームな CLI 診断ツールが標準:

  • dotnet-counters — ライブのメトリック監視
  • dotnet-trace — CPU / イベントのトレース
  • dotnet-dump — ダンプ取得と SOS による解析
  • dotnet-gcdump — GC ヒープのスナップショット(マネージ ヒープのリーク調査)

商用では dotTRACE / dotMemory(JetBrains)が引き続き現役。

Rational PurifyPlus for Windows

アンマネージドコードプロファイラ

カーネルモード

Driver Verifier

カーネルモードドライバのデバッグ/メモリ分析

Memory Pool Monitor

カーネルモードドライバのメモリ分析

Desktop Heap Monitor

デスクトップ・ヒープのメモリ分析

メモリ・リーク

タスクマネージャ

「パフォーマンス」タブ

【】内はVista以降

  • 合計(システム)
    リソースの数
    • ハンドル
    • スレッド
    • プロセス
    • 【起動時間】
    • 【ページ・ファイル、コミット】
  • 物理メモリ
    物理メモリのサイズ
    • 合計
    • 利用可能【空きメモリ】:
      • 利用可能な物理メモリ(空き) → Memory\Available Bytes
      • 未使用ページリスト、ゼロページリスト、スタンバイ リストの合計
    • システムキャッシュ【キャッシュ済み】:
      以下の5種類のワーキングセットの合計
      • システム キャッシュ ページ
      • ページ プール
      • Ntoskrnl.exe 内のページング可能なコードとデータ
      • デバイス ドライバ内のページング可能なコードとデータ
      • システム マップドビュー
  • コミット チャージ
    仮想メモリのサイズ → Memory\Committed Bytes
    • 合計
    • 制限値
    • 最大値
  • カーネル メモリ
    カーネル モードで使用しているメモリのサイズ
    • 合計
    • ページ
    • 非ページ

「プロセス」タブ

  • 仮想メモリ
    • 仮想メモリサイズ【メモリ - コミット サイズ】
      仮想メモリのサイズ(非共有メモリの仮想メモリの使用量)
      = コミットされたサイズ、つまりプライベートバイト → Process(*)\Private Bytes
    • ページ プール【メモリ - ページ プール】
      プロセスのページ プールのサイズ
    • 非ページ プール【メモリ - 非ページ プール】
      プロセスの非ページ プールのサイズ
  • 物理メモリ(ワーキング セット)
    以下のメモリ使用量は、トリミング可能なスペースも含めたワーキング セット全体のサイズを表示しており、他のプロセスの実行状態によって増減するので仮想メモリ(メモリ使用状況)を確認するための値としては適切ではない。
    • メモリ使用量【メモリ - ワーキング セット】
      当該プロセスの物理メモリ使用量【ワーキング セット】のサイズ
    • 最大メモリ使用量【メモリ - ピーク ワーキング セット】
      当該プロセスを起動してから現在までにおける、物理メモリ使用量【ワーキング セット】の最大値
    • メモリ デルタ【メモリ - ワーキング セット デルタ】
      プロセスによって使用される物理メモリ使用量【ワーキング セット】使用量の変化量。
    • 【メモリ - プライベート ワーキング セット】
      プロセスが使用しているワーキング セットのうち、
      他のプロセスと共有できない(=トリミングできない)容量だけを表すサブセット
      ※ XP、2003には存在しない。
  • リソース
    • ハンドルの数
    • スレッドの数
    • USERオブジェクト
    • GDIオブジェクト

参考資料

パフォーマンス カウンタ

パフォーマンス カウンタを参照。

ヒープ解析

アンマネージド

UMDH:User Mode Dump Heap

マネージド

  • .NETのAPI
    • GC.GetTotalMemory メソッド

      現在割り当てられていると思われるバイト数を取得する。

    • GC.Collect メソッド

      強制的にガベージ コレクションを行う(推奨しない)。

      System.GC.Collect();                  // GC強制実行
      System.GC.WaitForPendingFinalizers(); // 非同期ファイナライザの実行を待つ
      System.GC.Collect();                  // GC強制実行(ファイナライザ完了後のメモリ開放)
  • マネージド・プロファイラ
    • Visual Studioプロファイラ
    • CLR Profiler
    • SOS.dll(SOS拡張)
    • Managed Stack Explorer
    • DevPartner Studio

ダンプ解析

アンマネージド

  • ダンプ+WinDbg

マネージド

カーネル メモリ スペース

  • Kernel Memory Space Analyzer

    一般ユーザーのために設計されていないことに注意してください。カーネル・デバッガに既に精通しておりウィンドウズの内部についての知識を持っており、カーネル・モード・プログラムをデバッグする基礎的な技術を持っているユーザを想定しています。

カーネル オブジェクトのハンドル

  • タスクマネージャ
  • パフォーマンスカウンタ
  • Sysinternals Handle
    カーネル オブジェクトのハンドル(リソースリーク)確認。
    このプログラムの GUI ベースのバージョンは、Process Explorer

メモリ プール(ページ プールと非ページ プール)

タスクマネージャ、パフォーマンスカウンタ

Memory Pool Monitor ユーティリティ (Poolmon.exe)

ページ プールと非ページ プール、およびターミナル サービス セッション用に
使用されるメモリ プールからのメモリ割り当てに関してOSが収集するデータを表示する。
これによりカーネルモードで動作するモジュール(ドライバ)のリーク問題を検出可能(必要に応じてgflagsを設定することで割り当ての際に、ドライバをある程度識別可能なTagが付与される)。

  • Memory Pool Monitor (Poolmon.exe) を使用してカーネル モードのメモリ リークのトラブルシューティングを行う方法(KB177415)
  • サードパーティ製のドライバによって使用されているプール タグの検索方法(KB298102)
  • Pool tag list(TechNet Blogs)

WinDbg+Kdの!poolused拡張コマンド

Driver Verifier

プール・トラッキング機能を有効にした状態で(プールトラッキング機能は負荷があるので、本番に適用する場合は検証が必要)

  • カーネル メモリダンプや、
  • 完全メモリダンプで

カーネル メモリ スペースをダンプ出力し、これを分析することでカーネルドライバのメモリ・リークを確認する。

Sysinternals Notmyfault

  • 仮想化した世界 Sysinternals 「Notmyfault」

    基本的にはブルースクリーンを発生させるためのツールであるが、この他にも、指定した増分値で非ページ プールまたはページ プールのいずれかにリークを発生させるオプションがある。

デスクトップ・ヒープ

デスクトップ・ヒープ

Desktop Heap Monitor

Windbg+LiveKdの!dskheap拡張コマンド

チューニング方針

当該デスクトップのUsed Rateの合計が100%以下であれば他のデスクトップに影響を与えることは無い。しかし、余裕を持たせるため、当該デスクトップのUsed Rateの合計は、50-70%以下になるようにする。

チューニング方法

  • 領域のサイズ変更を伴わないチューニング
    • USERオブジェクトなどのリークがあった場合は対応する。
    • 例外的に、サーバのSession0のインタラクティブ・ヒープが枯渇している場合
      サーバ上でサービスがLocalSystem アカウントで実行されていて、スタートアップ オプションの [デスクトップとの対話をサービスに許可] チェック ボックスがオンに(→ SERVICE_INTERACTIVE_PROCESS flag を含んでいる)なっているサービスでは、Session0\Winsta0\Default(インターラクティブ・ヒープ)が使用されるため、ここがリークする可能性がある。対応:必要に応じて、対話の許可を外すか、実行アカウントに任意のユーザアカウントを選択する。
  • 領域のサイズ変更を伴うチューニング
    • サーバのSession0のノン・インタラクティブ・ヒープが枯渇している場合
      • 同時実行サービス数が多い
        起動の度にウィンドウ・ステーションとセッション、対応するノン・インターラクティブ・ヒープが新規作成されるためノン・インターラクティブ・ヒープ用の残領域を使い切る場合がある。
        なお、Vista以降では、この問題は発生しない(自動的にサイズの拡張が行われる)。対応:必要に応じて、「全デスクトップ・ヒープの容量」のサイズを大きくする。以下のレジストリ値の設定を変更する(MB単位)。
        HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\SessionViewSize
      • ユーザサービスから多くのプロセスを起動しているシステム
        子プロセスは親プロセスの設定を継承するため、同一のウィンドウ・ステーションとセッション、対応するノン・インターラクティブ・ヒープが使用される。
        このため、サービスから新たなプロセスを起動した場合、当該ノン・インターラクティブ・ヒープを使い切る場合がある。
        対応:必要に応じて、「ノン・インターラクティブ・ヒープの容量」のサイズを大きくする。以下のレジストリ値のSharedSectionの3番目の値の設定を変更する。
        HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\SessionPoolSize
        SharedSectionの1番目:「標準ヒープの容量」のサイズ
        SharedSectionの2番目:「インターラクティブ・ヒープの容量」のサイズ
      • ターミナル・サービスのデスクトップ・ヒープが枯渇している場合
        ターミナル・サービスでは「全デスクトップ・ヒープの容量」のサイズが小さめに設定されている。
        これを拡大すると、ターミナル・サービスの同時接続可能セッション数を圧迫したりする可能性がある。(カーネル・メモリ領域を圧迫するため)
  • @IT:Windows TIPS > ターミナル・サービスでアプリケーションが正しく動かない

移行メモ(正誤): 原文はデスクトップ・ヒープ各領域のサイズを ...\Memory Management\SessionPoolSizeSharedSection で設定すると記載しているが、 SharedSection を持つのは実際には HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems\Windows の値(Windows サブシステムの起動行)中の SharedSection=x,y,z パラメタ。 SessionViewSize / SessionPoolSize はセッション ビュー空間 / セッション ページ プールの サイズを指定する別の値で、SharedSection は持たない。 「1番目=標準ヒープ、2番目=インタラクティブ・ヒープ、3番目=非インタラクティブ・ヒープ」 という原文の対応関係自体は正しい。

USERオブジェクト、GDIオブジェクト

  • USERオブジェクト:デスクトップ・ヒープを消費
  • GDIオブジェクト:ページ プール、セッション プールを消費

タスクマネージャ

Sysinternals Process Explorer

  • Windows Sysinternals > Process Explorer

    GDIオブジェクトの数、また、GDIオブジェクトが消費するプールの上限値を確認できる(ただしWinDbgをインストールして、シンボルサーバを設定する必要がある)。

Sysinternals Testlimit

Sysinternals の Testlimitユーティリティを実行すると、USERオブジェクト、GDIオブジェクト数の制限を
簡単に確認することができる(可能な限り USERオブジェクト、GDIオブジェクトを作成する)。

  • infoq .NETのメモリリークに対処する

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
    USERProcessHandleQuotaとGDIProcessHandleQuotaには、ひとつのプロセスが利用できる
    最大のUSERオブジェクトとGDIオブジェクトの数が設定されている。デフォルトの値は其々10,000。
    #1つのセッションで作成できる USERオブジェクト、GDIオブジェクト数に対する制限は其々65,535

GDIView

その他


Tags: インフラストラクチャ, Windows, 障害対応, 性能, デバッグ, ツール類

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally