Bagaimana saya bisa menampilkan penggunaan memori setiap proses jika saya melakukan 'ps -ef'?

24

Di Linux, bagaimana saya bisa menampilkan penggunaan memori dari setiap proses jika saya melakukan ps -ef? Saya ingin melihat 'memori virtual', 'memori res', 'memori bersama' dari setiap kemajuan. Saya bisa mendapatkannya melalui top, tapi saya ingin info yang sama ps -efsehingga saya bisa menyalurkan output grepdengan nama proses saya.

hap497
sumber

Jawaban:

8

Memperoleh penggunaan memori melalui ps sangat tidak bisa diandalkan. Jika Anda memiliki kernel yang lebih baru, ia harus mendukung / proc / pid # / smaps yang memberi Anda beberapa informasi terperinci tentang setiap proses penggunaan memori. Di bawah ini adalah script yang cukup kotor dan cepat untuk mengulangi setiap proses yang terbuka dan ambil Ukuran, Rss, Pss dan penggunaan Shared Clean / Dirty. Semoga ini bisa bermanfaat dalam beberapa cara.

#!/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
pengguna26528
sumber
1
Anda harus menjumlahkan kolom Ukuran. Lihat jawaban ezsmith di bawah ini.
Basil A
11

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

Saya tidak dapat menemukan opsi untuk memori bersama, tetapi saya menemukan opsi untuk% dari total memori fisik dan jumlah ruang swap yang akan diperlukan untuk menukar proses. Ini dan banyak lagi yang didokumentasikan di halaman manual untuk ps.

Justin Smith
sumber
Akun Linux berbagi memori dalam memori untuk setiap proses, yang dapat menyebabkan jumlah palsu jika Anda memiliki banyak proses yang melekat pada satu segmen memori bersama yang besar. top,, psdan program serupa semuanya dipengaruhi oleh ini dengan cara yang sama.
Peter Eisentraut
Saya tahu cara kerja memori bersama, tetapi tampaknya ps tidak dapat memberikan informasi itu (atau setidaknya saya tidak dapat menemukannya di dokumentasi ps saya). top atau htop sebenarnya dapat menunjukkan penggunaan memori bersama berdasarkan per proses.
Justin Smith
9

Jawaban @ user26528 tidak cukup menghitung memori dengan benar - Anda perlu jumlah pemetaan dalam pukulan, bukan hanya yang teratas. Script ini harus melakukannya:

#!/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
Evsmith
sumber
Output: baris 16: +: kesalahan sintaks: diharapkan operan (token error adalah "+") yang merupakan baris yang berisi: echo "Private $ (($ pd + $ pc)) kB", saya sedang menjalankan CentOS 7 .
Basil A
2
@evsmith mengapa menambahkan 0,5 ke Pss?
Pete
1
Menjalankan 10.000 skrip Awk kecil adalah antipattern yang sangat besar, Anda harus mengubah semua ini menjadi skrip Awk tunggal.
tripleee
tapi skrip ini sendiri menghabiskan terlalu banyak memori
mehmet riza oz
8

Daftar proses dengan penggunaan memori

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

dengan mudah-vm
sumber
Gunakan ps -e -orss=,pid=,args= | sort -b -k1,1nuntuk memasukkan id proses
Yakub
psdapat mengurutkan sendiri:ps -eo rss=,args= --sort +rss
phil294
4

Anda dapat gunakan

top -n 1
Saya.
sumber
3

Daftar proses dengan penggunaan mem

perintah: ps -e -orss =, args = | sort -b -k1,1n | pr -TW $ KOLOM \

Jijo John
sumber
3

Memperbarui:

One-liner berikut ini juga menyediakan informasi tentang total konsumsi memori oleh pengguna saat ini.

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'"

Saya baru saja mencantumkan semua proses pengguna yang diurutkan berdasarkan penggunaan memori tertinggi di MB seperti ini:

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

Anda bisa menggunakan command=alih-alih comm=menunjukkan proses path lengkap.

The =hanya menghilangkan judul kolom.

jarang
sumber
3

Saya menemukan bahwa berkali-kali proses yang sama memiliki sub proses garpu dan Anda tertarik pada total memori yang digunakan oleh proses. misal, google chrome memulai beberapa proses dan Anda ingin mengetahui jumlah memori yang diambil oleh chrome. Saya menemukan di bawah satu perintah baris ini sangat berguna

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

Ini menangani banyak hal, seperti menampilkan memori dalam MB, mengurutkan memori dan terutama mengelompokkan berdasarkan perintah. Ini juga mengelompokkan% CPU dan% memori. Itu menunjukkan data dalam format yang ramah pengguna.

Perintah ini terinspirasi dari jawaban ini dan itu membantu saya banyak untuk mendapatkan ide tentang proses mana yang mengambil sumber daya saya.

ashah
sumber