Linux: descubra qual processo está usando toda a RAM?


127

Antes de realmente perguntar, só para esclarecer: sim, eu sei sobre cache de disco e não, não é o meu caso :) Desculpe, por este preâmbulo :)

Estou usando o CentOS 5. Todos os aplicativos do sistema estão trocando bastante, e o sistema está muito lento. Quando eu faço free -m, aqui está o que eu tenho:

             total       used       free     shared    buffers     cached
Mem:          3952       3929         22          0          1         18
-/+ buffers/cache:       3909         42
Swap:        16383         46      16337

Então, eu tenho apenas 42 Mb para usar! Tanto quanto eu entendo, -/+ buffers/cachena verdade não conta o cache do disco, então eu só tenho 42 Mb, certo? Eu pensei que poderia estar errado, então tentei desligar o cache do disco e não teve efeito - a imagem permaneceu a mesma.

Então, decidi descobrir quem está usando toda a minha RAM e usei toppara isso. Mas, aparentemente, ele relata que nenhum processo está usando minha RAM. O único processo no meu topo é o MySQL, mas ele está usando 0,1% de RAM e 400Mb de swap. A mesma imagem quando tento executar outros serviços ou aplicativos - todos trocados, topmostra que o MEM não é usado (máximo de 0,1% para qualquer processo).

top - 15:09:00 up  2:09,  2 users,  load average: 0.02, 0.16, 0.11
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4046868k total,  4001368k used,    45500k free,      748k buffers
Swap: 16777208k total,    68840k used, 16708368k free,    16632k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
 3214 ntp       15   0 23412 5044 3916 S  0.0  0.1   0:00.00  17m ntpd
 2319 root       5 -10 12648 4460 3184 S  0.0  0.1   0:00.00 8188 iscsid
 2168 root      RT   0 22120 3692 2848 S  0.0  0.1   0:00.00  17m multipathd
 5113 mysql     18   0  474m 2356  856 S  0.0  0.1   0:00.11 472m mysqld
 4106 root      34  19  251m 1944 1360 S  0.0  0.0   0:00.11 249m yum-updatesd
 4109 root      15   0 90152 1904 1772 S  0.0  0.0   0:00.18  86m sshd
 5175 root      15   0 90156 1896 1772 S  0.0  0.0   0:00.02  86m sshd

Reiniciar não ajuda, e, a propósito, é muito lento, o que eu normalmente não esperaria nesta máquina (4 núcleos, 4Gb RAM, RAID1).

Então, com isso - tenho certeza de que esse não é um cache de disco, que está usando a RAM, porque normalmente deveria ter sido reduzido e deixado que outros processos usassem a RAM, em vez de trocar.

Então, finalmente, a questão é: se alguém tem alguma idéia de como descobrir qual processo está realmente usando a memória com tanta força?


1
Você já encontrou a resposta para isso?
Hacker

@Hackeron: OP aceitou esta resposta . Eu sei que a resposta não aborda sua pergunta , no entanto. Consegui reproduzir seu problema em um dos meus servidores e atualmente estou pesquisando se existe uma maneira de solucioná-lo.
Deltik

@Deltik Ah, ok. Obrigado :) - Eu tenho 2 servidores aqui que vazam toda a memória disponível no espaço de cerca de 12 horas, deixe-me saber se há algo que eu possa fazer para ajudar a diagnosticar isso. Estou acessível como o apelido "hackeron" no IRC (irc.freenode.org).
Hackeron

@Hackeron: Não consegui encontrar você como "hackeron" irc.freenode.org. Eu criei uma sala de bate - papo para uma discussão prolongada aqui .
Deltik 23/08/2015

Vale ressaltar que o cache ARC na memória do ZFS (e / ou L2ARC) não aparece free -m, mas o tamanho dele pode ser consultado no Linux cat /proc/spl/kstat/zfs/arcstats | grep data_size.
kqr 19/02

Respostas:


112

No Linux, no topprocesso, você pode pressionar a <tecla para mudar a classificação da exibição de saída para a esquerda. Por padrão, ela é ordenada pelo %CPUmodo; se você pressionar a tecla 4 vezes, será classificada de acordo com VIRTo tamanho da memória virtual, fornecendo sua resposta.

Outra maneira de fazer isso é:

ps -e -o pid,vsz,comm= | sort -n -k 2

deve fornecer a você e a saída classificadas por tamanho virtual dos processos.

Aqui está a versão longa:

ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2

Isso me dá Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.htmlno servidor Ubuntu 11.10.
Der Hochstapler

1
@OliverSalzburg A questão é -oopções. RHEL4 isso funciona. RHEL5: ps -e -o pid,vsz,comm= | sort -n -k 2funciona. Tentarei 11h10 mais tarde esta noite, mas se você encontrar as opções de classificação corretas antes, informe-me. ps -e -o pid,vsz,comm | sort -n -k 2pode funcionar, mas não tenho um local para verificar no momento.
19412 Karlson

2
Não estou realmente familiarizado com a -efopção. Mas isso parece produzir uma saída razoável:sudo ps axo pid,vsz,comm=|sort -n -k 2
Der Hochstapler

1
Ty, eu gosto da sugestão superior do <eu não sabia que era possível, fedora
SSH Este

2
Versão ligeiramente modificada para obter os processos que ocupam a RAM e mostra o comando completo:ps -e --format=pid,rss,args | sort --numeric-sort --key=2
sengs

71

Mostre a memória dos processos em megabytes e o caminho do processo.

ps aux  | awk '{print $6/1024 " MB\t\t" $11}'  | sort -n

8
Bem-vindo ao superusuário. Você pode expandir sua resposta para explicar o que esse código faz e como ele resolve o problema? Código inexplicável é desencorajado , porque não ensina a solução. Obrigado.
Fixer1234

9
Estou surpreso que esta resposta tenha voto negativo e tenha um comentário pedindo para explicá-la .. é curto o suficiente para que fique claro o que faz (coloca ps aux em awk e depois classifica) e, no contexto da pergunta, mostra quais processos estão usando mais RAM. Eu acho que é uma boa resposta.
João

14

Apenas uma nota lateral em um servidor mostrando os mesmos sintomas, mas ainda mostrando a exaustão da memória. O que acabou localizando foi um sysctl.conf de uma caixa com 32 GB de RAM e configuração para um banco de dados com páginas enormes configuradas para 12000. Esta caixa possui apenas 2 GB de RAM, portanto, estava atribuindo toda a RAM livre às páginas grandes (apenas 960 deles). Definir páginas enormes para 10, como nenhuma delas foi usada, liberou toda a memória.

Uma verificação rápida de / proc / meminfo para procurar as configurações de HugePages_ pode ser um bom começo para solucionar problemas de pelo menos um problema de memória inesperado.


2
Recentemente, tive outro servidor em que esse era o problema. Se sua organização possui ex-funcionários da Oracle, essa configuração pode ser sua culpada.
fields

5

No meu caso, o problema era que o servidor era um servidor virtual VMware com o vmw_balloonmódulo ativado:

$ lsmod | grep vmw_balloon
vmw_balloon            20480  0
vmw_vmci               65536  2 vmw_vsock_vmci_transport,vmw_balloon

Corrida:

$ vmware-toolbox-cmd stat balloon
5189 MB

Portanto, cerca de 5 GB de memória foram recuperados pelo host. Portanto, apesar de ter 8 GB para minha VM "oficialmente", na prática era muito menos:

$ free
              total        used        free      shared  buff/cache   available
Mem:        8174716     5609592       53200       27480     2511924     2458432
Swap:       8386556        6740     8379816

2

Você também pode usar o comando ps para obter mais informações sobre o processo.

ps aux | less

Por curiosidade, qual é a maneira correta de escapar desse comando? Mostra END e chego à última linha, não mata o processo quando pressiono Ctrl + C.
KingsInnerSoul

1
@KingsInnerSoul pressione 'q'
enobayram 16/11/2015

2

Eu faço referência a isso e memória total usada pelo processo Python? - Stack Overflow , essa é a minha resposta. Agora, recebo uma ferramenta específica de contagem de processos (python).

# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB

# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB

Anexe minha lista de processos.

$ ps aux  | grep python
root       943  0.0  0.1  53252  9524 ?        Ss   Aug19  52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root       950  0.6  0.4 299680 34220 ?        Sl   Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root      3803  0.2  0.4 315692 36576 ?        S    12:43   0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny    23325  0.0  0.1  47460  9076 pts/0    S+   17:40   0:00 python
jonny    24651  0.0  0.0  13076   924 pts/4    S+   18:06   0:00 grep python

Referência


1

Faça um script chamado show-memory-usage.shcom conteúdo:

#!/bin/sh
ps -eo rss,pid,user,command | sort -rn | head -10 | awk '{ hr[1024**2]="GB"; hr[1024]="MB";
 for (x=1024**3; x>=1024; x/=1024) {
 if ($1>=x) { printf ("%-6.2f %s ", $1/x, hr[x]); break }
 } } { printf ("%-6s %-10s ", $2, $3) }
 { for ( x=4 ; x<=NF ; x++ ) { printf ("%s ",$x) } print ("\n") }
 '

6
Por quê? O que isso faz? Como funciona? Não diga às pessoas para executar código aleatório; explique seu propósito e como ele funciona.
um CVn

2
Figura Vou explicar o código para aqueles que não entendem como parece seguro executar, mas o voto negativo pode afastar aqueles para os quais seria útil. Ele está executando o mesmo comando das respostas acima , mas está adicionando formatação com o AWK. Eu pessoalmente não executei o script porque não tenho utilidade para ele, mas explicá-lo ajuda os que precisam de alguma formatação.
Dooley_labs

1
Eu li o código e o executei. Alinha os campos como uma tabela e formata a memória residente consumida com prefixos (como 1,12 GB, 582,79 MB).
Stéphane Gourichon 26/03

0

Isso também pega a identificação do processo, classifica por MB usado e descreve o comando (que criou o processo):

ps aux | awk '{print $6/1024 " MB\t\t" $2 "\t" $11}' | sort -n


0

Meu servidor ubuntu DISTRIB RELEASE = 18.04 no Hyper-V tinha a maior parte da memória usada, mas todos os processos estavam corretos. (Admiti que removi pacotes snapd e upattended-upgr, mas 95% da memória ainda era usada.)

A resposta é que o Hyper-V possui memória dinâmica; portanto, foi preciso memória para o uso do sistema principal e o ubuntu sinalizou-a como usada.

Espero que ajude alguém.

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.