เครื่องเสมือนสามารถใช้ RAM ขนาดเล็กบนเครื่องโฮสต์จริงได้อย่างไร


24

ฉันใช้ VirtualBox บนเครื่อง Windows XP ที่มี 2GB RAM ฉันสร้างเครื่อง Ubuntu เสมือนและจัดสรรหน่วยความจำพื้นฐานเป็น 750MB

เพียงเพื่อทดสอบฉันวิ่ง 20 สิ่งพร้อมกันบนเครื่องเสมือน ตามที่ "top" ในอูบุนตูมีการใช้หน่วยความจำ 750 เมกะไบต์รวมถึงพื้นที่สว็อปจำนวนมาก

อย่างไรก็ตามใน Windows Task Manager VitrualBox ใช้หน่วยความจำเพียง 45,000K เท่านั้น เมื่อฉันขอให้เครื่องเสมือนทำมากขึ้นการใช้งาน CPU ของกระบวนการ VirtualBox ก็เพิ่มขึ้น (ใน Windows) แต่การใช้หน่วยความจำยังคงเหมือนเดิม

เครื่องเสมือนที่ใช้หน่วยความจำ 750 MB สามารถใช้หน่วยความจำ 45 MB บนเครื่องจริงได้อย่างไร

ฉันคิดว่าคำตอบคือเครื่องเสมือนไม่ได้ใช้หน่วยความจำจริง แต่เป็นหน่วยความจำแบบจำลอง (เช่นพื้นที่สว็อป) แต่แน่นอนว่ารู้สึกเหมือนกำลังวิ่งอยู่ใน RAM

UPDATE: ฉันเล่นกับ perfmon ตามที่แนะนำ แม้แต่การสรุปทุกอย่างที่ฉันคิดได้มันก็ดูเหมือนว่าจะใช้เวลาน้อยกว่า 300 megs ... ดังนั้นมันจึงยังคงเป็นปริศนา

Process               VirtualBox     VirtualBox#1     Total
PoolNonpagedBytes     5,840          42,552           48,392
PoolPagedBytes        119,796        166,892          286,688
PrivateBytes          8,884,224      52,719,616       61,603,840
VirtualBytes          75,939,840     161,202,176      237,142,016
Sum                   84,949,700     214,131,236      299,080,936

คำตอบ:


7

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

หากต้องการแสดงสิ่งนี้ให้ไปที่ perfmon คลิกเพื่อเพิ่มตัวนับ (ฉันเป็นคนแบบCtrl+ Iคน) "วัตถุประสิทธิภาพ" จะเป็น "กระบวนการ" โดยที่ "ส่วนตัวไบต์" อยู่ในรายการตัวนับ - แน่นอนว่าคุณต้องเลือกกระบวนการที่เกี่ยวข้องจากรายการด้านขวา


สวัสดี ฉันลองสิ่งนี้ แต่ไม่มีโชคในการค้นหาสิ่งที่เรียกว่า Private Bytes คุณให้ทีละขั้นตอนได้ไหม?
dggoldst

ได้เพิ่ม ...
Rowland Shaw

ขอบคุณสิ่งนี้มีประโยชน์มาก ฉันได้เพิ่มการวิเคราะห์คำถาม ยังไม่สามารถระบุได้ว่าทำไมถึงไม่รวม 750
dggoldst

แปลกมาก. ฉันสามารถชี้ให้เห็นว่า PrivateBytes เป็นส่วนย่อยของ VirtualBytes (ไบต์เสมือนเป็นสัดส่วนของพื้นที่ที่อยู่ที่จัดสรรในขณะที่ไบต์ส่วนตัวคือหน่วยความจำที่ยังไม่ได้รับอิสระ - คุณสามารถแยกส่วนของหน่วยความจำที่มีการรั่วไหลของหน่วยความจำขนาดเล็ก แอปพลิเคชันจะตายโดยมีหน่วยความจำไม่เพียงพอแม้ว่าจะมีมากมาย) อาจเป็นไปได้ว่าไดรเวอร์เวอร์ชวลไลเซชั่นกำลังจัดสรรหน่วยความจำในลักษณะที่หมายความว่ามันจะไม่ปรากฏขึ้นซึ่งจะเหมาะสมตามที่หน่วยความจำควรมีภูมิคุ้มกันจากการแยกเพจออกไปยังดิสก์
Rowland Shaw

ในสี่เคาน์เตอร์ที่คุณวางไว้ในตารางของคุณเฉพาะ "PoolNonPagedBytes" คือจำนวนหน่วยความจำเสมือนที่ไม่สามารถเพจได้ดังนั้นจำนวนหน่วยความจำฟิสิคัลที่จะถูกใช้ เช่นเดียวกับขนาดหน่วยความจำเสมือนอื่น ๆ ที่หน่วยความจำเสมือนจริงที่ใช้จริงนั้นน้อยกว่านั่นคือหนึ่งในหน่วยความจำเสมือนทั้งหมด
เจมี่ Hanrahan

5

ด้วยโซลูชั่น virtualisation บางอย่างภายใต้ Linux วิธีที่พวกเขาจัดสรรหน่วยความจำทำให้ดูเหมือนว่าโฮสต์เคอร์เนลเป็นไฟล์ที่แมปหน่วยความจำพิเศษ (คล้ายกับ/proc/kcoreไฟล์พิเศษ) ดังนั้นมันจึงถูกนับในจำนวน "แคช" ในเอาต์พุตจากfreeไม่ใช่ นับ "ใช้แล้ว"

ฉันคิดว่าสิ่งที่คล้ายกันเกิดขึ้นกับสภาพแวดล้อม Windows ของคุณ: 45Mb จะถูกใช้โดยกระบวนการจัดการของ VirtualBox และ 750 ที่จัดสรรให้กับ VM จะถูกนับที่อื่น


0

อาจเป็นหน่วยความจำเสมือนไฟล์ที่แมปหน่วยความจำหรือสิ่งที่คล้ายกัน

คุณได้ลองแสดงคอลัมน์อื่น ๆ ในตัวจัดการงานหรือไม่


0

อย่าเชื่อตัวจัดการงาน มองไม่เห็นทุกอย่าง

ปัญหานี้พบเห็นได้ทั่วไปใน SQL Server ตัวอย่างเช่น ด้วย Sql ฉันไม่เคยพบใครที่บอกวิธีรับข้อมูลที่ถูกต้องจากตัวจัดการงานซึ่งจะทำให้ฉันเชื่อว่ารูปไม่ได้ถูกซ่อนอยู่ในหนึ่งในนั้น คอลัมน์อื่น ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.