Como ver os principais processos classificados pelo uso real da memória?


240

Eu tenho um servidor com 12G de memória. Um fragmento da parte superior é mostrado abaixo:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                                                                                                      
12979 frank  20   0  206m  21m  12m S   11  0.2  26667:24 krfb                                                                                                                                                                                                                                                          
13 root      15  -5     0    0    0 S    1  0.0  36:25.04 ksoftirqd/3                                                                                                                                                                                                                                                   
59 root      15  -5     0    0    0 S    0  0.0   4:53.00 ata/2                                                                                                                                                                                                                                                         
2155 root      20   0  662m  37m 8364 S    0  0.3 338:10.25 Xorg                                                                                                                                                                                                                                                          
4560 frank  20   0  8672 1300  852 R    0  0.0   0:00.03 top                                                                                                                                                                                                                                                           
12981 frank  20   0  987m  27m  15m S    0  0.2  45:10.82 amarok                                                                                                                                                                                                                                                        
24908 frank  20   0 16648  708  548 S    0  0.0   2:08.84 wrapper                                                                                                                                                                                                                                                       
1 root      20   0  8072  608  572 S    0  0.0   0:47.36 init                                                                                                                                                                                                                                                          
2 root      15  -5     0    0    0 S    0  0.0   0:00.00 kthreadd

O free -mmostra o seguinte:

             total       used       free     shared    buffers     cached
Mem:         12038      11676        362          0        599       9745
-/+ buffers/cache:       1331      10706
Swap:         2204        257       1946

Se bem entendi, o sistema possui apenas 362 MB de memória disponível. Minha pergunta é: como descobrir qual processo está consumindo a maior parte da memória?

Assim como informações de segundo plano, o sistema está em execução 64bit OpenSuse 12.


Respostas:


280

Primeiro, repita esse mantra por um tempo: "memória não utilizada é memória desperdiçada". O kernel do Linux mantém enormes quantidades de metadados e arquivos solicitados, até que algo que pareça mais importante elimine esses dados. É por isso que você pode executar:

find /home -type f -name '*.mp3'
find /home -type f -name '*.aac'

e fazer com que a segunda findinstância corra a uma velocidade ridícula.

O Linux deixa apenas um pouco de memória "livre" para lidar com picos no uso da memória sem muito esforço.

Segundo, você deseja encontrar os processos que estão consumindo toda a sua memória; no topuso do Mcomando para ordenar por uso de memória. Sinta-se à vontade para ignorar a VIRTcoluna, que apenas informa a quantidade de memória virtual que foi alocada, e não a quantidade de memória que o processo está usando. RESrelata quanta memória está residente ou atualmente em ram (em vez de trocada para disco ou nunca realmente alocada em primeiro lugar, apesar de ser solicitada).

Mas, como REScontará, por exemplo, /lib/libc.so.6memória uma vez para quase todos os processos, não é exatamente uma medida impressionante da quantidade de memória que um processo está usando. A SHRcoluna relata quanta memória é compartilhada com outros processos, mas não há garantia de que outro processo esteja realmente compartilhando - pode ser compartilhável, mas ninguém mais deseja compartilhar.

A smemferramenta foi projetada para ajudar os usuários a avaliar melhor quanta memória deve realmente ser atribuída a cada processo individual. Faz algum trabalho inteligente para descobrir o que é realmente único, o que é compartilhado e calcula proporcionalmente a memória compartilhada com os processos que a compartilham. smempode ajudar você a entender onde sua memória está indo melhor do que a topvontade, mas topé uma excelente primeira ferramenta.


Portanto, se apenas a estatística da coluna "livre" cair, o topo não mostra mais nada diferente, podemos concluir que a memória é alocada pelo kernel do linux para armazenar itens de arquivo e fornecerá a memória para outros processos quando necessário.
Al2O3

@ Rubby, isso provavelmente é verdade; os arquivos /proc/meminfoe /proc/slabinfodetalham para que o kernel está usando o armazenamento - o slabtopprograma é muito parecido top, mas mostra para quais alocadores de laje alocaram quanto, quais são suas proporções etc.
sarnold

Obrigado pela dica sobre 'smem' - quero que o Linux "desperdice" um pouco de RAM para que minha máquina possa funcionar rapidamente. Se 'find' demorar um pouco mais no segundo passe, tudo bem. Um mouse travado e janelas congeladas, enquanto o Linux decide qual RAM (que foi desnecessariamente desnecessária), precisa ser limpa e realocada para o que estou fazendo AGORA - ou mesmo troca para o disco - não é uma opção. Eu tenho 16 GB de RAM nesta caixa e espero que vários GB sejam mantidos livres e disponíveis para aplicativos em execução.
JosephK

@ JosephphK, mover um mouse tem mais a ver com agendamento de prioridades e algoritmos; se forem necessárias alocações de memória para mover o ponteiro do mouse, algo está errado com o software que você está usando. :)
sarnold

2
@JosephK Na verdade, o kernel leva menos tempo para redirecionar a memória de um uso para outro do que para colocar memória livre em uso. Um exige acessar e modificar a lista gratuita, o outro não. Infelizmente, essa é uma pergunta XY. O problema está relacionado ao desempenho e pode não estar totalmente relacionado ao consumo de memória (apesar da evidência de que liberar mais memória o ajuda, isso pode ser por razões mais complexas do que o OP suspeita), mas eles perguntaram sobre a análise do uso da memória. Isso obtém respostas menos úteis do que perguntar sobre o problema real.
David Schwartz

321

use dica rápida usando o comando top no linux / unix

$ top

e depois pressione Shift+ m(ou seja, escreva uma capital M).

De man top

SORTING of task window
  For compatibility, this top supports most of the former top sort keys.
  Since this is primarily a service to former top users, these commands do
  not appear on any help screen.
    command   sorted-field                  supported
      A         start time (non-display)      No
      M         %MEM                          Yes
      N         PID                           Yes
      P         %CPU                          Yes
      T         TIME+                         Yes

Ou, alternativamente: pressione Shift+ f, depois escolha a tela para ordenar pelo uso da memória, pressionando a tecla ne pressione Enter. Você verá o processo ativo ordenado pelo uso da memória


71
Ou você pode simplesmente pressionar M( Shift+ m)
Patryk

8
@risnandar há uma maneira de mostrar a memória em MB e não%
codecowboy

2
oi codecowboy, talvez você pode olhar para commandlinefu.com/commands/view/3/... para a memória mais detalhada usado no meu servidor eu estou usando aplicativos de terceiros, como newrelic.com
risnandar

6
ou apenas top -o mem -O cpu
skipy

No Ubuntu 16, eu precisava do top -o RES"nome do campo não reconhecido 'mem'"
#

37
ps aux | awk '{print $2, $4, $11}' | sort -k2rn | head -n 10

(Adicionando sinalizador numérico -n ao comando de classificação.)


3
Considere também o ps aux --sort '%mem'que foi explicado na minha resposta
Ciro Santilli

28

Primeiro você deve ler uma explicação sobre a saída defree . Conclusão: você tem pelo menos 10,7 GB de memória prontamente utilizável pelos processos.

Então você deve definir o que é "uso de memória" para um processo (não é fácil ou inequívoco, acredite em mim).

Talvez possamos ajudar mais :-)


De onde você conseguiu 10,7? De buffers / cache [grátis]? Obrigado pelo link, vou ler.
user3111525

3
Sim. O ponto é que a maior parte da memória é usada por buffers e cache. Essa memória pode ser "descartada" imediatamente se algum processo precisar de mais memória. Quando você subtrai a quantidade de memória usada para buffers / cache da quantidade USED ou a adiciona à quantidade FREE, obtém os números na segunda linha, que indica que apenas 1,3 gig é realmente usado ou, visto da outra linha. ângulo, você tem 10,7 gig de memória prontamente disponível (uma vez que buffers e cache podem ser despejados instantaneamente).
22413 stolsvik


17

ps aux --sort '%mem'

ps do procps (padrão no Ubuntu 12.04) gera saída como:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
...
tomcat7   3658  0.1  3.3 1782792 124692 ?      Sl   10:12   0:25 /usr/lib/jvm/java-7-oracle/bin/java -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -D
root      1284  1.5  3.7 452692 142796 tty7    Ssl+ 10:11   3:19 /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
ciro      2286  0.3  3.8 1316000 143312 ?      Sl   10:11   0:49 compiz
ciro      5150  0.0  4.4 660620 168488 pts/0   Sl+  11:01   0:08 unicorn_rails worker[1] -p 3000 -E development -c config/unicorn.rb             
ciro      5147  0.0  4.5 660556 170920 pts/0   Sl+  11:01   0:08 unicorn_rails worker[0] -p 3000 -E development -c config/unicorn.rb             
ciro      5142  0.1  6.3 2581944 239408 pts/0  Sl+  11:01   0:17 sidekiq 2.17.8 gitlab [0 of 25 busy]                                                                          
ciro      2386  3.6 16.0 1752740 605372 ?      Sl   10:11   7:38 /usr/lib/firefox/firefox

Então, aqui o Firefox é o principal consumidor com 16% da minha memória.

Você também pode estar interessado em:

ps aux --sort '%cpu'

4

você pode especificar em qual coluna classificar, com as seguintes etapas:

passos:
* topo
* shift + F
* selecione uma coluna da lista
    por exemplo, n significa classificar por memória,
* pressione Enter
* Está bem

1
Duplicado da resposta de risnandar acima.
benjaoming

3

Você pode ver o uso da memória executando este código no seu terminal:

$ watch -n2 free -m
$ htop

3

Como totalizar a memória usada pelo nome do processo:

Às vezes, mesmo observando os maiores processos isolados, ainda há muita memória usada inexplicada. Para verificar se existem muitos dos mesmos processos menores usando a memória, você pode usar um comando como o seguinte, que usa o awk para resumir a memória total usada por processos com o mesmo nome:

ps -e -orss=,args= |awk '{print $1 " " $2 }'| awk '{tot[$2]+=$1;count[$2]++} END {for (i in tot) {print tot[i],i,count[i]}}' | sort -n

por exemplo, saída

9344 docker 1
9948 nginx: 4
22500 /usr/sbin/NetworkManager 1
24704 sleep 69
26436 /usr/sbin/sshd 15
34828 -bash 19
39268 sshd: 10
58384 /bin/su 28
59876 /bin/ksh 29
73408 /usr/bin/python 2
78176 /usr/bin/dockerd 1
134396 /bin/sh 84
5407132 bin/naughty_small_proc 1432
28061916 /usr/local/jdk/bin/java 7

0

Este mesmo segundo no tempo

ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4

Atualizando continuamente

watch -n 1 'ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4'

Também adicionei algumas guloseimas aqui que você pode apreciar (ou ignorar)

-n 1 assistir e atualizar a cada segundo

-U $(whoami)Para mostrar apenas seus processos. $ (algum comando) avalia agora

| head -n4 Para mostrar apenas o cabeçalho e três processos por vez, geralmente, você só precisa de itens de linha de alto uso

${1-4}diz meu primeiro argumento, $1eu quero usar como padrão 4, a menos que eu forneça

Se você estiver usando um mac, talvez seja necessário instalar o watch primeiro

brew install watch 

Como alternativa, você pode usar uma função

psm(){
    watch -n 1 "ps -eom pid,pmem,pcpu,comm | head -n ${1-4}"
    # EXAMPLES: 
    # psm 
    # psm 10
}

E você pode facilmente classificar por CPU, se mudar -mpara-r
jasonleonhard

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.