ค้นหาเว็บไซต์

การใช้หน่วยความจำแบบไม่มีเพจพูลสูง (รั่วไหล) ใน 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

หรือผ่านรีจิสทรี:

  1. เปิดตัวแก้ไขรีจิสทรี (regedit.exe);

  2. ไปที่รีจิสตรีคีย์ HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Ndu\;

  3. เปลี่ยนค่าของพารามิเตอร์ 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 คุณสามารถระบุไดรเวอร์ที่มีปัญหาได้ในไฟล์การถ่ายโอนข้อมูลหน่วยความจำ

  1. โหลดการถ่ายโอนข้อมูลหน่วยความจำลงในดีบักเกอร์ Windbg;

  2. เรียกใช้คำสั่ง:

    !vm
  3. หากค่า NonPagedPool Usage มากกว่า NonPagedPool Max แสดงว่ากลุ่มที่ไม่ใช่เพจหมดลง

  4. ตรวจสอบเนื้อหาของพูลด้วยคำสั่ง (ผลลัพธ์จะถูกจัดเรียงตามการใช้งานพูลที่ไม่ใช่เพจ):

    !poolused 2
  5. หลังจากได้รับแท็กไดรเวอร์แล้ว ให้ค้นหาไฟล์ไดรเวอร์โดยใช้

    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

บทความที่เกี่ยวข้อง