Linux: การแลกเปลี่ยนทั้งหมดที่ใช้ = swap ที่ใช้โดยกระบวนการ +?


17

ดังนั้นฉันกำลังพยายามตรวจสอบว่าการใช้ swap มาจากไหนในระบบที่มีการใช้ swap สูง:

# free
             total       used       free     shared    buffers     cached
Mem:        515324     508800       6524          0       4852      27576
-/+ buffers/cache:     476372      38952
Swap:       983032     503328     479704

การเพิ่มค่า swap ที่ใช้ต่อกระบวนการ:

# for proc in /proc/*; do cat $proc/smaps 2>/dev/null | awk '/Swap/{swap+=$2}END{print swap "\t'`readlink $proc/exe`'"}'; done | sort -n | awk '{total+=$1}/[0-9]/;END{print total "\tTotal"}'
0       /bin/gawk
0       /bin/sort
0       /usr/bin/readlink
28      /sbin/xxxxxxxx
52      /sbin/mingetty
52      /sbin/mingetty
52      /sbin/mingetty
52      /sbin/mingetty
56      /sbin/mingetty
56      /sbin/mingetty
60      /xxxxxxxxxxx
60      /usr/sbin/xxx
84      /usr/sbin/xxx
108     /usr/bin/xxx
168     /bin/bash
220     /sbin/init
256     /sbin/rsyslogd
352     /bin/bash
356     /bin/bash
360     /usr/sbin/sshd
496     /usr/sbin/crond
672     /usr/sbin/sshd
12972   /opt/jdk1.6.0_22/bin/java
80392   /usr/libexec/mysqld
311876  /opt/jdk1.6.0_22/bin/java
408780  Total

ซึ่งให้ค่าที่ต่ำกว่าสำหรับการแลกเปลี่ยนที่ใช้ทั้งหมด swapspace ที่เหลือใช้อยู่ที่ไหน มันคือ vmalloc () 'ed หน่วยความจำภายในเคอร์เนล? อื่น ๆ อีก? ฉันจะระบุได้อย่างไร

ผลลัพธ์ของ meminfo:

# cat /proc/meminfo 
MemTotal:       515324 kB
MemFree:          6696 kB
Buffers:          5084 kB
Cached:          28056 kB
SwapCached:     157512 kB
Active:         429372 kB
Inactive:        65068 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:       515324 kB
LowFree:          6696 kB
SwapTotal:      983032 kB
SwapFree:       478712 kB
Dirty:             100 kB
Writeback:           0 kB
AnonPages:      399456 kB
Mapped:           8792 kB
Slab:             7744 kB
PageTables:       1820 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:   1240692 kB
Committed_AS:  1743904 kB
VmallocTotal:   507896 kB
VmallocUsed:      3088 kB
VmallocChunk:   504288 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     4096 kB

มีการรวมบัฟเฟอร์และแคชและไม่เกี่ยวข้องกับกระบวนการใด ๆ
goldilocks

2
@goldilocks: ไม่พวกนั้นอยู่ในหน่วยความจำกายภาพ นอกจากนี้พวกเขาจะไม่เพิ่มขึ้น
ninj

คุณพูดถูกฉันคิดว่าการแคชข้อมูลเพื่อสลับจะไม่มีจุดหมาย อย่างไรก็ตามฉันคิดว่าสิ่งของที่ถูกสับเปลี่ยนอาจถูกทิ้งไว้ที่นั่นและติดตามแม้หลังจากกระบวนการที่เจ้าของหมดอายุแล้วตราบใดที่พื้นที่สว็อปนั้นไม่จำเป็น ซึ่งจะช่วยประหยัดเวลาในภายหลังหากกระบวนการโหลดหน้าเดียวกันจากนั้นหน้านั้นจะต้องถูกสลับออกอีกครั้ง - มันยังคงอยู่ในการสลับแล้ว Google "swap cache" linux-tutorial.info/modules.php?name=MContent&pageid=314 แนวนี้เป็นที่มาของ "แคชแคช" ที่เกิดขึ้นจริง
goldilocks

... ความหมายฮ่า ๆ ๆ ที่ "สิ่งต่างๆ ที่แคชในการแลกเปลี่ยน" นั้นไม่มีจุดหมายเลยเพียงว่ามันไม่ได้ไปที่นั่นโดยการเปลี่ยนแคชแรม
goldilocks

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

คำตอบ:


11

ความแตกต่างที่คุณสังเกตอยู่นั้นไม่ได้เกิดจากการสลับพื้นที่ที่ไม่ได้รับการเติมเงิน "(ถูกลบ)" ที่เคอร์เนลบางครั้งต่อท้าย/proc/*/exeลิงค์จะถูกเอาท์พุทreadlinkและทำให้เกิดข้อผิดพลาดในการแยกวิเคราะห์สคริปต์ awk ของคุณและคุณไม่นับกระบวนการที่มีไบนารีซึ่งไม่มีอยู่ในผลรวมของคุณอีกต่อไป

เมล็ดบางส่วนจะผนวกคำว่า "(ถูกลบ)" เพื่อเชื่อม/proc/*/exeโยงเป้าหมายเมื่อมีการเรียกใช้งานดั้งเดิมสำหรับกระบวนการนั้น

เหตุผลที่คำสั่งของคุณแสดงน้อยกว่าผลรวมเป็นเพราะสิ่งนี้ ผลลัพธ์ของการreadlinkเชื่อมโยงดังกล่าวจะเป็นเช่น "/ path / to / bin (ถูกลบ)" ซึ่งทำให้เกิดข้อผิดพลาดในการแยกวิเคราะห์awkเมื่อผลลัพธ์ถูกแทนที่กลับเข้าไปในสตริง (มันไม่ชอบวงเล็บและช่องว่าง) ตัวอย่างเช่นทำสิ่งนี้:

for a in /proc/*/exe ; do readlink $a ; done | grep deleted

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

หากคุณเรียกใช้คำสั่งดั้งเดิมโดยไม่เปลี่ยนเส้นทาง stderr ทุกที่คุณอาจสังเกตเห็นข้อผิดพลาด "ค่าคงที่สตริงคงที่" ไม่กี่ข้อ ข้อผิดพลาดเหล่านั้นเป็นผลมาจากด้านบนและคุณไม่ควรเพิกเฉย

ไม่สนใจการปรับปรุงที่เป็นไปได้อื่น ๆ กับคำสั่งดั้งเดิมของคุณคุณสามารถแก้ไขได้โดยการลบ "(ลบแล้ว)" เช่นนี้ (หมายเหตุ|awk '{print $1}'เพิ่มลงในreadlinkเอาต์พุต):

for proc in /proc/*; \
  do cat $proc/smaps 2>/dev/null | awk '/Swap/{swap+=$2}END{print swap "\t'`readlink $proc/exe|awk '{print $1}' `'" }'; \
done | sort -n | awk '{total+=$1}/[0-9]/;END{print total "\tTotal"}'

การใช้awkเพื่อแก้ไขเอาต์พุตของreadlinkอาจแตกหากชื่อมีช่องว่าง - คุณสามารถใช้sedหรือวิธีใดก็ได้ที่คุณต้องการ

ข้อมูลโบนัส

smem -tโดยวิธีการที่คุณก็สามารถใช้ คอลัมน์ "สลับ" แสดงสิ่งที่คุณต้องการ

สำหรับการคำนวณด้วยตัวคุณเองคุณสามารถรับข้อมูลนี้ได้โดยตรงจากVmSwapเขตข้อมูลใน/proc/*/status(smaps ต้องการการสนับสนุนเคอร์เนลและไม่พร้อมใช้งานเสมอ) และหลีกเลี่ยงการเปลี่ยนเส้นทางข้อผิดพลาดออกโดยใช้รูปแบบชื่อไฟล์ที่เหมาะสมที่หลีกเลี่ยง ข้อผิดพลาดที่จะเริ่มต้นด้วย:

for proc in /proc/[0-9]*; do \
  awk '/VmSwap/ { print $2 "\t'`readlink $proc/exe | awk '{ print $1 }'`'" }' $proc/status; \
done | sort -n | awk '{ total += $1 ; print $0 } END { print total "\tTotal" }'

หากคุณไม่ต้องการไบนารี่จริงและสามารถจัดการเพียงแค่มีชื่อกระบวนการคุณสามารถรับทุกอย่างจากstatus:

for a in /proc/*/status ; do \
  awk '/VmSwap|Name/ { printf $2 " " } END { print "" }' $a ; \
done | awk '{ total+=$2 ; print $0 } END { print "Total " total }'

และในที่สุดหากเพียงแค่มี PID เพียงพอคุณก็สามารถทำได้ทั้งหมดด้วยawk:

awk '/VmSwap/ { total += $2; print $2 "\t" FILENAME } END { print total "\tTotal" }' /proc/*/status

บันทึก:

ตอนนี้ไม่ได้หมายความว่าไม่มีความแตกต่างระหว่างfreeและsmem(หลังเหมือนกันกับสคริปต์ของคุณ) มีมากมาย (ดูตัวอย่างhttps://www.google.com/search?q=smem+freeซึ่งมีผลลัพธ์เพียงพอในหน้าแรกเพื่อตอบคำถามของคุณเกี่ยวกับการใช้หน่วยความจำ) แต่หากไม่มีการทดสอบที่เหมาะสมสถานการณ์เฉพาะของคุณจะไม่สามารถแก้ไขได้


5

Swap ยังใช้โดย tmpfs หากเคอร์เนลต้องการหน่วยความจำว่างมากขึ้นหรือเพียงเพราะมันไม่ได้ใช้งานมาระยะหนึ่งแล้วดังนั้นการใช้งาน tmpfs ใด ๆ อาจใช้การแลกเปลี่ยน


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