รับข้อมูลเกี่ยวกับการใช้หน่วยความจำของกระบวนการจาก / proc / pid / smaps


46

สำหรับกระบวนการที่กำหนดใน/proc/<pid>/smapsสำหรับรายการการแม็พที่กำหนดคือ:

  1. Shared_Clean
  2. Shared_Dirty
  3. Private_Clean
  4. Private_Dirty

เป็นShared_Clean+ Shared_Dirtyจำนวนหน่วยความจำที่ใช้ร่วมกันกับกระบวนการอื่น ๆ ? มันเหมือนกับ RSS ที่แชร์ใช่ไหม

ในทำนองเดียวกันPrivate_Clean+ Private_Dirtyจำนวนหน่วยความจำที่มีอยู่สำหรับกระบวนการเดียวเท่านั้นหรือไม่ ดังนั้นมันจึงเป็นเหมือน RSS ส่วนตัว?

ค่า PSS = PrivateRSS + (SharedRSS / จำนวนกระบวนการที่ใช้ร่วมกัน) หรือไม่

บางคำถามเพิ่มเติมหลังจากอ่านลิงค์นี้: LWN

ตอนนี้ให้พูดคุยเกี่ยวกับกระบวนการทั้งหมดซึ่ง smaps รายการที่เรากำลังดู

ฉันสังเกตเห็นว่าถ้าฉันทำShared_Clean+ Shared_Dirty+ Private_Clean+ Private_Dirtyสำหรับทุกรายการ smaps สำหรับกระบวนการฉันได้รับ RSS ของกระบวนการตามที่รายงานโดยpsซึ่งค่อนข้างเจ๋ง สำหรับเช่น

ps -p $$ -o pid,rss

จะให้ฉัน (ประมาณ) ค่าเดียวกันสำหรับ RSS เป็นผลรวมของทุกคนShared_Clean, Shared_Dirty, Private_Clean, Private_Dirtyรายการใน / proc / $$ / smaps

แต่แล้ว PSSสำหรับกระบวนการทั้งหมดล่ะ? จากตัวอย่างข้างต้นฉันจะรับ PSS สำหรับ $$ ได้อย่างไร ฉันสามารถเพิ่มรายการ PSS สำหรับทุกการจับคู่ smaps และไปถึง PSS สำหรับ $$ ได้หรือไม่

แล้ว USSสำหรับกระบวนการทั้งหมดล่ะ? ทำตามตัวอย่างข้างบนอีกครั้งฉันเดาว่าฉันจะมาถึง USS สำหรับ $$ โดยสรุปเฉพาะรายการส่วนตัว _ * สำหรับทุกรายการ smaps สำหรับ $$ .. ใช่ไหม?

หมายเหตุ:
PSS = ขนาดชุดตามสัดส่วน
USS = ขนาดชุดที่ไม่ซ้ำกัน

คำตอบ:


50

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

หน้าเอกชนจะมีให้เฉพาะกระบวนการที่หน้าใช้ร่วมกันจะแมปโดยกระบวนการอื่น ๆ*

RSS คือจำนวนหน้าทั้งหมดที่แบ่งใช้หรือไม่ถูกแม็พเข้ากับกระบวนการในปัจจุบัน ดังนั้นShared_Clean+ Shared_Dirtyจะเป็นส่วนที่ใช้ร่วมกันของ RSS (เช่นส่วนของ RSS ที่ถูกแมปไปยังกระบวนการอื่น ๆ ) และPrivate_Clean+ Private_Dirtyส่วนส่วนตัวของ RSS (เช่นแมปในกระบวนการนี้เท่านั้น)

PSS (ขนาดส่วนแบ่งสัดส่วน) เป็นไปตามที่คุณอธิบาย หน้าส่วนตัวจะถูกสรุปตามที่เป็นอยู่และขนาดของการแมปที่ใช้ร่วมกันแต่ละครั้งจะถูกหารด้วยจำนวนกระบวนการที่แชร์
ดังนั้นหากโปรเซสมีเพจส่วนตัว 100k เพจที่แชร์ได้ 500k กับอีกโพรเซสหนึ่งและ 500k ที่แชร์กับอีกสี่โพรเซสนั้น PSS จะเป็น:

100k + (500k / 2) + (500k / 5) = 450k

อ่านเพิ่มเติม:

เกี่ยวกับผลรวมทั่วทั้งกระบวนการ:

  • RSSสามารถเป็นได้ (ประมาณ+ ) ที่ได้รับจากการรวมRss:รายการในsmaps(คุณไม่จำเป็นต้องเพิ่มรายการที่แชร์ / ส่วนตัวที่แชร์ / สกปรก)

    awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
    
  • คุณสามารถสรุปค่าทางเดียวกันที่จะได้รับกระบวนการทั่วโลกPss:PSS
  • USSไม่ได้รายงานsmapsแต่ที่จริงแล้วมันคือผลรวมของการแมปส่วนตัวดังนั้นคุณจึงสามารถรับได้ด้วยวิธีเดียวกัน

*โปรดทราบว่าหน้า "สามารถแบ่งปันได้" จะถูกนับเป็นการทำแผนที่ส่วนตัวจนกว่าจะมีการแชร์จริง กล่าวคือหากมีเพียงหนึ่งกระบวนการที่ใช้อยู่ในปัจจุบันlibfooส่วนข้อความของห้องสมุดนั้นจะปรากฏในการแมปส่วนตัวของกระบวนการ มันจะถูกคิดในการแมปที่แชร์ (และลบออกจากไพรเวต) เฉพาะเมื่อ / เมื่อกระบวนการอื่นเริ่มใช้ไลบรารีนั้น
+ค่าไม่ได้เพิ่มขึ้นอย่างแน่นอนสำหรับกระบวนการทั้งหมด ไม่แน่ใจว่าทำไม ... ขอโทษ


ขอบคุณสำหรับคำตอบที่ดี ขอบคุณมัน ฉันอ่านบทความ LWM และนั่นเป็นแรงบันดาลใจให้ฉันถามคำถามอีกสองสามข้อดังนั้นฉันจึงเพิ่มคำถามเหล่านี้ลงไป
Ankur Agarwal

ที่ดี! มันมีประโยชน์มาก ๆ !!
camino

ฉันยังสับสนเกี่ยวกับ shared_dirty - ลักษณะที่สกปรกของสิ่งนี้ทำให้ไม่สามารถแบ่งปันได้หรือไม่
Kevin

@Kevin: ถ้าพวกเขาไม่แชร์พวกเขาจะไม่ถูกนับShared_Dirty- คุณช่วยชี้แจงคำถามของคุณได้ไหม?
Mat

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