'Ps -ef' yaparsam her işlemin bellek kullanımını nasıl görebilirim?


24

Linux'ta, bir işlem yaparsam her işlemin bellek kullanımını nasıl görüntüleyebilirim ps -ef? Her ilerlemenin "sanal hafızasını", "res hafızasını", "paylaşılan hafızayı" görmek istiyorum. Bunu başarabilirim top, ancak aynı bilgiyi istiyorum, ps -efböylece çıktıyı grepişlem adımla yönlendirebilirim.

Yanıtlar:


8

Ps kullanarak bellek kullanımı elde oldukça güvenilmez. Eğer daha yeni bir çekirdeğe sahipseniz, her işlemde bellek kullanımı hakkında ayrıntılı bilgi veren / proc / pid # / smaps desteklemelidir. Aşağıda açık olan ve Boyut, Rss, Pss ve Paylaşılan Temiz / Kirli kullanımını alan her işlemden geçecek oldukça kirli ve hızlı bir komut dosyası verilmiştir. Umarım bir şekilde yararlı olabilir.

#!/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
Boyut sütununu toplamalısınız. Aşağıdaki Ezsmith'in cevabına bakınız.
Basil A,

11

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

Paylaşılan hafıza için bir seçenek bulamadım, ancak toplam fiziksel hafızanın% 'si ve işlemi değiştirmek için gerekli olan takas alanı için seçenekler buldum. Bu ve çok daha fazlası ps için man sayfasında belgelenmiştir.


Linux, her bir işlem için hafızada paylaşılan hafızayı hesaplar; bu, bir büyük paylaşımlı hafıza bölümüne bağlı birçok işleminiz varsa sahte toplamlara yol açabilir. top, psve benzer programların hepsi de aynı şekilde etkilenir.
Peter Eisentraut,

Paylaşılan hafızanın nasıl çalıştığını biliyorum, ancak ps bu bilgiyi sağlayamıyor (ya da en azından ps belgelerimde bulamadım). top veya htop aslında işlem başına paylaşılan bellek kullanımını gösterebilir.
Justin Smith

9

@ user26528 kullanıcısının yanıtı belleği doğru bir şekilde hesaplamıyor - eşlemelerin eşleşmelerin toplamına ihtiyacı var, yalnızca en değil. Bu komut dosyası yapmalı:

#!/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

Çıktılar: satır 16: +: sözdizimi hatası: operand beklenen (hata belirteci "+"), şu satırı içeren satır: echo "Özel $ (($ pd + $ pc)) kB", CentOS 7 ile çalışıyorum .
Basil A,

2
@ evsmith neden Pss'e 0.5 ekliyor?
Pete,

1
10.000 küçük Awk komut dosyası çalıştırmak büyük bir antipattern, tüm bunları tek bir Awk komut dosyasında yeniden gözden geçirmelisiniz.
18'de

ama bu betiğin kendisi çok fazla bellek tüketiyor
mehmet riza oz

8

İşlemleri bellek kullanımına göre listele

ps -e -orss =, args = | sıralama -b -k1,1n


ps -e -orss=,pid=,args= | sort -b -k1,1nİşlem kimliğini eklemek için kullanın
Jacob,

pskendi kendine sıralama yapabilirsiniz:ps -eo rss=,args= --sort +rss
phil294


3

İşlemleri mem kullanımına göre listele

komut: ps -e -orss =, args = | sıralama -b -k1,1n | pr -TW $ KOLONLAR \


3

Güncelleştirme:

Aşağıdaki tek astar, mevcut kullanıcı tarafından toplam bellek tüketimi hakkında da bilgi sağlar.

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'deki en yüksek bellek kullanımına göre sıralanan tüm kullanıcı işlemlerini şu şekilde sıraladım:

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

Tam yol işlemini göstermek command=yerine kullanabilirsiniz comm=.

=Sadece sütun başlığını kaldırır.


3

Çoğu zaman aynı işlemin çatal alt işlemi olduğunu ve işlem tarafından kullanılan toplam hafızayla ilgilendiğinizi gördüm. örneğin google chrome birden fazla işlemi başlatır ve toplam hafızayı chrome tarafından bilmek istersiniz. Bir satır komutunun altında çok faydalı buldum

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'de belleği göstermek, belleği sıralamak ve çoğunlukla komutla gruplamak gibi pek çok şeyle ilgilenir. Aynı zamanda% CPU ve% belleği gruplandırıyor. Kullanıcı dostu formatta veri gösteriyor.

Bu komut bu cevaptan ilham aldı ve hangi sürecin kaynaklarımı aldığına dair fikir edinmemde bana çok yardımcı oldu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.