ฉันจะแสดงการใช้หน่วยความจำของแต่ละกระบวนการได้อย่างไรหากฉันทำ 'ps -ef'


24

ใน Linux วิธีการที่ฉันสามารถแสดงการใช้งานหน่วยความจำของแต่ละขั้นตอนถ้าฉันทำps -ef? ฉันต้องการดู 'หน่วยความจำเสมือน', 'หน่วยความจำ res', 'หน่วยความจำที่ใช้ร่วมกัน' ของแต่ละความคืบหน้า ฉันสามารถรับได้ผ่านtopแต่ฉันต้องการข้อมูลเดียวกันในps -efเพื่อที่จะสามารถท่อส่งออกไปgrepด้วยชื่อกระบวนการของฉัน

คำตอบ:


8

การรับหน่วยความจำผ่าน ps ทำได้ค่อนข้างไม่น่าเชื่อถือ หากคุณมีเคอร์เนลใหม่กว่านี้ควรสนับสนุน / proc / pid # / smaps ซึ่งให้ข้อมูลรายละเอียดเกี่ยวกับการใช้หน่วยความจำแต่ละกระบวนการ ด้านล่างนี้เป็นสคริปต์ที่ค่อนข้างสกปรกและรวดเร็วที่จะวนซ้ำแต่ละขั้นตอนที่เปิดและรับการใช้งานขนาด, Rss, Pss และ Shared Clean / Dirty หวังว่ามันจะมีประโยชน์ในทางใดทางหนึ่ง

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [ -f /proc/$pid/smaps ]; then
            echo "* Mem usage for PID $pid"
            echo "-- Size:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Size: | awk '{print $2}'
            echo "-- Rss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Rss: | awk '{print $2}'
            echo "-- Pss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Pss: | awk '{print $2}'
            echo "Shared Clean"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared_Clean:' | awk '{print $2}'
            echo "Shared Dirty"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared Dirty:' | awk '{print $2}'
    fi
done

1
คุณควรสรุปคอลัมน์ขนาด ดูคำตอบของ ezsmith ด้านล่าง
โหระพา

11

ps ef -o command,vsize,rss,%mem,size

ฉันไม่พบตัวเลือกสำหรับหน่วยความจำที่ใช้ร่วมกัน แต่ฉันพบตัวเลือกสำหรับ% ของหน่วยความจำกายภาพทั้งหมดและจำนวนของพื้นที่สเปซที่จะต้องใช้เพื่อสลับกระบวนการ สิ่งนี้และอีกมากมายถูกบันทึกไว้ใน man page สำหรับ ps


บัญชี Linux ใช้หน่วยความจำที่แชร์ในหน่วยความจำสำหรับแต่ละกระบวนการซึ่งอาจนำไปสู่ผลรวมปลอมหากคุณมีกระบวนการจำนวนมากที่เชื่อมต่อกับส่วนหน่วยความจำที่แชร์ขนาดใหญ่ top,, psและโปรแกรมที่คล้ายกันล้วนได้รับผลกระทบจากสิ่งนี้ในลักษณะเดียวกัน
Peter Eisentraut

ฉันรู้ว่าหน่วยความจำที่แชร์ทำงานอย่างไร แต่ปรากฏว่า ps ไม่สามารถให้ข้อมูลนั้นได้ (หรือฉันไม่สามารถค้นหาได้ในเอกสารประกอบ ps ของฉันอย่างน้อย) top หรือ htop จริง ๆ แล้วสามารถแสดงการใช้หน่วยความจำแบบแบ่งใช้ตามกระบวนการ
จัสตินสมิ ธ

9

คำตอบของ @ user26528 ไม่ได้คำนวณหน่วยความจำอย่างถูกต้อง - คุณต้องการผลรวมของการจับคู่ในรูปแบบ smaps ไม่ใช่เฉพาะส่วนบนสุด สคริปต์นี้ควรทำ:

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [ -f /proc/$pid/smaps ]; then
        echo "* Mem usage for PID $pid"     
        rss=$(awk 'BEGIN {i=0} /^Rss/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pss=$(awk 'BEGIN {i=0} /^Pss/ {i = i + $2 + 0.5} END {print i}' /proc/$pid/smaps)
        sc=$(awk 'BEGIN {i=0} /^Shared_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)            
        sd=$(awk 'BEGIN {i=0} /^Shared_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pc=$(awk 'BEGIN {i=0} /^Private_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pd=$(awk 'BEGIN {i=0} /^Private_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        echo "-- Rss: $rss kB" 
        echo "-- Pss: $pss kB"
        echo "Shared Clean $sc kB"
        echo "Shared Dirty $sd kB"
        echo "Private $(($pd + $pc)) kB"
    fi
done

ผลลัพธ์: บรรทัดที่ 16: +: ข้อผิดพลาดทางไวยากรณ์: ตัวถูกดำเนินการที่คาดไว้ (โทเค็นข้อผิดพลาดคือ "+") ซึ่งเป็นบรรทัดที่มี: echo "ส่วนตัว $ (($ pd + $ pc)) kB" ฉันทำงานบน CentOS 7 .
โหระพา A

2
@evsmith ทำไมเพิ่ม 0.5 ถึง Pss?
Pete

1
การเรียกใช้สคริปต์ Awk ขนาดเล็ก 10,000 ตัวเป็นปฏิปักษ์ที่ยิ่งใหญ่คุณควรปรับโครงสร้างทั้งหมดนี้ให้เป็นสคริปต์ Awk เดียว
tripleee

แต่สคริปต์นี้ใช้หน่วยความจำมากเกินไป
mehmet riza oz

8

รายการกระบวนการโดยการใช้หน่วยความจำ

ps -e -orss =, args = | sort -b -k1,1n


ใช้ps -e -orss=,pid=,args= | sort -b -k1,1nเพื่อรวมรหัสกระบวนการ
จาค็อบ

psสามารถจัดเรียงได้ด้วยตัวเอง:ps -eo rss=,args= --sort +rss
phil294


3

รายการกระบวนการโดยการใช้ mem

คำสั่ง: ps -e -orss =, args = | sort -b -k1,1n | ราคาก่อนหน้า $ COLUMNS \


3

ปรับปรุง:

หนึ่งซับต่อไปนี้ยังให้ข้อมูลเกี่ยวกับการใช้หน่วยความจำทั้งหมดโดยผู้ใช้ปัจจุบัน

echo "------------------------------------" && mem=0 && while read -r rss comm ; do mbs=$((rss/1024)); mem=$((mbs + mem)); echo $mbs"MB - $comm"; done <<< "$(ps -u $USER -wo rss=,comm= --sort -rss)" && echo "------------------------------------" && echo $mem"MB: Memory used by user '$USER'"

ฉันเพิ่งจะแสดงกระบวนการผู้ใช้ทั้งหมดเรียงตามการใช้หน่วยความจำสูงสุดใน MB เช่นนี้:

ps -u $USER -wo rss=,comm= --sort -rss | while read -r rss comm ; do echo $((rss/1024))"MB -" $comm; done

คุณสามารถใช้command=แทนcomm=การแสดงกระบวนการเส้นทางแบบเต็ม

=เพียงแค่เอาชื่อคอลัมน์


3

ฉันพบว่ากระบวนการเดียวกันหลายครั้งมีกระบวนการแยกย่อยและคุณมีความสนใจในหน่วยความจำทั้งหมดที่ใช้โดยกระบวนการ เช่น google chrome เริ่มต้นกระบวนการหลายขั้นตอนและคุณต้องการทราบหน่วยความจำทั้งหมดที่ถ่ายโดย chrome ฉันพบคำสั่งหนึ่งบรรทัดด้านล่างมีประโยชน์มาก

echo "%CPU   %MEM    MEM     PROCESS"
ps aux | awk '{mem[$11]+=int($6/1024)}; {cpuper[$11]+=$3};{memper[$11]+=$4}; END {for (i in mem) {print cpuper[i]"% ",memper[i]"% ",mem[i]" MB ",i}}' | sort -k3nr | head -n 5

ดูแลสิ่งต่าง ๆ มากมายเช่นแสดงหน่วยความจำเป็น MB เรียงลำดับหน่วยความจำและจัดกลุ่มตามคำสั่งเป็นหลัก นอกจากนี้ยังจัดกลุ่ม% CPU และหน่วยความจำ% มันแสดงข้อมูลในรูปแบบที่ใช้งานง่าย

คำสั่งนี้ได้แรงบันดาลใจจากคำตอบนี้และมันช่วยฉันได้มากในการทำความเข้าใจเกี่ยวกับกระบวนการที่ใช้ทรัพยากรของฉัน

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