Computer >> คอมพิวเตอร์ >  >> ระบบ >> Windows Server

การใช้หน่วยความจำพูลแบบไม่มีเพจสูง (รั่ว) ใน Windows

คอมพิวเตอร์และเซิร์ฟเวอร์ Windows อาจประสบปัญหากับหน่วยความจำล้นที่เกิดจากการรั่วไหลของไดรเวอร์ระบบบางตัวที่เก็บข้อมูลไว้ในพูลหน่วยความจำที่ไม่ใช่เพจของระบบ หน่วยความจำแบบไม่มีเพจ l คือข้อมูลใน RAM ของคอมพิวเตอร์ที่ใช้โดยเคอร์เนลและไดรเวอร์ของระบบปฏิบัติการ พูลที่ไม่ใช่เพจจะไม่ถูกสลับไปยังดิสก์ (เป็นไฟล์เพจ) พูลจะถูกเก็บไว้ในหน่วยความจำกายภาพเท่านั้น

คุณสามารถดูขนาดปัจจุบันของหน่วยความจำที่ไม่ใช่เพจใน หน่วยความจำ ส่วนของประสิทธิภาพ แท็บในตัวจัดการงาน ภาพหน้าจอด้านล่างแสดงว่าหน่วยความจำเกือบทั้งหมดของเซิร์ฟเวอร์ไม่ว่าง และส่วนใหญ่ถูกครอบครองโดยพูลที่ไม่ใช่เพจขนาด 4.2GB โดยปกติ ขนาดของพูลที่ไม่ใช่เพจจะไม่เกิน 200-400 MB ขนาดพูลที่ไม่ใช่เพจขนาดใหญ่มักบ่งชี้ว่ามีหน่วยความจำรั่วในส่วนประกอบระบบหรือไดรเวอร์อุปกรณ์บางอย่าง

การใช้หน่วยความจำพูลแบบไม่มีเพจสูง (รั่ว) ใน Windows

หากมีการรั่วไหลของหน่วยความจำในพูลที่ไม่ใช่เพจบนเซิร์ฟเวอร์ เหตุการณ์ต่อไปนี้จะปรากฏในบันทึกเหตุการณ์ของระบบ:

รหัสเหตุการณ์: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

การใช้หน่วยความจำพูลแบบไม่มีเพจสูง (รั่ว) ใน Windows

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

  1. เปิด Registry Editor (regedit.exe );
  2. ไปที่รีจิสตรีคีย์ HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Ndu\;
  3. เปลี่ยนค่าของ เริ่มต้น พารามิเตอร์เป็น 4.

การใช้หน่วยความจำพูลแบบไม่มีเพจสูง (รั่ว) ใน Windows

หลังจากทำการเปลี่ยนแปลงแล้ว คุณต้องรีสตาร์ทคอมพิวเตอร์

การใช้ 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 เพื่อจัดเรียงรายการไดรเวอร์ตามคอลัมน์ไบต์

การใช้หน่วยความจำพูลแบบไม่มีเพจสูง (รั่ว) ใน Windows

คอลัมน์ด้านซ้ายแสดงรายการแท็กไดรเวอร์ งานของคุณคือการระบุไฟล์ไดรเวอร์โดยใช้แท็กนี้ ในตัวอย่างของเรา คุณจะเห็นว่า 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

การใช้หน่วยความจำพูลแบบไม่มีเพจสูง (รั่ว) ใน Windows

โปรดทราบว่าขณะนี้ชื่อไดรเวอร์แสดงใน Mapped_driver คอลัมน์.

ดังนั้นเราจึงมีรายการไฟล์ไดรเวอร์ที่อาจทำให้เกิดปัญหา ตอนนี้ คุณต้องระบุไดรเวอร์และส่วนประกอบของระบบที่ไฟล์เหล่านี้อ้างถึงโดยใช้ชื่อของพวกเขา ในการทำเช่นนั้น คุณสามารถใช้ sigcheck เครื่องมือจาก Sysinternals

sigcheck C:\Windows\System32\drivers\rdyboost.sys

เครื่องมือส่งคืนชื่อ คำอธิบาย และเวอร์ชันของไดรเวอร์หรือคอมโพเนนต์ของ Windows

การใช้หน่วยความจำพูลแบบไม่มีเพจสูง (รั่ว) ใน Windows

ตอนนี้คุณสามารถลองถอนการติดตั้ง/อัปเดต/ติดตั้งไดรเวอร์หรือบริการที่มีปัญหาใหม่ได้

หากหน่วยความจำรั่วส่งผลให้เกิด BSOD คุณสามารถระบุไดรเวอร์ที่มีปัญหาได้ในไฟล์ดัมพ์หน่วยความจำ

  1. โหลดการถ่ายโอนข้อมูลหน่วยความจำลงในดีบักเกอร์ Windbg
  2. รันคำสั่ง:!vm
  3. หาก การใช้งาน NonPagedPool ค่ามากกว่า 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

คู่มือนี้ใช้ได้กับ Windows Server 2019/2016/2012R และเดสก์ท็อป Windows 10/8.1