2010-01-29 04:03:01 +0000 2010-01-29 04:03:01 +0000
26
26

Hoe kan ik het geheugengebruik van elk proces laten zien als ik een 'ps -ef' doe?

Hoe kan ik in Linux het geheugengebruik van elk proces weergeven als ik een ps -ef doe? Ik zou graag het ‘virtueel geheugen’, ‘res geheugen’, ‘gedeeld geheugen’ van elke voortgang willen zien. Ik kan dat krijgen via top, maar ik wil dezelfde info in ps -ef zodat ik de uitvoer kan pijpen naar grep met mijn procesnaam.

Antwoorden (8)

11
11
11
2015-03-11 13:16:28 +0000

Het antwoord van @user26528 berekent het geheugen niet helemaal correct - je hebt de som van de mappings in smaps nodig, niet alleen de bovenste. Dit script zou het moeten doen:

#!/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
11
11
11
2010-01-29 07:09:40 +0000

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

Ik kon geen optie vinden voor gedeeld geheugen, maar wel voor % van het totale fysieke geheugen en de hoeveelheid swapspace die nodig zou zijn om het proces uit te swappen. Dit en nog veel meer is gedocumenteerd in de man page voor ps.

8
8
8
2012-02-04 10:26:12 +0000

Lijst van processen op geheugengebruik

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

7
7
7
2010-01-29 11:20:18 +0000

Het verkrijgen van geheugengebruik via ps is behoorlijk onbetrouwbaar. Als je een nieuwere kernel hebt, zou deze /proc/pid#/smaps moeten ondersteunen, wat je wat gedetailleerde informatie geeft over het geheugengebruik van elk proces. Hieronder staat een vrij smerig en snel script om door elk proces te lopen dat open is en de Grootte, Rss, Pss en Gedeeld Schoon/vuil gebruik te verzamelen. Hopelijk kan het op een of andere manier nuttig zijn.

#!/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
4
4
4
2010-01-29 04:20:47 +0000

je kunt

top -n 1
``` gebruiken
3
3
3
2016-09-23 15:51:44 +0000

Update:

De volgende one-liner geeft ook informatie over het totale geheugengebruik door de huidige gebruiker.

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

Ik heb zojuist alle gebruikersprocessen op een rijtje gezet, gesorteerd op het hoogste geheugengebruik in MB, en wel als volgt:

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

Je kunt command= gebruiken in plaats van comm= om het volledige pad-proces te laten zien.

De = verwijdert alleen de kolomtitel.

3
3
3
2017-04-04 12:27:34 +0000

Ik vond dat vaak hetzelfde proces heeft vork sub-proces en u geïnteresseerd bent in het totale geheugen gebruikt door het proces. bv. google chrome start meerdere processen en u wilt weten het totale geheugen genomen door chrome. Ik vond onderstaande één regel commando erg handig

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

Het zorgt voor veel dingen, zoals het tonen van geheugen in MB, sorteren op geheugen en vooral groeperen op commando. Het groepeert ook %CPU en %geheugen. Het toont gegevens in een gebruikersvriendelijk formaat.

Dit commando is geïnspireerd op dit antwoord en het heeft me erg geholpen om een idee te krijgen van welk proces mijn bronnen in beslag neemt.

3
3
3
2014-12-05 07:40:22 +0000

Lijst van processen op geheugengebruik

commando : ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS