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


24

No Linux, como posso exibir o uso de memória de cada processo se fizer um ps -ef? Gostaria de ver a 'memória virtual', 'res memory', 'shared memory' de cada progresso. Posso obtê-lo via top, mas quero as mesmas informações ps -efpara poder canalizar a saída grepcom meu nome de processo.

Respostas:


8

Obter o uso da memória através do ps não é confiável. Se você possui um kernel mais recente, ele deve suportar / proc / pid # / smaps, o que fornece 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 pegar o tamanho, rss, pss e uso compartilhado de limpeza / sujeira. 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

1
Você deve somar a coluna Tamanho. Veja a resposta de ezsmith abaixo.
Basil A

11

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

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


As contas do Linux compartilham memória na memória para cada processo, o que pode levar a somas falsas se você tiver muitos processos conectados a um segmento de memória compartilhada muito grande. top, psE programas similares são todos afetados por este da mesma forma.
Peter Eisentraut

Eu sei como a memória compartilhada funciona, mas parece que o ps não pode fornecer essas informações (ou pelo menos não consegui encontrá-las na documentação do ps). top ou htop, na verdade, podem mostrar o uso de memória compartilhada por processo.
Justin Smith

9

A resposta do @ user26528 não calcula a memória corretamente - você precisa da soma dos mapeamentos nos smaps, não apenas do 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

Saídas: linha 16: +: erro de sintaxe: operando esperado (o token de erro é "+"), que é a linha que contém: echo "Private $ (($ pd + $ pc)) kB", estou executando no CentOS 7 .
Basil a

2
@evsmith Por que adicionar 0,5 aos Pss?
Pete

1
A execução de 10.000 pequenos scripts do Awk é um antipadrão massivo; você deve refatorar tudo isso em um único script do Awk.
tripleee

mas esse script em si consome muita memória
mehmet riza oz

8

Listar processos por uso de memória

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


Use ps -e -orss=,pid=,args= | sort -b -k1,1npara incluir o ID do processo
Jacob

pspode classificar por conta própria:ps -eo rss=,args= --sort +rss
phil294 25/06


3

Listar processos por uso de mem

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


3

Atualizar:

A seguinte linha única 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, como este:

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

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

O =apenas remove o título da coluna.


3

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

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

Esse comando foi inspirado nesta resposta e me ajudou muito a ter uma ideia de qual processo está consumindo meus recursos.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.