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.

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

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.


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

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


Gunakan ps -e -orss=,pid=,args= | sort -b -k1,1nuntuk memasukkan id proses
Yakub

psdapat mengurutkan sendiri:ps -eo rss=,args= --sort +rss
phil294


3

Daftar proses dengan penggunaan mem

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


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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.