คอมพิวเตอร์และเซิร์ฟเวอร์ Windows อาจประสบปัญหากับหน่วยความจำล้นที่เกิดจากการรั่วไหลของไดรเวอร์ระบบบางตัวที่เก็บข้อมูลไว้ในพูลหน่วยความจำที่ไม่ใช่เพจของระบบ หน่วยความจำแบบไม่มีเพจ l คือข้อมูลใน RAM ของคอมพิวเตอร์ที่ใช้โดยเคอร์เนลและไดรเวอร์ของระบบปฏิบัติการ พูลที่ไม่ใช่เพจจะไม่ถูกสลับไปยังดิสก์ (เป็นไฟล์เพจ) พูลจะถูกเก็บไว้ในหน่วยความจำกายภาพเท่านั้น
คุณสามารถดูขนาดปัจจุบันของหน่วยความจำที่ไม่ใช่เพจใน หน่วยความจำ ส่วนของประสิทธิภาพ แท็บในตัวจัดการงาน ภาพหน้าจอด้านล่างแสดงว่าหน่วยความจำเกือบทั้งหมดของเซิร์ฟเวอร์ไม่ว่าง และส่วนใหญ่ถูกครอบครองโดยพูลที่ไม่ใช่เพจขนาด 4.2GB โดยปกติ ขนาดของพูลที่ไม่ใช่เพจจะไม่เกิน 200-400 MB ขนาดพูลที่ไม่ใช่เพจขนาดใหญ่มักบ่งชี้ว่ามีหน่วยความจำรั่วในส่วนประกอบระบบหรือไดรเวอร์อุปกรณ์บางอย่าง
หากมีการรั่วไหลของหน่วยความจำในพูลที่ไม่ใช่เพจบนเซิร์ฟเวอร์ เหตุการณ์ต่อไปนี้จะปรากฏในบันทึกเหตุการณ์ของระบบ:
รหัสเหตุการณ์:2019ที่มา:Srv
คำอธิบาย:
The server was unable to allocate from the system nonpaged pool because the pool was empty
ในกรณีส่วนใหญ่ สาเหตุของการรั่วไหลของหน่วยความจำที่อธิบายข้างต้นคือปัญหาบางอย่างกับไดรเวอร์ของบริษัทอื่นที่ติดตั้งใน Windows ตามกฎแล้วสิ่งเหล่านี้คือไดรเวอร์เครือข่าย โปรดให้ความสนใจกับพฤติกรรมของพูลเมื่อดาวน์โหลดไฟล์ขนาดใหญ่ (มีแนวโน้มว่าจะเติบโตอย่างรวดเร็ว)
ขนาดพูลที่ไม่ใช่เพจสูงสุดบน Windows:
- Windows x64 สูงสุด 128 Gb และหน่วยความจำกายภาพไม่เกิน 75%
- Windows x86 สูงสุด 2 Gb และ RAM ไม่เกิน 75%
เฉพาะการรีบูต Windows เท่านั้นที่ช่วยล้างพูลที่ไม่ใช่เพจ อาจเป็นที่ยอมรับสำหรับอุปกรณ์ในบ้าน แต่คุณควรหาทางออกที่ดีกว่าสำหรับเซิร์ฟเวอร์ที่ทำงานตลอด 24 ชั่วโมงทุกวันไม่เว้นวันหยุด
สารบัญ:
- ปิดใช้งานโปรแกรมควบคุมการตรวจสอบการใช้ข้อมูลเครือข่าย
- การใช้ PoolMon เพื่อค้นหา Kernel-Mode Memory Leak
- ติดตั้งไดร์เวอร์อแดปเตอร์เครือข่ายรุ่นล่าสุด
- ปิดใช้งานบทบาท Hyper-V
ปิดใช้งานไดรเวอร์การตรวจสอบการใช้ข้อมูลเครือข่าย
บ่อยครั้ง สาเหตุของหน่วยความจำรั่วในกลุ่ม non-paged คือความไม่ลงรอยกันของไดรเวอร์การตรวจสอบกิจกรรมเครือข่าย (การใช้ข้อมูลเครือข่าย — NDU %WinDir%\system32\drivers\Ndu.sys
) ด้วยไดรเวอร์อะแดปเตอร์เครือข่าย ไดรเวอร์การ์ดเครือข่าย Killer Network และ MSI มักขัดแย้งกับไดรเวอร์ NDU บริการนี้สามารถปิดใช้งานได้โดยไม่สูญเสียฟังก์ชันการทำงานของ Windows มากนัก
หยุดบริการ NDU ด้วยคำสั่ง:
sc config NDU start= disabled
หรือผ่านทางรีจิสทรี:
- เปิด Registry Editor (regedit.exe );
- ไปที่รีจิสตรีคีย์ HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Ndu\;
- เปลี่ยนค่าของ เริ่มต้น พารามิเตอร์เป็น 4.
หลังจากทำการเปลี่ยนแปลงแล้ว คุณต้องรีสตาร์ทคอมพิวเตอร์
การใช้ PoolMon เพื่อค้นหาการรั่วไหลของหน่วยความจำโหมดเคอร์เนล
คุณสามารถลองระบุโปรแกรมควบคุมที่ทำให้เกิดการรั่วไหลของหน่วยความจำในกลุ่มที่ไม่ใช่เพจ ในการดำเนินการนี้ เราจำเป็นต้องมี Poolmoon.exe เครื่องมือคอนโซลที่รวมอยู่ใน Windows Driver Kit (WDK). ดาวน์โหลดและติดตั้ง WDK สำหรับเวอร์ชัน Windows ของคุณจาก Microsoft จากนั้นเริ่ม Poolmon.exe (ในกรณีของ WDK สำหรับ Windows 10 เครื่องมือจะอยู่ใน C:\Program Files (x86)\Windows Kits\10\Tools\
โฟลเดอร์)
หลังจากเริ่มเครื่องมือแล้ว ให้กด P . คอลัมน์ที่สองจะแสดงแท็กของกระบวนการที่ใช้หน่วยความจำแบบ non-paged (แอตทริบิวต์ Nonp) จากนั้นกดปุ่ม B เพื่อจัดเรียงรายการไดรเวอร์ตามคอลัมน์ไบต์
คอลัมน์ด้านซ้ายแสดงรายการแท็กไดรเวอร์ งานของคุณคือการระบุไฟล์ไดรเวอร์โดยใช้แท็กนี้ ในตัวอย่างของเรา คุณจะเห็นว่า RAM ส่วนใหญ่ในพูลที่ไม่ใช่เพจใช้โดยไดรเวอร์ที่มีแท็ก Nr22 , ต่อ และ smNp .
คุณควรตรวจสอบไดรเวอร์สำหรับแท็กที่พบโดยใช้ strings.exe
เครื่องมือ (จาก Sysinternals) โดยใช้ 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
โปรดทราบว่าขณะนี้ชื่อไดรเวอร์แสดงใน Mapped_driver คอลัมน์.
ดังนั้นเราจึงมีรายการไฟล์ไดรเวอร์ที่อาจทำให้เกิดปัญหา ตอนนี้ คุณต้องระบุไดรเวอร์และส่วนประกอบของระบบที่ไฟล์เหล่านี้อ้างถึงโดยใช้ชื่อของพวกเขา ในการทำเช่นนั้น คุณสามารถใช้ sigcheck เครื่องมือจาก Sysinternals
sigcheck C:\Windows\System32\drivers\rdyboost.sys
เครื่องมือส่งคืนชื่อ คำอธิบาย และเวอร์ชันของไดรเวอร์หรือคอมโพเนนต์ของ Windows
ตอนนี้คุณสามารถลองถอนการติดตั้ง/อัปเดต/ติดตั้งไดรเวอร์หรือบริการที่มีปัญหาใหม่ได้
หากหน่วยความจำรั่วส่งผลให้เกิด BSOD คุณสามารถระบุไดรเวอร์ที่มีปัญหาได้ในไฟล์ดัมพ์หน่วยความจำ
- โหลดการถ่ายโอนข้อมูลหน่วยความจำลงในดีบักเกอร์ Windbg
- รันคำสั่ง:
!vm
- หาก การใช้งาน NonPagedPool ค่ามากกว่า NonPagedPool Max หมายความว่าพูลที่ไม่ใช่เพจหมด;
- ตรวจสอบเนื้อหาของพูลด้วยคำสั่ง (ผลลัพธ์จะถูกจัดเรียงตามการใช้งานพูลที่ไม่ใช่เพจ):
!poolused 2
- หลังจากได้รับแท็กไดรเวอร์แล้ว ให้ค้นหาไฟล์ไดรเวอร์โดยใช้
findstr
หรือstrings.exe
ตามที่อธิบายไว้ข้างต้น
ติดตั้งเวอร์ชันล่าสุดของไดรเวอร์การ์ดเชื่อมต่อเครือข่าย
ลองดาวน์โหลดและติดตั้งไดรเวอร์เวอร์ชันล่าสุดสำหรับอะแดปเตอร์เครือข่ายจากเว็บไซต์ของผู้จำหน่าย
หากเปิดใช้งานการอัปเดตไดรเวอร์อัตโนมัติใน Windows ให้ตรวจสอบว่าปัญหาเริ่มต้นขึ้นหลังจากติดตั้งไดรเวอร์ใหม่หรือไม่ ลองย้อนกลับเป็นเวอร์ชันไดรเวอร์ก่อนหน้าและดูว่าปัญหายังคงมีอยู่หรือไม่ หากปัญหาได้รับการแก้ไขแล้ว ให้ปิดใช้งานการอัปเดตไดรเวอร์อัตโนมัติ
ปิดใช้งานบทบาท Hyper-V
ในบางกรณี บทบาท Hyper-V ที่ติดตั้งไว้ทำให้เกิดการรั่วไหลของหน่วยความจำไปยังพูลที่ไม่ใช่เพจ หากคุณไม่ต้องการบทบาทนี้ เราแนะนำให้ปิดการใช้งาน
บน Windows Server คุณสามารถปิดใช้งานบทบาท Hyper-V ด้วยคำสั่ง PowerShell:
Remove-WindowsFeature -Name Hyper-V
คำสั่งสำหรับ Windows 10:
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
หากการค้นหาของคุณไม่แสดงผลลัพธ์ใดๆ ให้ตรวจสอบว่าหน่วยความจำรั่วเกิดจากกระบวนการโหมดผู้ใช้หรือไม่ เปิดตัวจัดการงาน ไปที่ รายละเอียด ให้เพิ่ม NP Pool คอลัมน์และค้นหากระบวนการที่มีขนาดหน่วยความจำขนาดใหญ่ในกลุ่มที่ไม่ใช่เพจ
คู่มือนี้ใช้ได้กับ Windows Server 2019/2016/2012R และเดสก์ท็อป Windows 10/8.1