-
Notifications
You must be signed in to change notification settings - Fork 0
MS_TroubleshootingToolsList
-
TOP > トラブルシュート > 障害発生時の分析
- 障害対応に使用するツールの一覧
- ダンプ取得に使用するツールの一覧
障害対応で使用する、監視・プロファイル・デバッグ系ツールを用途別に纏めています。
移行メモ: 本ページは 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 OS付属の簡易的な各種リソース監視ツール。
プロセス監視(各種イベント監視)
-
Windows Sysinternals > Process Monitor
FileMon や Regmon を統合した、特定のカーネルの
(ファイルシステム、レジストリ、プロセス/スレッド、ネットワーク)
イベント(アクセス)のキャプチャフィルタ、ハイライト表示設定、ロギングが可能。 -
参考
プロセス監視 / ハンドル数調査 / ユーザモードダンプ取得
-
Windows Sysinternals > Process Explorer
- プロセスツリー、タイプ、使用しているDLL、ハンドル、
イメージ(EXE)、性能情報、TCP/IPソケット、.NETバージョンなどの
様々な情報の確認できる。また、使用しているDLL、ハンドルの検索機能も持つ。 - プロセスの開始・終了、ユーザ・モード・プロセス・ダンプの取得も可能(ハングダンプ相当)。
- GDIオブジェクトの数、また、GDIオブジェクトが消費するプールの上限値を確認できる。
(ただし、これにはWinDbgをインストールして、シンボルサーバを設定する必要がある)
- プロセスツリー、タイプ、使用しているDLL、ハンドル、
このプログラムの GUI ベースのバージョンは、Process Explorer
例えば。
- SQL Server系(SQL Server 問題の分析方法:
MS_SQLServerProblemAnalysis.md)
クラスタログ
- Wireshark(
MS_WiresharkUsage.md)- パケットキャプチャとパケット分析
- 管理:マクロ分析、プロファイル:ミクロ分析
- ネットワークモニタツール
- Wireshark(
MS_WiresharkUsage.md)
- Wireshark(
- 負荷分散装置のログ
- ファイアウォール装置のログ
- スイッチのログ
トレースデータを採取するコンポーネント
トレースデータを GUI で表すコンポーネント
- OS機能によるアプリのパフォーマンス測定 - @IT
- 新しくなった Windows Performance Analyzer(Japan WDK Support Blog)
※ WPR / WPA は現在 Windows ADK(Windows Performance Toolkit)に含まれる。
- WinDbg
- CDB
- NTSD
- KD
- , etc.
- ADPlus : Auto Dump+
- UMDH:User Mode Dump Heap
- Visual Studioデバッガ
- VS2005パフォーマンスツール
- パフォーマンス Visual Studio プロファイラでアプリケーションのボトルネックを見つける
- Visual Studioプロファイラ
Visual Studio 2010 Premium / Ultimate付属のマネージド・コード・プロファイラ
※ 現行は Visual Studio の「パフォーマンス プロファイラー」(Alt+F2)に統合されており、 CPU 使用率・メモリ割り当て・.NET オブジェクト割り当てなどを Community でも計測できる。
マネージド・コード・プロファイラ(メソッドの呼出回数・時間、メモリ割当・消費、オブジェクト接続・ルート追跡)
マネージド・コード・プロファイラ(ライブ・デバッグ & ダンプ分析)(.NETのメモリ・リーク)
マネージド・コード・プロファイラ(スレッド ダンプ)
-
Managed Stack Explorer(CodePlex、閉鎖済み)
- マネージスレッドのダンプを取得可能。
- ハングやデッドロック箇所の調査などにも利用できる。
-
.NET Framework スレッドダンプ | Jurabi
C#アプリでデットロックぽい問題が発生したと聞いて.NETでのスレッドダンプ調べてみました。
元ネタはここです。
https://stackoverflow.com/questions/190236/how-do-i-make-a-thread-dump-in-net-a-la-jvm-thread-dumpsManaged Stack Explorerを使う方法とWinDbgを使う方法紹介されてますが、
WinDbgはデバッカだし、簡単なManaged Stack Explorerを使う方法について書いてみたいと思います。
マネージド・コード・プロファイラ
- 商用: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)が引き続き現役。
アンマネージドコードプロファイラ
カーネルモードドライバのデバッグ/メモリ分析
カーネルモードドライバのメモリ分析
デスクトップ・ヒープのメモリ分析
【】内はVista以降
- 合計(システム)
リソースの数- ハンドル
- スレッド
- プロセス
- 【起動時間】
- 【ページ・ファイル、コミット】
- 物理メモリ
物理メモリのサイズ- 合計
- 利用可能【空きメモリ】:
- 利用可能な物理メモリ(空き) →
Memory\Available Bytes - 未使用ページリスト、ゼロページリスト、スタンバイ リストの合計
- 利用可能な物理メモリ(空き) →
- システムキャッシュ【キャッシュ済み】:
以下の5種類のワーキングセットの合計- システム キャッシュ ページ
- ページ プール
- Ntoskrnl.exe 内のページング可能なコードとデータ
- デバイス ドライバ内のページング可能なコードとデータ
- システム マップドビュー
- コミット チャージ
仮想メモリのサイズ →Memory\Committed Bytes- 合計
- 制限値
- 最大値
- カーネル メモリ
カーネル モードで使用しているメモリのサイズ- 合計
- ページ
- 非ページ
- 仮想メモリ
- 仮想メモリサイズ【メモリ - コミット サイズ】
仮想メモリのサイズ(非共有メモリの仮想メモリの使用量)
= コミットされたサイズ、つまりプライベートバイト →Process(*)\Private Bytes - ページ プール【メモリ - ページ プール】
プロセスのページ プールのサイズ - 非ページ プール【メモリ - 非ページ プール】
プロセスの非ページ プールのサイズ
- 仮想メモリサイズ【メモリ - コミット サイズ】
- 物理メモリ(ワーキング セット)
以下のメモリ使用量は、トリミング可能なスペースも含めたワーキング セット全体のサイズを表示しており、他のプロセスの実行状態によって増減するので仮想メモリ(メモリ使用状況)を確認するための値としては適切ではない。- メモリ使用量【メモリ - ワーキング セット】
当該プロセスの物理メモリ使用量【ワーキング セット】のサイズ - 最大メモリ使用量【メモリ - ピーク ワーキング セット】
当該プロセスを起動してから現在までにおける、物理メモリ使用量【ワーキング セット】の最大値 - メモリ デルタ【メモリ - ワーキング セット デルタ】
プロセスによって使用される物理メモリ使用量【ワーキング セット】使用量の変化量。 - 【メモリ - プライベート ワーキング セット】
プロセスが使用しているワーキング セットのうち、
他のプロセスと共有できない(=トリミングできない)容量だけを表すサブセット
※ XP、2003には存在しない。
- メモリ使用量【メモリ - ワーキング セット】
- リソース
- ハンドルの数
- スレッドの数
- USERオブジェクト
- GDIオブジェクト
- 必要メモリ・サイズを見極める - @IT
- 最適なページ・ファイル・サイズを知るには - @IT
- タスク・マネージャのパフォーマンス・タブの見方(Windows Vista/Windows Server 2008編)
- タスク・マネージャのパフォーマンス・タブの見方(Windows 7/Windows Server 2008 R2編)
パフォーマンス カウンタを参照。
UMDH:User Mode Dump Heap
- .NETのAPI
-
現在割り当てられていると思われるバイト数を取得する。
-
強制的にガベージ コレクションを行う(推奨しない)。
System.GC.Collect(); // GC強制実行 System.GC.WaitForPendingFinalizers(); // 非同期ファイナライザの実行を待つ System.GC.Collect(); // GC強制実行(ファイナライザ完了後のメモリ開放)
-
-
マネージド・プロファイラ
- Visual Studioプロファイラ
- CLR Profiler
- SOS.dll(SOS拡張)
- Managed Stack Explorer
- DevPartner Studio
- ダンプ+WinDbg
- ダンプ+WinDbg+SOS拡張(SOS.dll)(.NETのメモリ・リーク)
-
Kernel Memory Space Analyzer
一般ユーザーのために設計されていないことに注意してください。カーネル・デバッガに既に精通しておりウィンドウズの内部についての知識を持っており、カーネル・モード・プログラムをデバッグする基礎的な技術を持っているユーザを想定しています。
- タスクマネージャ
- パフォーマンスカウンタ
-
Sysinternals Handle
カーネル オブジェクトのハンドル(リソースリーク)確認。
このプログラムの GUI ベースのバージョンは、Process Explorer
ページ プールと非ページ プール、およびターミナル サービス セッション用に
使用されるメモリ プールからのメモリ割り当てに関してOSが収集するデータを表示する。
これによりカーネルモードで動作するモジュール(ドライバ)のリーク問題を検出可能(必要に応じてgflagsを設定することで割り当ての際に、ドライバをある程度識別可能なTagが付与される)。
- Memory Pool Monitor (Poolmon.exe) を使用してカーネル モードのメモリ リークのトラブルシューティングを行う方法(KB177415)
- サードパーティ製のドライバによって使用されているプール タグの検索方法(KB298102)
- Pool tag list(TechNet Blogs)
プール・トラッキング機能を有効にした状態で(プールトラッキング機能は負荷があるので、本番に適用する場合は検証が必要)
- カーネル メモリダンプや、
- 完全メモリダンプで
カーネル メモリ スペースをダンプ出力し、これを分析することでカーネルドライバのメモリ・リークを確認する。
-
仮想化した世界 Sysinternals 「Notmyfault」
基本的にはブルースクリーンを発生させるためのツールであるが、この他にも、指定した増分値で非ページ プールまたはページ プールのいずれかにリークを発生させるオプションがある。
-
How many application pools can you cope with(MSDN Blogs)
Desktop Heap Monitorで、Service-0x0-3e7$\Default の情報が、Session 0 へログインしないと確認できない件。
当該デスクトップの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番目:「インターラクティブ・ヒープの容量」のサイズ - ターミナル・サービスのデスクトップ・ヒープが枯渇している場合
ターミナル・サービスでは「全デスクトップ・ヒープの容量」のサイズが小さめに設定されている。
これを拡大すると、ターミナル・サービスの同時接続可能セッション数を圧迫したりする可能性がある。(カーネル・メモリ領域を圧迫するため)
- 同時実行サービス数が多い
- サーバのSession0のノン・インタラクティブ・ヒープが枯渇している場合
- @IT:Windows TIPS > ターミナル・サービスでアプリケーションが正しく動かない
移行メモ(正誤): 原文はデスクトップ・ヒープ各領域のサイズを
...\Memory Management\SessionPoolSizeのSharedSectionで設定すると記載しているが、SharedSectionを持つのは実際にはHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems\Windowsの値(Windows サブシステムの起動行)中のSharedSection=x,y,zパラメタ。SessionViewSize/SessionPoolSizeはセッション ビュー空間 / セッション ページ プールの サイズを指定する別の値で、SharedSectionは持たない。 「1番目=標準ヒープ、2番目=インタラクティブ・ヒープ、3番目=非インタラクティブ・ヒープ」 という原文の対応関係自体は正しい。
- USERオブジェクト:デスクトップ・ヒープを消費
- GDIオブジェクト:ページ プール、セッション プールを消費
-
Windows Sysinternals > Process Explorer
GDIオブジェクトの数、また、GDIオブジェクトが消費するプールの上限値を確認できる(ただしWinDbgをインストールして、シンボルサーバを設定する必要がある)。
Sysinternals の Testlimitユーティリティを実行すると、USERオブジェクト、GDIオブジェクト数の制限を
簡単に確認することができる(可能な限り USERオブジェクト、GDIオブジェクトを作成する)。
-
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
USERProcessHandleQuotaとGDIProcessHandleQuotaには、ひとつのプロセスが利用できる
最大のUSERオブジェクトとGDIオブジェクトの数が設定されている。デフォルトの値は其々10,000。
#1つのセッションで作成できる USERオブジェクト、GDIオブジェクト数に対する制限は其々65,535
Tags: インフラストラクチャ, Windows, 障害対応, 性能, デバッグ, ツール類
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。