Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

Windowsで非ページプールメモリの使用量が異常に高い場合の原因と対処法

WindowsのPCやサーバーでは、特定のシステムドライバーがデータをシステムの非ページメモリプールに保存することで、メモリオーバーフローのトラブルが発生することがあります。非ページプール(Non-paged pool)とは、OSのカーネルやドライバーが使用するRAM上のデータ領域のことです。非ページプールはディスク(ページファイル)へスワップされることがなく、常に物理メモリ上にのみ保持されます。

非ページプールの使用量を確認する方法

現在の非ページメモリのサイズは、タスクマネージャーの「パフォーマンス」タブにある「メモリ」セクションで確認できます。以下のスクリーンショットでは、サーバーのメモリのほとんどが使用されており、その大部分を非ページプールの4.2GBが占めています。通常、非ページプールのサイズが200〜400MBを超えることはほとんどありません。非ページプールのサイズが著しく大きい場合は、システムコンポーネントまたはデバイスドライバーのいずれかにメモリリークが発生している可能性が高いといえます。

Windowsで非ページプールメモリの使用量が異常に高い場合の原因と対処法

サーバー上の非ページプールでメモリリークが発生している場合、システムイベントログには次のようなイベントが記録されます。

イベントID:2019
ソース:Srv
説明:The server was unable to allocate from the system nonpaged pool because the pool was empty

多くの場合、この種のメモリリークの原因は、Windowsにインストールされたサードパーティ製ドライバーの不具合です。特にネットワークドライバーであることが多く、大きなファイルをダウンロードした際にプールの使用量が急激に増加しないか、挙動に注目してみてください。

Windowsにおける非ページプールの最大サイズ

  • Windows x64:最大128GB、かつ物理メモリの75%まで
  • Windows x86:最大2GB、かつ物理メモリ(RAM)の75%まで

非ページプールを解放する唯一の手段はWindowsの再起動です。家庭用デバイスであれば許容範囲かもしれませんが、24時間365日稼働するサーバーにとっては、根本的な解決策を見つける必要があります。

この記事の目次:

  • ネットワークデータ使用状況監視ドライバー(NDU)を無効化する
  • PoolMonを使用してカーネルモードのメモリリークを特定する
  • ネットワークアダプタードライバーを最新版に更新する
  • Hyper-Vの役割を無効化する

ネットワークデータ使用状況監視ドライバー(NDU)を無効化する

非ページプールのメモリリークの原因としてよくあるのが、ネットワークアクティビティ監視ドライバー(Network Data Usage:NDU、%WinDir%\system32\drivers\Ndu.sys)とネットワークアダプタードライバーとの非互換性です。特にKiller NetworkやMSI製ネットワークカードのドライバーがNDUドライバーと競合するケースが多く報告されています。このサービスは、Windowsの機能に大きな影響を与えることなく無効化できます。

管理者権限のコマンドプロンプトで以下のコマンドを実行して、NDUサービスを無効化します:

sc config NDU start= disabled

Windowsで非ページプールメモリの使用量が異常に高い場合の原因と対処法

または、レジストリから設定することもできます:

  1. レジストリエディター(regedit.exe)を開きます。
  2. レジストリキー HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Ndu\ に移動します。
  3. Start パラメーターの値を 4 に変更します。

Windowsで非ページプールメモリの使用量が異常に高い場合の原因と対処法

変更を適用した後は、コンピューターを再起動してください。

PoolMonを使用してカーネルモードのメモリリークを特定する

非ページプールでメモリリークを引き起こしているドライバーを特定できる場合があります。そのためには、Windows Driver Kit(WDK)に含まれるPoolmon.exeというコンソールツールを使用します。Microsoftの公式サイトからお使いのWindowsバージョンに対応したWDKをダウンロードしてインストールし、Poolmon.exeを起動してください(Windows 10用WDKの場合、ツールは C:\Program Files (x86)\Windows Kits\10\Tools\ フォルダーに格納されています)。

ツールを起動したら、P キーを押します。すると2番目の列に、非ページメモリを使用しているタグ(Nonp属性)が表示されます。続けて B キーを押すと、Bytes列を基準にドライバーリストがソートされます。

Windowsで非ページプールメモリの使用量が異常に高い場合の原因と対処法

左端の列にはドライバーのタグが表示されます。ここでの目的は、このタグをもとに該当するドライバーファイルを特定することです。この例では、非ページプール内のRAMの大部分が、Nr22ConTsmNp というタグを持つドライバーによって消費されていることがわかります。

見つかったタグに対応するドライバーを調べるには、Sysinternalsの strings.exe ツール、組み込みの findstr コマンド、またはPowerShellを利用します。

タグに関連するドライバーファイルを検索するには、次のコマンドを使用します:

findstr /m /l /s Nr22 %Systemroot%\System32\drivers\*.sys
findstr /m /l /s ConT %Systemroot%\System32\drivers\*.sys
findstr /m /l /s smNp %Systemroot%\System32\drivers\*.sys

PowerShellを使う場合は以下のようになります:

Set-Location "C:\Windows\System32\drivers"
Select-String -Path *.sys -Pattern "Nr22" -CaseSensitive | Select-Object FileName -Unique
Select-String -Path *.sys -Pattern "Py28" -CaseSensitive | Select-Object FileName -Unique
Select-String -Path *.sys -Pattern "Ne40" -CaseSensitive | Select-Object FileName –Unique

また、poolmon.exe上でタグからドライバーファイルへのマッピングを直接行うことも可能です。その際は、ツールのディレクトリに pooltag.txt ファイルが存在することを確認してください。pooltag.txtはWDKのインストールディレクトリからコピーするか、GitHubからダウンロードできます。poolmonは次のように実行します:

poolmon /g

Windowsで非ページプールメモリの使用量が異常に高い場合の原因と対処法

これで Mapped_driver 列にドライバー名が表示されるようになります。

以上の手順で、問題の原因となりうるドライバーファイルの一覧が取得できました。次に、これらのファイル名から、どのドライバーやシステムコンポーネントに該当するのかを特定します。これにはSysinternalsの sigcheck ツールが便利です。

sigcheck C:\Windows\System32\drivers\rdyboost.sys

このツールは、対象のドライバーやWindowsコンポーネントの名前、説明、バージョン情報を返します。

Windowsで非ページプールメモリの使用量が異常に高い場合の原因と対処法

原因となるドライバーやサービスが判明したら、アンインストール・更新・再インストールなどを試みてください。

なお、メモリリークによってBSOD(ブルースクリーン)が発生した場合は、メモリダンプファイルから問題のドライバーを特定することもできます。

  1. メモリダンプをWindbgデバッガーに読み込みます。
  2. コマンド !vm を実行します。
  3. NonPagedPool Usage の値が NonPagedPool Max を超えている場合、非ページプールが枯渇していることを意味します。
  4. コマンド !poolused 2 でプールの内容を確認します(結果は非ページプールの使用量順にソートされます)。
  5. ドライバータグを取得できたら、前述の findstrstrings.exe を使って該当するドライバーファイルを特定します。

ネットワークアダプタードライバーを最新版に更新する

ベンダーの公式サイトから、お使いのネットワークアダプター向けの最新ドライバーをダウンロードしてインストールしてみてください。

Windowsの自動ドライバー更新が有効になっている場合は、新しいドライバーをインストールしたタイミングで問題が発生し始めていないかを確認しましょう。以前のドライバーバージョンへロールバックして問題が解決するようであれば、自動ドライバー更新を無効にすることをおすすめします。

Hyper-Vの役割を無効化する

ケースによっては、インストール済みのHyper-Vの役割が非ページプールへのメモリリークの原因となることがあります。この役割が必要ない環境では、無効化することを推奨します。

Windows Serverでは、次のPowerShellコマンドでHyper-Vの役割を削除できます:

Remove-WindowsFeature -Name Hyper-V

Windows 10の場合は、次のコマンドを使用します:

Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All

上記の方法で原因が特定できない場合は、ユーザーモードのプロセスがメモリリークを引き起こしていないかも確認してください。タスクマネージャーを開き、「詳細」タブを表示して NP Pool 列を追加すると、非ページプールで大量のメモリを消費しているプロセスを見つけられます。

Windowsで非ページプールメモリの使用量が異常に高い場合の原因と対処法

本ガイドの手順は、Windows Server 2019/2016/2012 R2 およびデスクトップ版Windows 10/8.1 のいずれにも適用できます。

  1. 【Windows 11】診断ポリシーサービスのCPU・メモリ使用率が高い問題を解決する6つの方法

    Windows、macOS、Linuxなど、どのOSを使用していても、バックグラウンドでは常に多数のプロセスやサービスが動作しています。私たちユーザーは、大量のCPUリソースやシステムリソースを消費するこれらの複雑なサービスの存在に気づいていないことがほとんどです。 その代表的なプロセスのひとつが「診断ポリシー(Diagnostic Policy)サービス」です。このサービスはWindowsの各コンポーネントに問題がないかを検出する役割を担っており、デバイスを再起動するたびに自動的に起動するよう設定されています。目的はマシンの使用体験を向上させ、エラーや不具合を最小限に抑えることです。Wind

  2. Windows 10でGoogle Chromeのメモリ使用量が高いときの対処法|RAM消費を減らす9つの方法

    Google Chromeは、シンプルでクリーンな操作性により快適で安全なブラウジング体験を提供することで人気を集める、世界で最も利用されているWebブラウザの一つです。しかし、Chromeに対する最大の不満として挙げられるのが「システムメモリ(RAM)を大量に消費する」という点です。メモリを大量に消費すると、Chrome本体だけでなくWindows 10パソコン全体の動作が遅くなり、ユーザー体験全体に悪影響を及ぼします。この記事では、Chromeのメモリ使用量を削減し、Windows 10でのRAM消費を抑えるための実用的な対処法を紹介します。 Chromeが大量のメモリを使用する理由は?