「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>障害発生時の分析]]

* 目次 [#p7fb3757]
#contents

*概要 [#pbf59353]
*ツールの利用ポイント [#x78d9125]
監視・プロファイル ツールやサポートツールは、「[[サーバーの監視]]」のフローチャート中の
-原因の把握、解決策の決定
-サポートを活用して解決策を決定する。

の部分で使用します。

障害対応のノウハウと利用可能なツールを把握しておくことで、
-問題発生時に、セルフ・サポートが可能になります。
-また、セルフ・サポートが困難な場合もサポート・エンジニアとの連携がスムーズになります。
--サポート・エンジニアと連携可能な範囲はどこか?
--サポート・エンジニアに提供してもらえる情報は何か?
--サポート・エンジニアに提供すべき情報は何か?

*システム情報収集 [#x9ed5bd5]
**[[イベント・ログ]] [#l83a5356]

**[[MPS_Report>ログ収集いろいろ#e4a7bc64]] [#mbf12952]

*監視系 [#oabba159]
**各種リソース [#gbf18194]
***[[パフォーマンス カウンタ]] [#cf3ec39c]
[[こちら>パフォーマンス カウンタ]]を参照。

***Windowsタスクマネージャ [#g51bcec3]
WindowsOS付属の簡易的な各種リソース監視ツール。

-物理
--CPU
--[[物理メモリ>物理メモリ管理]]
--ネットワーク

-論理
--[[仮想メモリ>仮想メモリ管理]]
--プロセス
--スレッド

**プロセス監視 [#o6ab3a4f]

***Process Monitor [#n72fadf5]
プロセス監視(各種イベント監視)

-Windows Sysinternals > ダウンロード > プロセス > Process Monitor~
http://technet.microsoft.com/ja-jp/sysinternals/bb896645
>FileMon や Regmon を統合した、特定のカーネルの~
(ファイルシステム、レジストリ、プロセス/スレッド、ネットワーク)~
イベント(アクセス)のキャプチャフィルタ、ハイライト表示設定、ロギングが可能。

***Process Explorer [#m8c2fc85]
プロセス監視 / ハンドル数調査 / ユーザモードダンプ取得

-Windows Sysinternals > ダウンロード > プロセス > Process Explorer~
http://technet.microsoft.com/ja-jp/sysinternals/bb896653

--プロセスツリー、タイプ、使用しているDLL、ハンドル、~
イメージ(EXE)、性能情報、TCP/IPソケット、.NETバージョンなどの~
様々な情報の確認できる。また、使用しているDLL、ハンドルの検索機能も持つ。

--プロセスの開始・終了、ユーザ・モード・プロセス・ダンプの取得も可能(ハングダンプ相当)。

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

***Sysinternals Handle [#wac7e7c1]
-Windows Sysinternals > ダウンロード > プロセス > Handle~
http://technet.microsoft.com/ja-jp/sysinternals/bb896655~

このプログラムの GUI ベースのバージョンは、[[Process Explorer>#m8c2fc85]]

***アプリケーション固有ログ [#m5b11535]
[[例えば>http://opentouryo.osscons.jp/index.php?%E6%A9%9F%E8%83%BD%E4%B8%80%E8%A6%A7#u9bb0faa]]。

**DB監視 [#wad84151]
-[[SQL Server系>SQL Server 問題の分析方法]]

**WAS監視 [#p8a3220e]
-[[IISのログ]]

**クラスタ監視 [#wa82546f]
クラスタログ

**ネットワーク監視・プロファイル [#lfa663b2]
***ツール [#g8c2d67a]
-[[Wireshark>Wiresharkの操作方法]]
--パケットキャプチャとパケット分析
--管理:マクロ分析、プロファイル:ミクロ分析

***ログ [#m083bdcf]
-ネットワークモニタツール
--[[Wireshark>Wiresharkの操作方法]]
-負荷分散装置のログ
-ファイアウォール装置のログ
-スイッチのログ

*デバッグ ツールセット [#ie186d18]

**Debugging Tools for Windows [#vd4048ce]

***Windows Performance Recorder (WPR) [#mc9ff947]
トレースデータを採取するコンポーネント

***Windows Performance Analyzer (WPA) [#m8f1da19]
トレースデータを GUI で表すコンポーネント

-OS機能によるアプリのパフォーマンス測定 - @IT~
http://www.atmarkit.co.jp/fdotnet/chushin/vsperf_01/vsperf_01_01.html
-新しくなった Windows Performance Analyzer - Japan WDK Support Blog - Site Home - MSDN Blogs~
http://blogs.msdn.com/b/jpwdkblog/archive/2014/11/28/windows-performance-analyzer.aspx

**ライブ・デバッグ・ダンプ取得・分析 [#k6d92aff]
***[[WinDbg]] [#s581d480]
***CDB [#td8a5164]
***NTSD [#nbffbe63]
***KD [#d874e24d]
***,etc. [#a07574cd]

**IISライブ・デバッグ、ダンプ取得・分析 [#w71b9232]
***[[ADPlus]] [#l96fd278]
[[ADPlus]] : Auto Dump+

**アンマネージド・ヒープ解析 [#u83249cc]
***[[UMDH]] [#td11cbd2]
[[UMDH]]:User Mode Dump Heap

*プロファイラ [#j595e8e5]
**ユーザモード [#weac277d]
***Visual Studio [#o9189a2c]
-Visual Studioデバッガ

-VS2005パフォーマンスツール~
--パフォーマンス Visual Studio プロファイラでアプリケーションのボトルネックを見つける~
http://msdn.microsoft.com/ja-jp/magazine/cc337887.aspx

-Visual Studioプロファイラ~
Visual Studio 2010 Premium / Ultimate付属のマネージド・コード・プロファイラ

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

-How To 情報 CLR プロファイラの使用方法~
http://msdn.microsoft.com/ja-jp/library/ff650691.aspx
-.NET ガベージ コレクション ヒープをプロファイリングする~
http://msdn.microsoft.com/ja-jp/magazine/ee309515.aspx

***[[SOS.dll>.NETのメモリ・リーク]](SOS拡張) [#wc33a7cb]
マネージド・コード・プロファイラ(ライブ・デバッグ & ダンプ分析)

***Managed Stack Explorer [#c1b893e4]
マネージド・コード・プロファイラ(スレッド ダンプ)

-Managed Stack Explorer~
http://mse.codeplex.com/
--マネージスレッドのダンプを取得可能。
--ハングやデッドロック箇所の調査などにも利用できる。

-.NET Framework スレッドダンプ  Urabi~
http://www.jurabi.jp/blog/2010/01/922

>C#アプリでデットロックぽい問題が発生したと聞いて.NETでのスレッドダンプ調べてみました。

>元ネタはここです。~
http://stackoverflow.com/questions/190236/how-do-i-make-a-thread-dump-in-net-a-la-jvm-thread-dumps

>Managed Stack Explorerを使う方法とWinDbgを使う方法紹介されてますが、~
WinDbgはデバッカだし、簡単なManaged Stack Explorerを使う方法について書いてみたいと思います。

***DevPartner Studio [#x44595c8]
マネージド・コード・プロファイラ

***その他のマネージド・コード・プロファイラ [#i354c815]
-商用:dotTRACE~
http://www.jetbrains.com/profiler/index.html 
-無償:NProf~
http://sourceforge.net/projects/nprof/ 
-無償:EQATEC Profiler~
http://www.eqatec.com/tools/profiler 

***Rational PurifyPlus for Windows [#e4e4fea7]
アンマネージドコードプロファイラ

-IBM Rational PurifyPlus (ランタイム分析ツール) - Japan~
http://www-06.ibm.com/software/jp/rational/products/purifyp/

**カーネルモード [#d9762d76]
***プロファイラ [#d18fbf7a]

***Driver Verifier [#uac2c965]
カーネルモードドライバのデバッグ/メモリ分析

-Driver Verifier を使用して Windows ドライバをトラブルシューティングする方法~
https://support.microsoft.com/ja-jp/kb/244617

***Memory Pool Monitor [#i010a5aa]
カーネルモードドライバのメモリ分析

***Desktop Heap Monitor [#qf3f8a28]
[[デスクトップ・ヒープ]]のメモリ分析

*メモリ・リーク [#ib2a61d9]
**タスクマネージャ [#b25b83fe]
***「パフォーマンス」タブ [#wd68026b]
【】内はVista以降

-合計(システム)~
リソースの数
--ハンドル
--スレッド
--プロセス
--【起動時間】
--【ページ・ファイル、コミット】

-物理メモリ~
物理メモリのサイズ
--合計
--利用可能【空きメモリ】:
---利用可能な物理メモリ(空き) → Memory\Available Bytes
---未使用ページリスト、ゼロページリスト、スタンバイ リストの合計
--システムキャッシュ【キャッシュ済み】:~
以下の次の 5 種類のワーキングセットの合計
---システム キャッシュ ページ
---ページ プール
---Ntoskrnl.exe 内のページング可能なコードとデータ
---デバイス ドライバ内のページング可能なコードとデータ
---システム マップドビュー

-コミット チャージ~
仮想メモリのサイズ → Memory\Commited Bytes
--合計
--制限値
--最大値

-カーネル メモリ~
カーネル モードで使用しているメモリのサイズ
--合計
--ページ
--非ページ

***「プロセス」タブ [#k49b6bb2]
-仮想メモリ
--仮想メモリサイズ【メモリ - コミット サイズ】~
仮想メモリのサイズ(非共有メモリの仮想メモリの使用量)~
= コミットされたサイズ、つまりプライベートバイト → Process(*)\Private Bytes
--ページ プール【メモリ - ページ プール】~
プロセスのページ プールのサイズ
--非ページ プール【メモリ - 非ページ プール】~
プロセスの非ページ プールのサイズ

-物理メモリ(ワーキング セット)~
以下のメモリ使用量は、トリミング可能なスペースも含めたワーキング セット全体のサイズを表示しており、他のプロセスの実行状態によって増減するので仮想メモリ(メモリ使用状況)を確認するための値としては適切ではない。

--メモリ使用量【メモリ - ワーキング セット】~
当該プロセスの物理メモリ使用量【ワーキング セット】のサイズ

--最大メモリ使用量【メモリ - ピーク ワーキング セット】~
当該プロセスを起動してから現在までにおける、物理メモリ使用量【ワーキング セット】の最大値

--メモリ デルタ【メモリ - ワーキング セット デルタ】~
プロセスによって使用される物理メモリ使用量【ワーキング セット】使用量の変化量。

--【メモリ - プライベート ワーキング セット】~
プロセスが使用しているワーキング セットのうち、
他のプロセスと共有できない(=トリミングできない)容量だけを表すサブセット
※ XP、2003には存在しない。

-リソース
--ハンドルの数
--スレッドの数
--USERオブジェクト
--GDIオブジェクト

***参考資料 [#rb689104]
-必要メモリ・サイズを見極める - @IT~
http://www.atmarkit.co.jp/fwin2k/win2ktips/166memoryusage/memoryusage.html
-最適なページ・ファイル・サイズを知るには - @IT~
http://www.atmarkit.co.jp/fwin2k/win2ktips/076pgfilesize/076pgfilesize.html
-タスク・マネージャのパフォーマンス・タブの見方(Windows Vista/Windows Server 2008編)~
http://www.atmarkit.co.jp/fwin2k/win2ktips/1209taskv/taskv.html
-タスク・マネージャのパフォーマンス・タブの見方(Windows 7/Windows Server 2008 R2編)~
http://www.atmarkit.co.jp/fwin2k/win2ktips/1219taskv7/taskv7.html
-タスク マネージャのメモリ列の意味~
http://windows.microsoft.com/ja-JP/windows-vista/What-do-the-Task-Manager-memory-columns-mean

**[[パフォーマンス カウンタ]] [#hc43b0ca]
[[こちら>パフォーマンス カウンタ#dd0600b7]]を参照。

**ヒープ解析 [#ze4de53c]
***アンマネージド [#n9a6779a]
[[UMDH]]:User Mode Dump Heap

***マネージド [#g5cf2388]
-.NETのAPI
--GC.GetTotalMemory メソッド~
http://msdn.microsoft.com/ja-jp/library/system.gc.gettotalmemory.aspx
>現在割り当てられていると思われるバイト数を取得する。

--GC.Collect メソッド~
http://msdn.microsoft.com/ja-jp/library/system.gc.collect.aspx
>強制的にガベージ コレクションを行う(推奨しない)。
 System.GC.Collect(); // GC強制実行
 System.GC.WaitForPendingFinalizers(); // 非同期ファイナライザの実行を待つ
 System.GC.Collect(); // GC強制実行(ファイナライザ完了後のメモリ開放

-[[マネージド・プロファイラ>#weac277d]]
--[[Visual Studioプロファイラ>#o9189a2c]]
--[[CLR Profiler>#a7c9eec5]]
--[[SOS.dll(SOS拡張)>#wc33a7cb]]
--[[Managed Stack Explorer>#c1b893e4]]
--[[DevPartner Studio>#x44595c8]]

**ダンプ解析 [#c07a7548]
***アンマネージド [#af66fd43]
-ダンプ+WinDbg

***マネージド [#p29ad573]
-ダンプ+WinDbg+[[SOS拡張(SOS.dll)>.NETのメモリ・リーク#mfaa3ea9]]

**カーネル メモリ スペース [#y8c4f7b3]
-Kernel Memory Space Analyzer~
http://www.microsoft.com/en-us/download/details.aspx?id=15877

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

**カーネル オブジェクトのハンドル [#gcedae15]
***タスクマネージャ [#i555696c]
***パフォーマンスカウンタ [#pa44bd4d]
***Sysinternals Handle [#q4430eba]
カーネル オブジェクトのハンドル(リソースリーク)確認	

-Windows Sysinternals > ダウンロード > プロセス > Handle~
http://technet.microsoft.com/ja-jp/sysinternals/bb896655~

このプログラムの GUI ベースのバージョンは、[[Process Explorer>#m8c2fc85]]

**メモリ プール(ページ プールと非ページ プール) [#ge3f4778]
***タスクマネージャ、パフォーマンスカウンタ [#f74ed082]

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

-Memory Pool Monitor (Poolmon.exe) を使用して~
カーネル モードのメモリ リークのトラブルシューティングを行う方法~
http://support.microsoft.com/kb/177415/ja
-サードパーティ製のドライバによって使用されているプール タグの検索方法~
http://support.microsoft.com/kb/298102/ja
-Pool tag list - The troubleshooters and problem solvers... - Site Home - TechNet Blogs~
http://blogs.technet.com/b/yongrhee/archive/2009/06/24/pool-tag-list.aspx

***WinDbg+Kdの!poolused拡張コマンド [#e6057348]

***Driver Verifier [#s2550e4c]
プール・トラッキング機能を有効にした状態で(プールトラッキング機能は負荷があるので、本番に適用する場合は検証が必要)
-カーネル メモリダンプや、
-完全メモリダンプで

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

-Driver Verifier を使用して Windows ドライバをトラブルシューティングする方法~
http://support.microsoft.com/kb/244617/ja
-Driver Verifier エラー検出用のドライバー開発者向けツール~
http://msdn.microsoft.com/ja-jp/windows/hardware/gg487310

***Sysinternals Notmyfault [#t6e4b084]
-仮想化した世界 Sysinternals 「Notmyfault」~
http://man-kato.blogspot.jp/2011/11/sysinternals-notmyfault.html

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

**[[デスクトップ・ヒープ]] [#wadec027]
***Desktop Heap Monitor [#va8e9eb5]
-[[デスクトップ・ヒープ]]領域 - Desktop Heap Monitor~
http://yakushima-tonbo.com/windows/etc/dheapmon.html
-How many application pools can you cope with~
Never doubt thy debugger - Site Home - MSDN Blogs~
http://blogs.msdn.com/b/carloc/archive/2008/08/11/how-many-application-pools-can-you-cope-with.aspx

>Desktop Heap Monitorで、Service-0x0-3e7$\Default の情報が、Session 0 へログインしないと確認できない件。

***Windbg+LiveKdの!dskheap拡張コマンド [#lcc18d3e]
-Windows Sysinternals > ダウンロード > システム情報 > LiveKd~
http://technet.microsoft.com/ja-jp/sysinternals/bb897415

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

***チューニング方法 [#m9312988]
-領域のサイズ変更を伴わないチューニング
--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 > ターミナル・サービスでアプリケーションが正しく動かない~
http://www.atmarkit.co.jp/fwin2k/win2ktips/458ts2003err/ts2003err.html

**USERオブジェクト、GDIオブジェクト [#b111a67e]
-USERオブジェクト:[[デスクトップ・ヒープ]]を消費
-GDIオブジェクト:ページ プール、セッション プールを消費

***タスクマネージャ [#bca6c2a3]

***Sysinternals Process Explorer [#rff09c9a]
-Windows Sysinternals > ダウンロード > プロセス > Process Explorer~
http://technet.microsoft.com/ja-jp/sysinternals/bb896653

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

***Sysinternals Testlimit [#w45888b4]

-Download Testlimit.zip~
http://www.filerepair.ca/downloads/t/te/Testlimit.zip-DLL-EXE-Download-Testlimit.zip.html

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

-infoq .NETのメモリリークに対処する~
http://www.infoq.com/jp/news/2009/11/Memory-Leaks-.NET

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

***GDIView [#s10b541a]
-View GDI handles/resources list and detect GDI leaks~
http://www.nirsoft.net/utils/gdi_handles.html

*[[ログ収集いろいろ]] [#t6cce1a5]

*[[ダンプ取得に使用するツールの一覧]] [#j63663f8]

----
Tags: [[:Windows]], [[:障害対応]], [[:性能]], [[:デバッグ]]

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS