ฉันจะค้นหากระบวนการที่กำลังใช้พื้นที่สว็อปได้อย่างไร


10

ฉันมีเซิร์ฟเวอร์ลินุกซ์รายงานสูงสุดที่ใช้ swap ประมาณ 9GB: ด้านบน

แต่ผมไม่สามารถคิดที่มันใช้แลกเปลี่ยนผลการค้นหาของ Google กล่าวว่าด้านบน - Oติดตาม commad โดยpจะแสดงการใช้งานโดยกระบวนการแลกเปลี่ยน แต่ดังที่แสดงในภาพด้านบนการสรุปผลรวมของคอลัมน์ SWAP แสดงให้เห็นว่ามีการใช้การแลกเปลี่ยน> 10GB ดังนั้นตัวเลข 9GB สำหรับการใช้ swap มาจากที่ใด

รายงานยอดนิยมที่หน่วยความจำบัฟเฟอร์ใช้ประมาณ 96492kb มีอะไรที่ฉันสามารถทำได้เพื่อใช้สิ่งนี้แทนที่จะใช้ swap?


1
ด้านบน (ตามหน้าคน) คำนวณ SWAP เป็น VIRTUAL - การใช้ ram ทางกายภาพ ไม่ถูกต้องทั้งหมดจากการทดลองของฉัน
lornix

คำตอบ:


6

มีความเป็นไปได้ที่หลายโปรแกรมจะใช้พื้นที่การสลับเดียวกันดังนั้นจะมีการรายงานสองครั้ง

ไม่จำเป็นต้องพยายามบอกให้ Linux ใช้พื้นที่บัฟเฟอร์แทนการแลกเปลี่ยน - มันฉลาดมากเกี่ยวกับสิ่งที่กำลังทำอยู่ หากคุณใช้ swap ขนาด 9gb และบัฟเฟอร์ขนาด 9gb นั่นเป็นสิ่งที่ดี ... นั่นหมายความว่า Linux รู้ว่าไม่มีการใช้งานสิ่งที่โหลดในหน่วยความจำขนาด 9 กิกะไบต์ดังนั้นจึงเป็นการดีกว่าที่จะเปลี่ยนเป็นดิสก์เพื่อให้ บัฟเฟอร์สามารถขยายใหญ่ขึ้นและปรับปรุงประสิทธิภาพของคุณ


แก้ไข:หากคุณเพิ่มหน่วยความจำทั้งหมดที่ใช้ในแต่ละกระบวนการคุณจะได้รับมากกว่า RAM จริงของคุณเช่นกัน นี่เป็นเพราะไลบรารีที่ใช้ร่วมกันถูกใช้โดยหลายโปรแกรมรวมถึงวิธีที่ Linux จัดการกับส้อม - มันไม่ได้ทำซ้ำโปรแกรมทั้งหมดในหน่วยความจำ แต่จะทำซ้ำส่วนที่ต่างกันระหว่างสองอินสแตนซ์เท่านั้น ในบางกรณีหน่วยความจำวิดีโอสามารถแสดงเป็นส่วนหนึ่งของกระบวนการ X - ฉันคิดว่าการ์ด Voodoo3 รุ่นเก่าทำเช่นนี้ อาจมีกรณีอื่น ๆ ที่หน่วยความจำ "แฟนทอม" สามารถแสดงขึ้นด้านบนเช่นกัน


ฉันไม่คิดว่าไลบรารีที่แบ่งใช้ควรนับเป็น swap เนื่องจากเมื่อเริ่มต้นระบบห้ามใช้ swap แต่มีไลบรารีที่แชร์จำนวนมากที่โหลดแล้ว อย่างไรก็ตามผมเห็นว่าการใช้ระบบของฉันเกี่ยวกับ 9GB ของพาร์ทิชัน swap ฉันเพียงแค่ต้องการที่จะหากระบวนการที่ใช้มากที่สุดในการแลกเปลี่ยน (ไม่รวมส่วนแบ่งห้องสมุดไฟล์แผนที่หน่วยความจำ ... )
secmask

3

การแยกวิเคราะห์ไดเร็กทอรีย่อย / proc:

เป็นสคริปต์ทุบตี:

for PROCESS in /proc/*/; do
  swapused=$(awk 'BEGIN { total = 0 } /^Swap:[[:blank:]]*[1-9]/ { total = total + $2 } END { print total }' ${PROCESS}/smaps 2>/dev/null || echo 0)
  if [ $swapused -gt 0 ]; then
    /bin/echo -e "${swapused}k\t$(cat ${PROCESS}/cmdline)"
  fi
done

เอาต์พุตสามารถเรียงลำดับ Hi-Lo ได้โดยการจัดเรียงไปยังท่อ:

{blah}| sort -rn

แน่นอนเขียนสิ่งนี้ในภาษาที่คุณชื่นชอบในสัปดาห์ที่คุณต้องการ Awk-fu ของฉันไม่แข็งแรง

(ตัด-N-pastable)

#!/bin/bash
#
# show swap used by processes
#
(for PROCESS in /proc/*/; do
  swapused=$(awk 'BEGIN { total = 0 } /^Swap:[[:blank:]]*[1-9]/ { total = total + $2 } END { print total }' ${PROCESS}/smaps 2>/dev/null || echo 0)
  if [ $swapused -gt 0 ]; then
    /bin/echo -e "${swapused}k\t$(cat ${PROCESS}/cmdline)"
  fi
done ) | sort -nr


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