Como posso exibir o uso de memória de cada processo se eu fizer um 'ps -ef'?

20

No Linux, como posso exibir o uso de memória de cada processo se eu fizer um ps -ef ? Eu gostaria de ver a 'memória virtual', 'res memory', 'shared memory' de cada progresso. Eu posso conseguir isso via top , mas eu quero as mesmas informações em ps -ef para que eu possa canalizar a saída para grep com o nome do meu processo.

    
por hap497 29.01.2010 / 05:03

8 respostas

8

Obtenção de uso de memória por meio do ps não é confiável. Se você tem um kernel mais novo, ele deve suportar / proc / pid # / smaps, o que fornece algumas informações detalhadas sobre o uso de memória de cada processo. Abaixo está um script bastante sujo e rápido para percorrer cada processo que está aberto e pegue o tamanho, Rss, Pss e uso compartilhado limpo / sujo. Espero 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
    
por 29.01.2010 / 12:20
10

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

Não consegui encontrar uma opção para a memória compartilhada, mas encontrei opções para% da memória física total e a quantidade de espaço de troca que seria necessária para trocar o processo. Isso e muito mais está documentado na man page para ps.

    
por 29.01.2010 / 08:09
8

Listar processos por uso de memória

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

    
por 04.02.2012 / 11:26
8

@ resposta do user26528 não calcula bem a memória corretamente - você precisa da soma dos mapeamentos em smaps, não apenas no topo. Este script deve fazer isso:

#!/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
    
por 11.03.2015 / 14:16
4

você pode usar

top -n 1
    
por 29.01.2010 / 05:20
3

Listar processos por uso de memes

Comando

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

    
por 05.12.2014 / 08:40
3

Atualização:

O seguinte one-liner também fornece informações sobre o consumo total de memória pelo usuário atual.

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 usuário classificados pelo maior uso de memória em MB assim:

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

Você pode usar command= em vez de comm= para mostrar o processo completo do caminho.

O = apenas remove o título da coluna.

    
por 23.09.2016 / 17:51
3

Descobri que muitas vezes o mesmo processo tem o sub-processo fork e você está interessado na memória total usada pelo processo. por exemplo. O google chrome inicia vários processos e você deseja saber a memória total obtida pelo chrome. Eu encontrei abaixo 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

Ele cuida de muitas coisas, como mostrar memória em MB, ordenar a memória e principalmente agrupar por comando. Também está agrupando% CPU e% de memória. Está mostrando dados em formato amigável.

Este comando foi inspirado em esta resposta e ajudou-me muito a ter ideia de qual processo está ocupando meus recursos.

    
por 04.04.2017 / 14:27

Tags