มีการรายงานการใช้หน่วยความจำใน Linux อย่างไร


17

เมื่อใช้ ps ฉันจะเห็นขนาด vsize (เหมือนกับ VIRT ของ top หรือไม่) และ rss (เหมือนกับ res ของ top?) (อีกหนึ่งที่ฉันเห็นด้านบนคือ SHR)

มีใครสรุปให้ฉันได้ไหม


ฉันอยากเห็นสรุปที่ดีในหน้านี้มากกว่าลิงก์ที่อาจหายไปเพื่อให้หน้านี้สามารถใช้เป็นข้อมูลอ้างอิงได้
Jim Hunziker

คำตอบ:


34

ในระยะสั้น:

  • ขนาดเสมือน:จำนวนพื้นที่ที่อยู่ที่กระบวนการกำลังจัดการอยู่ พื้นที่ที่อยู่เสมือนมีทุกอย่างที่กระบวนการสามารถเข้าถึงผ่านตัวชี้ (การอ้างอิงที่อยู่หน่วยความจำ) ตัวอย่างเช่นหากโปรแกรมของคุณเข้าถึง framebuffer ของการ์ดแสดงผลหน่วยความจำนั้นจะถูกแมปกับพื้นที่เสมือนของกระบวนการและรับที่อยู่ที่จัดเก็บไว้ในตัวชี้ ไฟล์ที่แม็พหน่วยความจำและการแม็พแบบไม่ระบุชื่อจะถูกพิจารณาเป็นขนาดพื้นที่ที่อยู่เสมือน ค่อนข้างทุกอย่างในขนาดเสมือน หากคุณสรุปขนาดของช่วงที่อยู่ทั้งหมดที่มีในรายการ/proc/<pid>/mapsควรจะส่งคืนค่าเท่ากับขนาดเสมือนจริงโดยประมาณ

  • ขนาดที่อยู่อาศัย:คือจำนวนหน่วยความจำที่เป็นของกระบวนการนั้นที่อยู่ในหน่วยความจำ นั่นหมายถึงปริมาณหน่วยความจำที่ไม่ได้อยู่ในการสลับ โปรดทราบว่าบางส่วนของกระบวนการสามารถอยู่ในหน่วยความจำสลับได้แม้ในขณะที่กระบวนการกำลังทำงานอยู่ ระบบปฏิบัติการจะดึงภูมิภาคเหล่านี้ออกจากการสลับเมื่อกระบวนการพยายามเข้าถึง ซึ่งควรรวมถึงฮีปสแต็กของเธรดทั้งหมดและการแมปส่วนตัวอื่น ๆ ถ้าคุณมองใน/proc/<pid>/mapsการ[stack], [heap]และแมปที่ไม่ระบุชื่ออื่น ๆ (ผู้ที่ไม่มีเส้นทางแฟ้ม) จะสลับหรือคิดในขนาดที่มีถิ่นที่อยู่

  • ขนาดที่ใช้ร่วมกัน:คือจำนวนหน่วยความจำที่อาจเป็นของหลายกระบวนการ ตัวอย่างเช่นหากคุณมีอินสแตนซ์สี่แอปพลิเคชันเดียวกันที่โหลดในหน่วยความจำคุณจะมีสี่อินสแตนซ์ของฮีปและอย่างน้อยสี่สแต็กอย่างใดอย่างหนึ่งสำหรับแต่ละกระบวนการ (นี่คือหน่วยความจำถิ่นที่อยู่) รหัสไบนารีของโปรแกรมและไลบรารีของมัน นี่คือพื้นที่ที่ใช้ร่วมกัน ไม่เพียง แต่จะรวมถึงรหัสไบนารีของโปรแกรมและไลบรารีของมันเท่านั้น แต่ยังรวมถึงไฟล์การแปลข้อมูลโปรแกรมแบบอ่านอย่างเดียวเซ็กเมนต์หน่วยความจำที่แบ่งใช้ SysV และ POSIX, เซมาฟอร์ ฯลฯ ... หากคุณดู/proc/<pid>/mapsการแมปส่วนใหญ่ผูกอยู่กับไฟล์ไลบรารีและโปรแกรม ที่ใช้ร่วมกัน

โปรดทราบว่า VIRT มีการรวม RSS และ SHR และจะมากกว่าหนึ่งในนั้น อาจมีภูมิภาคที่คิดว่าเป็นทั้ง RSS และ SHR


2
อนึ่งใน linux รุ่นล่าสุดคุณสามารถดูรายละเอียดการแบ่งการใช้หน่วยความจำได้ใน / proc / <pid> / smaps
bdonlan

1
ขนาดที่ใช้ร่วมกันคือหน่วยความจำที่อาจแบ่งปัน หากแอปพลิเคชันเป็นผู้ใช้ห้องสมุดเพียงคนเดียวไลบรารีจะถูกเก็บไว้ในหน่วยความจำด้วยกระบวนการเดียว วิธีนี้แม้แต่หน่วยความจำที่ใช้ร่วมกันอาจเป็นหน่วยความจำ "กระบวนการที่เป็นเจ้าของ"
Hubert Kario

6

ใน Juliano คำตอบ:

โปรดทราบว่า RSS + SHR <= VIRT เสมอ

นี่เป็นเพียงความเท็จ SHR มีหน่วยความจำเสมือนทั้งหมดที่สามารถใช้ร่วมกับกระบวนการอื่น ๆ และ RSS มีหน่วยความจำทั้งหมดใน RAM ที่กระบวนการใช้

ดังนั้นหน่วยความจำที่ใช้ร่วมกันทั้งหมดในปัจจุบันจะถูกนับทั้งใน SHR และใน RSS ดังนั้น SHR + RSS จึงไม่มีความหมายเนื่องจากสามารถมีจำนวนซ้ำได้

หากต้องการสร้างกระบวนการด้วย RSS + SHR> VIRT เพียงแค่ mmap ไฟล์ขนาดใหญ่ (1GB) จากนั้นอ่านให้ครบถ้วน: ไฟล์ mmaped จะถูกโหลดใน RAM และ VIRT, SHR และ RSS แต่ละตัวจะเล็กกว่า 1GB ดังนั้น SHR + RSS> VIRT


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