Máy tính và máy chủ Windows có thể gặp sự cố tràn bộ nhớ do rò rỉ của một driver hệ thống nhất định lưu trữ dữ liệu trong bộ nhớ non-paged pool của hệ thống. Non-paged memory pool là dữ liệu trong RAM của máy tính được sử dụng bởi kernel và driver của hệ điều hành. Non-paged pool không bao giờ được swap ra đĩa (ra file paging), nó luôn chỉ được lưu trữ trong bộ nhớ vật lý.
Bạn có thể xem kích thước hiện tại của non-paged memory trong phần Memory của tab Performance trong Task Manager. Ảnh chụp màn hình dưới đây cho thấy hầu như toàn bộ bộ nhớ của máy chủ đang bận, và phần lớn bị chiếm dụng bởi non-paged pool 4.2GB. Bình thường, kích thước non-paged pool hiếm khi vượt quá 200-400 MB. Kích thước non-paged pool lớn thường cho thấy có rò rỉ bộ nhớ trong một số thành phần hệ thống hoặc driver thiết bị.

Nếu có rò rỉ bộ nhớ trong non-paged pool trên máy chủ, các sự kiện sau sẽ xuất hiện trong System event log:
Event ID: 2019
Source: Srv
Description: The server was unable to allocate from the system nonpaged pool because the pool was empty
Trong hầu hết các trường hợp, nguyên nhân rò rỉ bộ nhớ như trên là do một số vấn đề với driver bên thứ ba được cài đặt trong Windows. Thông thường đây là driver mạng. Hãy chú ý đến hành vi của pool khi tải xuống file lớn (có khả năng nó tăng nhanh).
Kích thước non-paged pool tối đa trên Windows:
- Windows x64 lên đến 128 GB và không quá 75% bộ nhớ vật lý
- Windows x86 lên đến 2 GB và không quá 75% RAM
Chỉ khởi động lại Windows mới giúp dọn dẹp non-paged pool. Điều này có thể chấp nhận được cho thiết bị gia đình, nhưng bạn nên tìm giải pháp tốt hơn cho máy chủ chạy 24/7.
Vô hiệu hóa Driver Theo dõi Sử dụng Dữ liệu Mạng
Khá thường thấy, nguyên nhân rò rỉ bộ nhớ trong non-paged pool là sự không tương thích của driver theo dõi hoạt động mạng (Network Data Usage — NDU, %WinDir%\system32\drivers\Ndu.sys) với driver card mạng. Thường xuyên nhất, driver card mạng Killer Network và MSI xung đột với driver NDU. Dịch vụ này có thể bị vô hiệu hóa mà không làm mất nhiều chức năng của Windows.
Dừng dịch vụ NDU bằng lệnh:
sc config NDU start= disabled

Hoặc qua registry:
- Mở Registry Editor (regedit.exe);
- Đi đến khóa registry HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Ndu\;
- Thay đổi giá trị tham số Start thành 4.

Sau khi thay đổi, bạn cần khởi động lại máy tính.
Sử dụng PoolMon để tìm rò rỉ bộ nhớ Kernel-Mode
Bạn có thể thử xác định driver gây ra rò rỉ bộ nhớ trong non-paged pool. Để làm điều này, chúng ta cần công cụ console Poolmon.exe được bao gồm trong Windows Driver Kit (WDK). Tải xuống và cài đặt WDK cho phiên bản Windows của bạn từ Microsoft. Sau đó khởi động Poolmon.exe (trong trường hợp WDK cho Windows 10, công cụ nằm trong thư mục C:\Program Files (x86)\Windows Kits\10\Tools\).
Sau khi bạn đã khởi động công cụ, nhấn P. Cột thứ hai sẽ hiển thị tag của các tiến trình sử dụng non-paged memory (thuộc tính Nonp). Sau đó nhấn phím B để sắp xếp danh sách driver theo cột Bytes.

Cột bên trái liệt kê các tag driver. Nhiệm vụ của bạn là xác định file driver bằng tag này. Trong ví dụ của chúng tôi, bạn có thể thấy rằng hầu hết RAM trong non-paged pool được sử dụng bởi driver với tag Nr22, ConT và smNp.
Bạn nên kiểm tra driver cho các tag tìm được bằng công cụ strings.exe (từ Sysinternals), sử dụng lệnh findstr tích hợp sẵn, hoặc sử dụng PowerShell.
Sử dụng các lệnh sau để tìm file driver liên kết với các tag bạn đã tìm thấy:
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
Hoặc, bạn cũng có thể sử dụng 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
Bạn có thể ánh xạ file driver cho tag trực tiếp trong poolmon.exe. Để làm điều này, hãy đảm bảo file pooltag.txt nằm trong thư mục công cụ. Bạn có thể sao chép pooltag.txt từ thư mục cài đặt WDK hoặc tải xuống từ GitHub. Chạy poolmon như sau:
poolmon /g

Lưu ý rằng tên driver hiện được hiển thị trong cột Mapped_driver.
Vậy chúng ta đã có danh sách file driver có thể gây ra vấn đề. Bây giờ bạn phải xác định các driver và thành phần hệ thống mà các file này đề cập đến thông qua tên của chúng. Để làm điều này, bạn có thể sử dụng công cụ sigcheck từ Sysinternals.
sigcheck C:\Windows\System32\drivers\rdyboost.sys
Công cụ trả về tên, mô tả và phiên bản của driver hoặc thành phần Windows.

Bây giờ bạn có thể thử gỡ cài đặt/cập nhật/cài đặt lại driver hoặc dịch vụ gây vấn đề.
Nếu rò rỉ bộ nhớ dẫn đến BSOD, bạn có thể xác định driver gây vấn đề trong file memory dump.
- Tải memory dump vào trình gỡ lỗi Windbg;
- Chạy lệnh:
!vm - Nếu giá trị NonPagedPool Usage lớn hơn NonPagedPool Max, điều đó có nghĩa là non-paged pool đã cạn kiệt;
- Kiểm tra nội dung pool bằng lệnh (kết quả sẽ được sắp xếp theo mức sử dụng non-paged pool):
!poolused 2 - Sau khi có tag driver, tìm file driver bằng
findstrhoặcstrings.exenhư đã mô tả ở trên.
Cài đặt phiên bản mới nhất của Driver Card mạng
Hãy thử tải xuống và cài đặt phiên bản driver mới nhất cho card mạng của bạn từ trang web của nhà cung cấp.
Nếu cập nhật driver tự động được bật trong Windows, hãy kiểm tra xem vấn đề có bắt đầu sau khi cài đặt driver mới không. Hãy thử quay lại phiên bản driver trước đó và xem vấn đề có tiếp diễn không. Nếu vấn đề được giải quyết, hãy tắt cập nhật driver tự động.
Vô hiệu hóa vai trò Hyper-V
Trong một số trường hợp, vai trò Hyper-V đã cài đặt đang gây rò rỉ bộ nhớ vào non-paged pool. Nếu bạn không cần vai trò này, chúng tôi khuyên bạn nên vô hiệu hóa nó.
Trên Windows Server, bạn có thể vô hiệu hóa vai trò Hyper-V bằng lệnh PowerShell:
Remove-WindowsFeature -Name Hyper-V
Lệnh cho Windows 10:
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
Nếu tìm kiếm của bạn không trả về kết quả nào, hãy kiểm tra xem rò rỉ bộ nhớ có được gây ra bởi tiến trình user-mode không. Mở Task Manager, chuyển đến tab Details, thêm cột NP Pool và tìm kiếm tiến trình với kích thước bộ nhớ lớn trong non-paged pool.

Hướng dẫn này áp dụng cho cả Windows Server 2019/2016/2012R và Windows 10/8.1 desktop.