Windowsマシンのメモリリーク、特に非ページプールが制御不能に膨れ上がると、対処するのはかなり面倒です。通常、タスクマネージャーのパフォーマンスタブで確認できますが、非ページプールが数ギガバイトまで急増することがあります。これは、通常の200~400MBをはるかに超えるものです。これは、動作の遅延からクラッシュまで、あらゆる問題を引き起こす可能性があります。通常、ドライバの不具合や競合が原因で、ネットワークドライバが原因となることがよくあります。再起動すれば一時的には「修復」できますが、特に24時間365日稼働しているサーバーでは、より永続的な修復が不可欠です。そこで、現場で実際に効果があった方法を、技術的なヒントも交えながらまとめてみました。
Windows で非ページプールのメモリリークを修正する方法
ネットワークデータ使用量監視ドライバーを無効にする
多くの場合、原因はNDU(%WinDir%\system32\drivers\Ndu.sys)と呼ばれるネットワークアクティビティモニタードライバーです。KillerおよびMSIネットワークカードは、このドライバーと競合することで有名です。大きなファイルを転送しようとすると非ページプールがどんどん大きくなっていく場合や、イベントログに「サーバーはシステムの非ページプールから割り当てることができませんでした」といったエラーが繰り返し表示される場合は、このドライバーを無効にすると改善する可能性があります。少し奇妙に思えますが、NDUサービスまたはレジストリエントリを無効にすると、状況が安定することがあります。
- コマンドプロンプトまたは PowerShell 経由でドライバーを停止します。
sc config NDU start= disabled
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Ndu\
その後は再起動が必須です。環境によってはすぐに効果が現れない場合もあるので、それでもサイズが大きくなる場合は、もう一度試すか、競合するネットワークドライバー(KillerやMSIなど)がないか確認してください。一部のマシンでは、このサービスを無効にすると最初は多少の不具合が発生することがありますが、全体的にはリーク量が減少します。これはトレードオフです。ただし、これはすべてのケースに当てはまる万能薬ではありませんが、試してみる価値はあります。
PoolMonを使用してリークの原因となっているドライバーを追跡する
問題が解決せず、さらに深く調べたい場合は、PoolMon (プールモニター)がお役に立ちます。少しマニアックですが、効果的です。Windows Driver Kit (WDK)から入手してください。インストールしたら、Poolmon.exeを実行してください。できれば管理者権限で実行してください。
開いたら、Pキーを押して、非ページメモリを最も頻繁に使用しているプールタグを確認します。次に、Bキーを押してバイト数で並べ替えます。これにより、どのドライバーがメモリを大量に消費しているかがわかります。Nr22 、ConT、smNpなどのタグを探します。次のステップは、Sysinternalsのstrings.exeなどのツール、コマンドプロンプトまたはPowerShellのコマンドを使用して、これらのタグがリンクされているドライバーファイルまたはハードウェアを特定することです。findstr
findstr /m /l /s Nr22 %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 "ConT" -CaseSensitive | Select-Object FileName -Unique
疑わしいドライバー(たとえば、 rdyboost.sysまたはrsmnp.sys )を特定したら、 Sysinternals のSigCheckを使用して詳細を確認します。
sigcheck C:\Windows\System32\drivers\rdyboost.sys
これにより、ドライバーのバージョン、説明などの情報が得られます。これらのドライバーがメモリリークの原因となっていると思われる場合は、ドライバーを更新、ロールバック、または無効化する必要があるかもしれません。メモリ不足に関連するBSODが表示されている場合は、WinDbg!vmでメモリダンプを解析し、またはなどのコマンドを実行して!poolused 2問題のあるドライバータグを見つけることもできます。
ドライバーを最新の状態に維持するか、ロールバックするか
最近のシステムでは、古いネットワークドライバーやバグのあるドライバーが主な原因です。ベンダーのウェブサイト(Intel、Realtek、Killer、MSIなど)にアクセスして、最新のドライバーを入手してください。Windows Updateではアップデートが失敗する場合もあるので、手動で更新すると良いでしょう。ドライバーの更新後に問題が発生した場合は、以前のバージョンのドライバーにロールバックすることを検討してください。これにより、多くの場合、安定性が回復します。
必要ない場合はHyper-Vを無効にする
仮想化プラットフォームであるHyper-Vは、特に有効になっているものの未使用の場合、非ページプールにメモリリークを起こすことがあります。Hyper-Vがインストールされているものの未使用の場合は、無効にすることでリソースを解放できます。
- PowerShell では、Windows Server の場合:
Remove-WindowsFeature -Name Hyper-V
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
これらのコマンドが何も返さない、またはHyper-Vがインストールされていない場合は、リークの原因となっている可能性のあるプロセスまたはVMが実行されていないか確認してください。タスクマネージャーで「NPプール」列を追加し(列ヘッダーを右クリックし、「列の選択」を選択)、非ページプールの使用率が高いプロセスを探してください。
これはかなり広範囲にわたる問題で、それぞれの環境によって反応は異なります。しかし、これらの手順は、特にサーバーや高度にカスタマイズされたWindowsインストールにおいて、一般的な原因のいくつかを根絶するのに役立ちました。