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

Como posso exibir a utilização da memória de cada processo se fizer um 'ps -ef'?

No Linux, como posso exibir o uso de memória de cada processo se eu fizer um ps -ef? Gostaria de ver a ‘memória virtual’, ‘res memory’, ‘shared memory’ de cada progresso. Posso obter isso via top, mas quero a mesma informação em ps -ef, para que possa canalizar a saída para grep com o meu nome de processo.

Respostas (8)

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

A resposta do @user26528 não calcula bem a memória - precisa da soma dos mapeamentos em smaps, e não apenas do topo. Este guião deve fazê-lo:

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

Não consegui encontrar uma opção para memória partilhada, mas encontrei opções para % da memória física total e a quantidade de espaço swap que seria necessária para trocar o processo. Isto e muito mais está documentado na página de homem para ps.

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

Listar processos por uso de memória

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

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

A obtenção da utilização da memória através do ps é bastante pouco fiável. Se tiver um kernel mais recente deve suportar /proc/pid#/smaps, o que lhe dá alguma informação detalhada sobre a utilização da memória de cada processo. Abaixo está um script bastante sujo e rápido para percorrer cada processo que está aberto e agarrar o tamanho, Rss, Pss e Shared Clean/Dirty usage. Esperemos que possa ser útil de alguma forma.

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

pode usar

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

Actualização:

A seguinte linha também fornece informação sobre o consumo total de memória pelo utilizador actual.

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

Acabei de listar todos os processos do utilizador ordenados pelo maior consumo de memória em MB como este:

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

Pode usar command= em vez de comm= para mostrar o processo do caminho completo.

O = apenas remove o título da coluna.

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

Descobri que muitas vezes o mesmo processo tem sub-processo de garfo e está interessado na memória total usada pelo processo. por exemplo, o google chrome inicia múltiplos processos e deseja saber a memória total tomada pelo cromo. Encontrei abaixo de um comando de linha muito útil

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
``` 0x1& 

Cuida de muitas coisas, como mostrar memória em MB, ordenar na memória e principalmente agrupar por comando. Agrupa também %CPU e %memória. Mostra os dados em formato de fácil utilização. 

Este comando foi inspirado em [ isto ](https://stackoverflow.com/questions/6345778/group-processes-with-ps) responder e ajudou-me muito a ter uma ideia sobre qual o processo que está a ocupar os meus recursos.
3
3
3
2014-12-05 07:40:22 +0000

Lista processos por uso de mem

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