[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]

* 目次 [#p7fb3757]
#contents

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

の部分で使用します。

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

*ツール一覧 [#oabba159]

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

***Windowsタスクマネージャ [#g51bcec3]
WindowsOS付属の簡易プロセス監視ツール。

***パフォーマンスモニタ [#cf3ec39c]
WindowsOS付属のプロセス監視ツール。

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

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

**DB監視 [#wad84151]
***Management Studio [#s8413243]
-クエリ・アナライザ → クエリ・エディタ
-SQLプロファイラ(SQLトレース)
-インデックスチューニングウィザード → データベース・エンジン・チューニング・アドバイザ
-システムテーブル/動的管理ビュー
-レポート(各種 標準レポート、Performance Dashboard Reports)

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

**システム情報収集 [#x9ed5bd5]
***Microsoft Product Support Report [#mbf12952]
各種ログの収集ツール(各製品毎のエディションが用意されている)

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

***Debugging Tools for Windows [#vd4048ce]

***ライブ・デバッグ・ダンプ取得・分析 [#k6d92aff]
WinDbg、CDB、NTSD、KD.etc

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

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

**ユーザモード プロセスダンプ [#j046409f]

***UMPD(User Mode Process Dumper ) [#w441fc1d]
ユーザモードプロセスダンプ取得

***WER(Windows Error Reporting) [#q310ee41]
Windowsエラーレポートの情報を取得

**ダンプサマリ [#od6ccd01]
***Dumpchk.exe [#k3a902b5]
メモリ ダンプ ファイルの簡易検証

***Debug Diagnostics [#c8776093]
ユーザモードプロセスダンプの取得・分析(サマリの生成)

**ユーザモード [#weac277d]
***Visual Studioプロファイラ [#o9189a2c]
Visual Studio 2010 Premium / Ultimate付属のマネージドコードプロファイラ

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

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

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

***Handle [#wac7e7c1]
ハンドル数調査

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

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

**カーネルモード [#d9762d76]
***プロファイラ [#d18fbf7a]
Driver Verifierカーネルモードドライバのデバッグ/メモリ分析

***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]
***メモリ空き容量 [#dc151d10]
未使用ページリスト、ゼロページリスト、スタンバイ リストの合計

-Memory\Available Bytes:~
バイト単位の空きメモリのサイズ
-Memory\Available Kbytes:~
キロバイト単位の空きメモリのサイズ
-Memory\Available Mbytes:~
メガバイト単位の空きメモリのサイズ

-Memory\Pool Paged Bytes:~
ページ プールのサイズ
-Memory\Pool Nonpaged Bytes:~
非ページ プールのサイズ

-Memory\Commited Bytes:~
コミットされた仮想メモリのサイズ

***メモリ使用量@プロセス毎 [#hb532bab]
-Process(*)\Private Bytes:~
コミットされた仮想メモリのサイズ(他のプロセスと共有できない
-Process(*)\Virtual Bytes:~
コミットと予約の双方の含む仮想メモリのサイズ
-Process(*)\Working Set:~
使用物理メモリのサイズ(他のプロセスと共有している部分も含む)

-Process(*)\Pool Paged Bytes:~
ページ プールのサイズ
-Process(*)\Pool Nonpaged Bytes:~
非ページ プールのサイズ

***マネージメモリ@プロセス毎 [#j8baf58d]
-.NET CLR Memory\# Bytes in all Heaps:
--GCヒープに割り当てられたコミットと予約の双方の含む仮想メモリのサイズ
--Gen 0 Heap Size、Gen 1 Heap Size、Gen 2 Heap Size、および Large Object Heap Size カウンタの合計値

-.NET CLR Memory\Gen 0 heap size:~
Gen 0 に割り当てられる最大の仮想メモリ サイズ(コミットと予約の双方の含む)
-.NET CLR Memory\Gen 1 heap size:~
Gen 1 に割り当てられる最大の仮想メモリ サイズ(コミットと予約の双方の含む)
-.NET CLR Memory\Gen 2 heap size:~
Gen 2 に割り当てられる最大の仮想メモリ サイズ(コミットと予約の双方の含む)
-.NET CLR Memory\Large Object Heap size:~
Large Object Heapに割り当てられる仮想メモリ サイズ(コミットと予約の双方の含む)



-.NET CLR Memory\# Total committed Bytes:~
GCによって現在予約されている仮想メモリのサイズ。
-.NET CLR Memory\# Total reserved Bytes:~
GCによって現在コミットされている仮想メモリのサイズ。

***ハンドルリソースリーク [#ob3c48ea]
-Process(_Total)\Handle Count:~
プロセス全体のオープンされているハンドル数
-Process(_Total)\Thread Count:~
プロセス全体のスレッド数

-Objects\Events:~
イベント数
-Objects\Mutexes:~
ミューテックス数
-Objects\Processes:~
プロセス数
-Objects\Sections:~
セクション数
-Objects\Semaphores:~
セマフォ数
-Objects\Threads:~
スレッド数


***ハンドルリソースリーク@プロセス毎 [#he72852c]
-Process(*)\Handle Count:~
対象プロセスでオープンされているハンドル数
-Process(*)\Thread Count:~
対象プロセスのスレッド数

ハンドルリークはカーネルモードメモリの圧迫につながる。

***マネージソースリーク@プロセス毎 [#bb584e50]
-.NET CLR LocksAndThreads\# of current logical Threads:~


***Heap(パフォーマンス オブジェクト) [#z30f7f98]
-Heap\Committed Bytes:~
ヒープマネージャによるのコミットサイズ
-Heap\Allocs - Frees:~
ヒープの割り当て解放数の差

以下の設定で有効になる。

-Sysmon のヒープ カウンタを有効にする方法~
http://support.microsoft.com/kb/290639/ja

***参考資料 [#bedb96b4]
-パフォーマンス・モニタの使い方(基本編) - @IT~
http://www.atmarkit.co.jp/fwin2k/win2ktips/1229perfmon/perfmon.html
-収集したカウンタ・データをパフォーマンス・モニタで表示させる - @IT~
http://www.atmarkit.co.jp/fwin2k/win2ktips/1238perfgraph/perfgraph.html
-パフォーマンス・カウンタのデータをスケジュールに従って収集する~
(Windows XP/Windows Server 2003編) - @IT~
http://www.atmarkit.co.jp/fwin2k/win2ktips/1241schedperf/schedperf.html
-パフォーマンス・カウンタのデータ収集をlogmanコマンドで制御する - @IT~
http://www.atmarkit.co.jp/fwin2k/win2ktips/1246logman/logman.html
-typeperfコマンドでシステムのパフォーマンス・カウンタのデータを収集する - @IT~
http://www.atmarkit.co.jp/fwin2k/win2ktips/1235typeperf/typeperf.html
-収集したパフォーマンス・カウンタ・ログをrelogコマンドで再編集する - @IT~
http://www.atmarkit.co.jp/fwin2k/win2ktips/1247relog/relog.html
-メモリ パフォーマンス カウンター~
http://msdn.microsoft.com/ja-jp/library/x2tyfybc.aspx
-パフォーマンス ログを作成する方法~
http://technet.microsoft.com/ja-jp/library/ms172556(SQL.90).aspx
-第 17 章 「.NET アプリケーション パフォーマンスのチューニング」~
http://msdn.microsoft.com/ja-jp/library/ff647813.aspx

ページングの分析はMemory\Page Read/secを参照する。

**ダンプ解析 [#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~
カーネル オブジェクトのハンドル(リソースリーク)確認	

**メモリ プール(ページ プールと非ページ プール) [#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


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