Linux: qual processo consumiu toda a memória?

3

Temos 4GB em nosso servidor linux, mas atualmente podemos usar apenas ~ 1.8GB para o nosso servidor java, que é o primeiro processo java listado abaixo. (200 MB são gratuitos para que possamos usar o máximo de 1,6 GB + 0,2 GB)

A máquina trava quando estamos usando mais. Então nós especificamos -Xmx1600m e -XX: MaxPermSize = 200m para limitar a RAM do servidor para 1.8GB. Mas precisamos de mais RAM! Onde está a memória RAM restante?

Aqui está a saída do programa de topo classificada em relação ao uso da memória (via big 'M'):

Mem:   4083952k total,  3857856k used,   226096k free,   169320k buffers
Swap:  2104504k total,      176k used,  2104328k free,  1939080k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                           
28155 root      16   0 1835m 1.6g 7848 S    2 40.5  47:36.26 java                                                                                              
19609 root      16   0 45996 7052 3148 S    0  0.2  14:35.97 httpd2-prefork                                                                                    
 6802 root      16   0 46132 5916 1932 S    0  0.1   0:00.09 httpd2-prefork                                                                                    
 6866 root      15   0 46132 5916 1932 S    0  0.1   0:00.07 httpd2-prefork    

Como você pode ver, existem muitos (e ainda mais) processos httpd2-prefork. Mas mesmo se eu acumular os bytes (25 * ~ 46KB = ~ 1MB), ele nunca ficará tão grande.

free -m impressões:

             total       used       free     shared    buffers     cached
Mem:          3988       3768        219          0        165       1894
-/+ buffers/cache:       1708       2279
Swap:         2055          0       2055

Onde está o meu erro? Posso ajustar o servidor para dar mais RAM ao processo java?

BTW: não estamos usando uma máquina virtual como aqui

Atualizar

Como foi apontado nos comentários: é apenas um kernel de 32 bits :-( (através do uname -a). Então eu posso usar apenas 3GB pelo menos? Mas o servidor em si parece ser de 64 bits? Por causa do lm (modo longo) na saída?

grep flags /proc/cpuinfo
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe lm constant_tsc pni monitor ds_cpl cid cx16 xtpr
...

Aqui é outra questão muito semelhante.

    
por Karussell 30.07.2010 / 01:15

3 respostas

10

Ah, vejo que você confundiu como calcular a RAM livre no Linux.

O Linux tende a utilizar strongmente toda a RAM armazenando coisas em cache. Em vez de ler a listagem de diretórios do disco toda vez, ele armazena em cache as entradas de diretório na RAM. Ele armazena em cache os arquivos usados com freqüência, para que eles não precisem ser carregados do disco toda vez. No caso de algum processo realmente precisar da RAM para seu uso, o cache será imediatamente removido.

Portanto, a fórmula para calcular a RAM usada é total - (livre + buffers + em cache) , no seu caso 3988 - (219 + 165 + 1894) ou em outras palavras, 3988 - 2278 . Isso é 1710 megabytes de RAM em uso e 2278 megabytes de RAM para você ainda consumir.

Não acredite em mim? Veja, o seu servidor nem sequer tem swap em uso. :)

Mas, é claro, uma falha na máquina - se você quer dizer um bloqueio strong - é uma coisa estranha. Isso realmente não deveria acontecer. Eu suspeito de um stick RAM defeituoso que só é acessado em caso de 2 GB de RAM em uso.

    
por 30.07.2010 / 09:55
2

Eu só vejo opções de cpu mais antigas, então eu suspeito que você tenha apenas uma cpu de 32 bits, mas você deve ser capaz de usar todos os 4GB, embora você precise investigar como fazer isso funcionar da maneira que você quiser ativar o PAE, por exemplo).

Você quer dizer que o aplicativo java trava ou a máquina inteira? A máquina não deve falhar (embora possa deixar de responder por um tempo).

    
por 30.07.2010 / 21:11
1

Apenas uma nota - há um erro na matemática.

(25* ~46KB = ~1MB) deve ser lido como (25* ~46000KB = ~1150MB) .

O tamanho do recurso é mais importante, já que fornece uma leitura de memória mais realista por processo.

(25*~5000KB = ~125MB)

    
por 01.08.2010 / 06:29