ทำไมการตรวจสอบทรัพยากรและการใช้งาน RAM ทั้งหมดของตัวจัดการไม่แม้แต่เพิ่มระยะไกลถึงการใช้หน่วยความจำกายภาพทั้งหมด [ซ้ำ]


30

ฉันได้สังเกตเห็นนี้บนเครื่อง Windows ที่แตกต่างกันในโอกาสที่แตกต่างกัน: การใช้ RAM ที่รายงานโดย Task Manager หรือตรวจสอบทรัพยากรมักจะดูเหมือนว่าจะเพิ่มขึ้นถึงจำนวนเงินที่เป็นอย่างมีนัยสำคัญต่ำกว่าจำนวนเงินที่แท้จริงในการใช้งาน

ตัวอย่างเช่นบนแล็ปท็อปหรือเดสก์ท็อปของฉันหลายครั้งฉันเคยเห็นบางสิ่งบางอย่างเช่น 7GB ที่ใช้งานอยู่ แต่ชุด RAM ที่ใช้งานจริงทั้งหมดก็เหมือน 3GB ฉันไม่สามารถทราบได้ว่ามันถูกใช้ที่ไหน!

นี่เป็นตัวอย่างที่สุดยอดที่ฉันสังเกตเห็นในการตรวจสอบทรัพยากรบนเซิร์ฟเวอร์:

การตรวจสอบทรัพยากร
คลิกเพื่อดูขนาดเต็ม

หากคุณคลิกขวาที่ภาพและเปิดในแท็บใหม่และดูตัวเลขคุณจะสังเกตเห็นว่าชุดการทำงาน (ซึ่งไม่รวมหน่วยความจำเสมือนที่ไม่ใช่แบบฟิสิคัล) จะเพิ่มขึ้นประมาณ 1.7GB ฉันได้รับหมายเลขที่คล้ายกันโดยการเพิ่มการใช้ RAM ในตัวจัดการงานเมื่อเปิดใช้งาน "แสดงกระบวนการจากผู้ใช้ทั้งหมด"

ต่อไปนี้เป็นภาพหน้าจอของแท็บประสิทธิภาพของตัวจัดการงาน:

ผู้จัดการงาน
คลิกเพื่อดูขนาดเต็ม

นี่บอกว่ามีการใช้หน่วยความจำฟิสิคัล 7.6GB

ฉันเห็นสิ่งนี้ตลอดเวลาในคอมพิวเตอร์ส่วนบุคคลแล็ปท็อปและตอนนี้เซิร์ฟเวอร์: การใช้ RAM ทั้งหมดที่รายงานโดยเครื่องมือระบบมีเพียงบัญชีประมาณ 1/4 ของการใช้ RAM ที่ฉันสังเกตเห็น WTF กำลังเกิดขึ้น ???

มีคำอธิบายที่น่าพอใจหรือไม่ว่า RAM ทั้งหมดของฉันอยู่ที่ใด การกลืนมันคืออะไรและทำไมมันถึงไม่มีร่องรอย?

แก้ไข: นี่คือภาพของการใช้ RAM แบบกราฟิกตามที่ผู้ใช้ต้องการ:

การใช้ RamMap
คลิกเพื่อดูขนาดเต็ม

แก้ไข 2: ในการตอบสนองต่อการตอบสนองของ James ต่อไปนี้เป็นรูปภาพของกระบวนการที่ไม่มีเพจเพจpoolmon.exeเรียงตามขนาด:

ป้อนคำอธิบายรูปภาพที่นี่

ผลลัพธ์เหล่านี้ทำให้ฉันสับสน poolmonระบุอย่างถูกต้องว่าฉันมี 6GB ของพูลแบบ nonpaged ที่ใช้งานอยู่ แต่กระบวนการพูลแบบ nonpaged ทั้งหมดมีขนาดน้อยกว่า 8MB

สิ่งนี้หมายความว่าอย่างไร เป็นpoolmonความล้มเหลวในการตรวจสอบบางส่วนของกระบวนการโดยใช้สระว่ายน้ำทำเพจ?



คุณช่วยกรุณาโพสต์รูปภาพของ Resource Monitor ของคุณ> แท็บหน่วยความจำ (แค่ส่วนล่างที่มีสีและตัวเลข) นั่นจะเป็นการบอกเพิ่มเติม
เมื่อ

2
@Ramhound: ขอบคุณที่ชี้ให้ฉันไปที่ลิงค์นั้น! ขออภัยตามที่ร้องขอฉันได้อัปโหลดรูปภาพของแผนที่หน่วยความจำฟิสิคัลของหน่วยความจำภาพและส่วนสแตนด์บายของหน่วยความจำกายภาพน้อยกว่า 2% ของการใช้ RAM ทั้งหมด คำตอบของ David Schwartz ชี้ให้เห็นว่าการใช้ RAM "ที่ซ่อนอยู่" นั้นมาจาก Standby RAM (เช่น RAM ที่ใช้สำหรับข้อมูลแคชและรหัสที่ไม่ได้ใช้งาน) และนั่นไม่ใช่ในกรณีนี้ ฉันไม่คิดว่าคำตอบของเดวิดอธิบายว่าเกิดอะไรขึ้น
DumpsterDoofus

ใช้โปรแกรม RamMap และสำรวจให้มากขึ้นจนถึงตอนนี้อาจมีบางคนขับรถที่ทำบาป? แต่แน่นอนมันไม่ใช่สแตนด์บาย (แคช) คุณใช้งานโปรแกรมพิเศษใด ๆ ที่ทำให้หน่วยความจำหมดหรือไม่หรือว่าจะเร่งความเร็วคอมพิวเตอร์? มีรายการไดรเวอร์แปลก ๆ อะไรบ้างที่พิเศษสำหรับคอมพิวเตอร์ของคุณ?
Psycogeek

2
ลิงก์ไปยัง "ตอบก่อน" ไม่ครอบคลุมกรณีนี้
เจมี่ Hanrahan

คำตอบ:


30

ฉันขอโทษฉันรู้ว่ามันฟังดูเหมือนเป็นการตอบสนองที่ฟุ่มเฟือย ... แต่คำตอบของคำถามในชื่อของคุณคือ "เพราะพวกเขาไม่ควรทำ"

หรือพูดอย่างสุภาพมากขึ้น: มีการใช้ RAM จำนวนมากซึ่งไม่ได้อยู่ในชุดการทำงานส่วนตัวของกระบวนการ บางส่วนอยู่ในชุดการทำงานที่ใช้ร่วมกันของกระบวนการ - แต่คุณไม่สามารถรับแนวคิดที่เชื่อถือได้เกี่ยวกับการใช้งานจริงที่นั่นเนื่องจากการแบ่งปัน การเพิ่มหมายเลขของกระบวนการจะทำให้ผลลัพธ์มีขนาดใหญ่เกินไป

สิ่งอื่น ๆ ที่ใช้ RAM เช่นพู nonpaged ส่วนที่อยู่อาศัยของจพูและส่วนที่อยู่อาศัยของการใช้พื้นที่เคอร์เนลอื่น ๆ ไม่ปรากฏขึ้นในการแสดง "กระบวนการ" ของ Task Manager

เกี่ยวกับปัญหาเฉพาะของคุณ:

บนหน้าจอตัวจัดการงานให้ดูที่ส่วน "หน่วยความจำเคอร์เนล" คุณมี "หน่วยความจำที่ไม่ใช่เพจ" 6 GB (นั่นคือพูลที่ไม่ใช่เพจ) นั่นเป็นส่วนหนึ่งของส่วน "ใช้งาน" ในกราฟที่สองของคุณ พูลแบบไม่มีเพจจะไม่ถูกเรียกเก็บเงินจากกระบวนการใด ๆ ซึ่งเป็นสาเหตุที่การเพิ่มหมายเลขต่อกระบวนการในตัวจัดการงานไม่ได้ใกล้เคียงกับจำนวนการใช้ทั้งหมด ไดรเวอร์บางตัวมีแนวโน้มที่จะใช้มัน นี่เป็นปริมาณที่มากเกินไป มันควรจะต่ำกว่า 1 GB ไดรเวอร์ใดก็ตามที่รับผิดชอบในส่วนที่มากเกินไปของการใช้พูลแบบ nonpaged นั้นมีข้อผิดพลาดอย่างแน่นอน

RAMmap สามารถยืนยันสิ่งนี้ได้ (บนแท็บ "ใช้การนับ" ดูที่ผลรวมของ "Nonpaged Pool") แต่ไม่สามารถช่วยคุณค้นหาไดรเวอร์ที่เป็นสาเหตุของมัน

นี่คือวิธีการค้นหา: รับสำเนาของเครื่องมือ Microsoft "พูล" มันเป็นเครื่องมือโหมดตัวละคร (เด็กชายมันเคย) กระจายกับชุดไดรเวอร์ Windows สำหรับ Windows 7 WDK เป็นฟรีดาวน์โหลด คุณต้องดาวน์โหลดทุกสิ่ง (เป็น ISO) และติดตั้งจากสิ่งนั้น แต่คุณสามารถเลือกที่จะติดตั้งเพียงแค่เครื่องมือถ้านั่นคือทั้งหมดที่คุณต้องการ

ค้นหา poolmon ในไดเรกทอรี WDK - อย่าลืมเลือกหนึ่งขวา 32- หรือ 64- บิต - และเรียกใช้จากพรอมต์คำสั่งของผู้ดูแลระบบ คุณจะได้รับการแสดงเช่นนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้กดปุ่ม "p" (ไม่ฉันไม่ได้ล้อเล่นไม่มีเมนูที่นี่!) จนกระทั่งคอลัมน์ "ประเภท" แสดงเฉพาะ "Nonp" จากนั้นกด "b" (จำเป็นถ้าสองครั้ง) เพื่อเรียงลำดับการแสดงผลจากมากไปน้อยตามคอลัมน์ Bytes (ซึ่งได้ทำไปแล้วในตัวอย่างที่นี่)

จากนั้นดูที่คอลัมน์ "แท็ก" สำหรับบรรทัดบนสุด ในกรณี (ชัดประดิษฐ์) ที่แสดงที่นี่มัน "รั่ว" (ระบบนี้กำลังเรียกใช้โปรแกรมควบคุมที่ถูก bugged โดยเจตนาเพื่อทำให้เกิดปัญหานี้ - เป็น "nonpaged pool" แบบไม่มีการรั่วไหล)

btw, บรรทัดที่ไฮไลต์คือบรรทัดที่เปลี่ยนไปตั้งแต่การอัพเดตก่อนหน้านี้ไปยังหน้าจอที่เก่าแก่นี้

ตอนนี้ค้นหา c: \ Windows \ System32 \ Drivers สำหรับไฟล์. sys ที่มีสตริงนั้น ในกรณีนี้คุณจะมองหา "Leak" เช่นนี้:

c:\windows\system32> findstr /s Leak *.sys

จากนั้นค้นหาเว็บเพื่ออ้างอิงถึงสตริงนั้นและ / หรือชื่อไดรเวอร์นั้น

การกลับมาที่นี่และรายงานชื่อเต็มชื่อผู้ผลิต ฯลฯ จากไฟล์. sys จะเป็นประโยชน์เช่นกัน

(เดิมพันของฉันคือแท็กที่คุณค้นหาจะเป็น ECMC ไดรเวอร์คือ intmsd.sys และเชื่อมโยงกับผลิตภัณฑ์ที่เรียกว่า ExpressCache หรือ IntelliMemory ฉันจะ "ถอนการติดตั้ง" ผลิตภัณฑ์นั้นมีการอัปเดตเพื่อแก้ไขปัญหา กับรุ่นที่แก้ไขแล้วฉันไม่เคยเห็นประสิทธิภาพของระบบที่ปรับปรุงโดยผลิตภัณฑ์นี้มันซ้ำซ้อนกับฟังก์ชันการทำงานที่มีอยู่แล้วใน Windows)

หากคุณไม่พบวิธีดังกล่าวขั้นตอนต่อไปคือการใช้ "Windows Performance Toolkit" ค้นหาฟอรัมนี้สำหรับสตริงนั้นพร้อมคำตอบโดย magicandre1981 สำหรับวิธีการ ละเว้นคำตอบที่กล่าวถึง xperf - เป็นเครื่องมือรุ่นเก่ากว่า

UPDATE: ตามความคิดเห็น OP ได้ทำข้างต้นและพบว่าแม้ว่า poolmon รายงานขนาดทั้งหมดของพูลที่ไม่ใช่เพจขนาดใหญ่แน่นอนชิ้นส่วนที่จัดสรรทั้งหมดนั้นมีขนาดเล็กมาก การคาดเดาของฉัน (ในความคิดเห็น) ก็คือสิ่งนี้เกิดจากสิ่งที่ฉันจะเรียกว่า "bloated" พูล: พูลถูกจัดสรรแล้วปล่อย แต่ด้วยเหตุผลบางอย่างที่จำนวน RAM ที่จัดสรรให้กับพูลไม่หดเพื่อสะท้อน "พ้น" . ทำตามขั้นตอนที่อธิบายไว้ในคำตอบนี้โดย magicandre อาจระบุผู้กระทำผิด


ขอขอบคุณที่สละเวลาตรวจสอบมากกว่าที่คนอื่นมี! ฉันจะกระตุ้นให้เกิดการรั่วไหลโดยใช้poolmonวันนี้ถ้าฉันมีเวลาและพยายามอ่านคำตอบของคุณอย่างใกล้ชิดยิ่งขึ้นเพื่อให้แน่ใจว่าฉันเข้าใจ คุณกำลังบอกว่าอาจมีหน่วยความจำรั่ว? ถ้าเป็นเช่นนั้นนั่นเป็นไปได้ทั้งหมดเนื่องจากเรากำลังพัฒนาซอฟต์แวร์ที่ทราบว่ามีการรั่วไหลของหน่วยความจำที่น่ากลัว
DumpsterDoofus

@DumpsterDoofus: ใช่ อาจมีหน่วยความจำรั่วในไดรเวอร์โหมดเคอร์เนล สิ่งนี้แตกต่างจากหน่วยความจำรั่วในแอพ
เจมี่ Hanrahan

ในที่สุดฉันก็เลยต้องไปทำงานpoolmon.exeบนเซิร์ฟเวอร์ที่เป็นปัญหาและแก้ไขคำถามของฉันเพื่อรวมภาพหน้าจอ poolmonระบุว่าฉันมีพูลที่ไม่ใช่เพจจิ้งขนาด 6GB (ตามที่คุณชี้ให้เห็นจากภาพหน้าจอตัวจัดการงานของฉัน) แต่เมื่อฉันดูกระบวนการ "Nonp" เท่านั้นและจัดเรียงตามขนาดพวกเขาทั้งหมดเล็กมาก คุณมีความคิดเห็นใด ๆ หรือpoolmonไม่ว่าทำไมถึงตรวจไม่พบการใช้พูลแบบ nonpaged จำนวนมาก?
DumpsterDoofus

2
อ่า ... ปัญหานี่คือคำว่า "การใช้งาน" ดังนั้นคุณมีพูลแบบ nonpaged ขนาด 6 GB แต่ปรากฏว่ามีการใช้งานเพียงเล็กน้อยในขณะนี้ อนิจจาที่ฉันรู้ (ไม่ใช่ TM ไม่ใช่ poolmon ไม่ใช่ RAMmap) แสดงจำนวนพูลที่ใช้งานจริง ฉันเดาว่ามีผู้ใช้พูลจำนวนมากในครั้งเดียวดังนั้นพูลจึงถูกขยายเพื่อรองรับและจากนั้นผู้ใช้จำนวนมากก็หายไป เนื่องจากวิธีการจัดการกับพูลนั้นไม่ใช่เรื่องง่ายที่จะเพิ่ม RAM เมื่อจัดสรรไปแล้วเว้นแต่การจัดสรรจะอยู่ในกลุ่มก้อนขนาดใหญ่ที่ต่อเนื่องกัน ฉันขอแนะนำให้ดูสิ่งนี้หลังจากเริ่มต้นระบบใหม่
Jamie Hanrahan

มีรุ่นของ poolmon.exe อยู่ใน Support Tools สำหรับ Server 2003 ( serverfault.com/questions/84479/ … ) - เก่าไปหน่อย แต่มันเป็นเพียงการดาวน์โหลด 5.2MB เท่านั้นและยังคงทำงานบนเซิร์ฟเวอร์อย่างน้อยปี 2559
mwfearnley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.