การใช้หน่วยความจำแบบไม่มีเพจพูลสูง (รั่วไหล) ใน Windows
คอมพิวเตอร์ Windows และเซิร์ฟเวอร์อาจประสบปัญหาเกี่ยวกับหน่วยความจำล้นที่เกิดจากการรั่วไหลของไดรเวอร์ระบบบางตัวที่เก็บข้อมูลไว้ในพูลหน่วยความจำที่ไม่ใช่เพจของระบบ Poo หน่วยความจำแบบไม่มีหน้าคือข้อมูลใน 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 ชั่วโมงทุกวัน
ปิดใช้งานไดรเวอร์การตรวจสอบการใช้ข้อมูลเครือข่าย
บ่อยครั้งที่สาเหตุของการรั่วไหลของหน่วยความจำในพูลที่ไม่ใช่เพจคือความเข้ากันไม่ได้ของไดรเวอร์การตรวจสอบกิจกรรมเครือข่าย (การใช้ข้อมูลเครือข่าย — NDU,
%WinDir%\system32\drivers\Ndu.sys) กับไดรเวอร์อะแดปเตอร์เครือข่าย บ่อยครั้งที่ไดรเวอร์การ์ดเครือข่าย Killer Network และ MSI ขัดแย้งกับไดรเวอร์ NDU บริการนี้สามารถปิดใช้งานได้โดยไม่สูญเสียฟังก์ชันการทำงานของ Windows มากนัก
หยุดบริการ NDU ด้วยคำสั่ง:
sc config NDU start= disabledหรือผ่านรีจิสทรี:
-
เปิดตัวแก้ไขรีจิสทรี (regedit.exe);
ไปที่รีจิสตรีคีย์ HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Ndu\;
เปลี่ยนค่าของพารามิเตอร์ Start เป็น 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 คอลัมน์ที่สองจะแสดงแท็กของกระบวนการที่ใช้หน่วยความจำที่ไม่ใช่เพจ (แอตทริบิวต์ Nonp) จากนั้นกดปุ่ม B เพื่อจัดเรียงรายการไดรเวอร์ตามคอลัมน์ Bytes
คอลัมน์ด้านซ้ายแสดงแท็กไดรเวอร์ งานของคุณคือระบุไฟล์ไดรเวอร์โดยใช้แท็กนี้ ในตัวอย่างของเรา คุณจะเห็นว่า RAM ส่วนใหญ่ในพูลที่ไม่ใช่เพจถูกใช้โดยไดรเวอร์ที่มีแท็ก Nr22, ConT และ 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 Usage มากกว่า 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






