手順 3 - ブート時のドライバー占有領域と動的割り当てを追跡する
プールは、OS およびデバイス ドライバーがデータ構造を格納するために使用するカーネル モード コンポーネントのメモリ リソースです。 プールには、次の 4 つの基本的な割り当て領域があります。
非ページ プール: 物理メモリ内に存在することが保証される割り当て。
ページ プール: メモリからページ ファイルにページ アウトできる割り当て。
NX 非ページング プール: 非ページ割り当て。これは実行できません。
セッション プール: セッションごとに行われる割り当て。 これらはページング可能です。
プールの使用量は、コンピューターの全体的なメモリ使用量に対して多大な影響を及ぼします。これは、起動直後にメモリを最も使用します。 プール使用率を削減すると、OS 全体にわたってシステムのメモリ使用量が削減されます。これにより、削減を促進するために、ページング不可能なメモリが最も優先順位の高いカテゴリになります。
この演習では、起動中に受信トレイの Microsoft ドライバーの割り当てとそのフットプリント (初期化時) を確認します。
手順 1: ブート移行全体でプール メモリ トレースを収集する
この手順では、プールと常駐セットデータを含む Windows パフォーマンスレコーダー (WPR) を使用して、ブート トレースを収集します。
[スタート] メニューから WPR を開きます。
適切なイベント プロバイダーを選択します。
プールの使用状況
常駐セット
最初のレベルのトリアージ
[パフォーマンス シナリオ] で [ブート] を選択します。
[ログ モード] で [ファイル] を選択します。
[イテレーションの数] で「1」を設定します。
[スタート] をクリックし、ETL ファイルを保存する場所を選択します。
システムが自動的に再起動され、トレースが収集され、デスクトップが表示されると停止します。
手順 2: WPA を使用してプール データを確認する
プール データは、WPA のプール グラフ概要表に示されます。 以下の表に主な列の説明を示します。
列ヘッダーを右クリックして、列の追加や削除を行うことができます。
用語 | 説明 |
---|---|
プール タグ | プール割り当てに関連付けられているタグ。 |
プール タグ モジュール | プール タグに関連付けられているモジュール (ドライバー)。 |
スタック | メモリ割り当てへのスレッドのコード パスを示します。 |
ページ | 割り当てがページ プールまたは非ページ プールのどちらに配置されたかを示します。 |
影響を与える型 | 割り当てが安定した状態のメモリ使用量に影響を及ぼすものであるか、一時的な割り当てであるかを示します。 |
WPA で、手順 1 で取得したトレースを開きます。
[トレース] メニューを開き、[Configure symbols path (シンボル パスの構成)] を選択します。
- シンボル キャッシュのパスを指定します。 シンボルの詳細については、MSDN のシンボル サポートに関するページを参照してください。
[トレース] メニューを開き、[シンボルの読み込み] を選択します。
[グラフ エクスプローラー] の [メモリー] カテゴリで [プール] グラフを見つけます。
[プール] グラフを [分析] タブまでドラッグ アンド ドロップします。
以下の列が表示されるように、表を整理します。
プール タグ モジュール
ページ
影響を与える型
Stack
プール タグ
Count
影響を与えるサイズおよびサイズ
**プール タグに関する注意: **
ドライバー開発者は、分析を容易に行えるように、ドライバーによって使用されるプール タグが明確で識別しやすいものであることを確認してください。 たとえば、会社名が Fabrikam である場合、すべてのプール タグに「Fbk」というプレフィックスを付けて、FbkPool1、FbkPool2、FbkBuffer のようにすることができます。
グラフのすべてのシリーズを無効にします (右クリック - >[無効化] ->[In Entire Graph (グラフ全体)] ->[すべてのシリーズ])。
[影響を与えるサイズ] 列ヘッダーをクリックして、影響を与えるサイズを並べ替えます。
メモリ使用率が最も安定した状態のドライバーが最上部に表示されます。
手順 3: プール割り当てデータをインターセプトする
タイムラインの最初の30秒にズームします。
1 つのドライバーを選択します (ACPI.sys など)。
NonPaged メモリを確認し、行を展開します。
NonPaged メモリは、システムでメモリが不足しているときにページファイルに移動できないため、調査に重点を置く必要があります。
影響を与えるカテゴリと一時的なカテゴリの [凡例] を有効にします。
列ヘッダーをクリックして、[影響を与えるサイズ] を基準に並べ替えます。
影響を与えるメモリは、常にドライバーの全体的なメモリ フットプリントに直接影響を及ぼします。 前の例では、ACPI.sys が常にいくつかのページングされていないメモリを使用し、この安定した状態の使用率が 2 回上昇することがわかります (最初はドライバーのロード時、2 回目はその約 3 後)。
スタックを展開し、移動します。 上部に、最大の安定した状態のプール割り当てにつながる関数呼び出しが表示されます。
以下の例では、ACPI.sys によって合計 255 のプール割り当てが行われており、ACPIInitStartACPI 関数で合計 1.2 MB が使用されることがわかります。 この関数はドライバー割り当ての大部分を占めるため、ドライバーの安定したメモリ使用量を改善するために、ドライバー開発者はこの点に注目する必要があります。
列ヘッダーをクリックして、[サイズ] を基準に並べ替えます。
[一時的] カテゴリについても、同じ操作を行います。 スタックを展開し、移動します。 上部に、最大の一時的プール割り当てにつながる関数呼び出しが表示されます。
次の例では、一時的なメモリ使用量の初期スパイクが主に ACPI がデバイスの DPC を実行していることが原因で発生することがわかります (ACPI.sys!ACPIBuildDeviceDpc)。 この関数呼び出しによるコードで生じたスパイクは合計で 455 KB になります。
手順 4: ドライバーのコード フットプリントを測定する
[グラフ エクスプローラー] の [メモリー] カテゴリで [常駐セット] グラフを見つけます。
[常駐セット] グラフを [分析] タブまでドラッグ アンド ドロップします。
グラフのズームを解除してください (Ctrl+Shift+”-“)。
[File Backed Page (ファイル バック ページ)] グラフのプリセットを選択します。
[パス ツリー] 列を使用して、手順 3 で選択したドライバーに移動します (C:/Windows/drivers の下にある ACPI.sys など)。
[ドライバー] カテゴリを展開し、[アクティブ] ページに注目します。
[サイズ] 列の値は、ドライバーのコードがメモリ フットプリントに及ぼす影響を表しています。 次の例では、0.48 MB です。