O servidor Linux está ficando sem memória e troca

0

Eu acho que há algum vazamento de memória e a memória não está sendo liberada. Há algumas boas maneiras de descobrir qual processo e por que está vazando memória?

A única solução temporária é reiniciar o servidor. Mas depois de alguns dias o uso da memória cresce e cresce e o servidor fica muito lento e eu tenho que fazer outra reinicialização.

Por exemplo, verificando free -m :

             total       used       free     shared    buffers     cached
Mem:          2005       1989         15          0          2        126
-/+ buffers/cache:       1861        144
Swap:         2004       1494        510

A coisa é que esse uso não muda muito. E esse uso de memória fica congelado ou cresce, mas não menos.

Alguém conhece alguma boa prática para apontar a causa dos vazamentos de memória?

top ordenado pela memória usada mostra isso:

top - 16:58:40 up  6:00,  1 user,  load average: 0.10, 0.08, 0.07
Tasks: 136 total,   1 running, 135 sleeping,   0 stopped,   0 zombie
Cpu(s): 26.2%us,  1.0%sy,  0.0%ni, 72.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   2053476k total,  2036380k used,    17096k free,    39272k buffers
Swap:  2053112k total,    13348k used,  2039764k free,   924372k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
 1529 oerp      20   0  919m 419m 8100 S 19.9 20.9  17:44.49 python             
 1768 postgres  20   0  342m 161m 137m S  0.0  8.1   0:27.28 postgres           
 1775 postgres  20   0  334m 155m 137m S  0.0  7.8   0:14.05 postgres           
 1751 postgres  20   0  333m 152m 138m S  0.0  7.6   0:26.56 postgres           
 1779 postgres  20   0  330m 150m 136m S  0.0  7.5   0:13.73 postgres           
 1758 postgres  20   0  329m 149m 137m S  0.0  7.5   0:19.89 postgres           
 1742 postgres  20   0  330m 149m 137m S  0.0  7.5   0:10.19 postgres           
 1769 postgres  20   0  329m 149m 138m S  0.0  7.4   0:55.47 postgres           
 1760 postgres  20   0  329m 149m 137m S  0.0  7.4   0:16.52 postgres           
 1772 postgres  20   0  328m 148m 136m S  0.0  7.4   0:18.93 postgres           
 1764 postgres  20   0  328m 148m 137m S  0.0  7.4   0:17.72 postgres           
 1759 postgres  20   0  329m 148m 136m S  0.0  7.4   0:21.15 postgres           
 1757 postgres  20   0  330m 148m 136m S  5.6  7.4   0:17.73 postgres           
 1766 postgres  20   0  327m 148m 138m S  0.3  7.4   0:25.07 postgres           
 1762 postgres  20   0  328m 148m 136m S  0.0  7.4   0:17.91 postgres           
 1776 postgres  20   0  329m 147m 137m S  0.0  7.4   0:21.30 postgres           
 1770 postgres  20   0  328m 147m 136m S  0.0  7.4   0:16.01 postgres

É claro que o Python e o PostgreSQL consomem toda a memória, mas como posso identificar a causa de não liberar nenhuma memória (a operação diferente que o Python e o PostgreSQl fazem)?

usando ps aux :

Este processo usa a maior parte da memória:

oerp 1529 4.9 20.9 916984 429332 ? Sl 10:58 17:55 /opt/odoo/venv/bin/python /opt/odoo/odoo/openerp-server --config=/etc/odoo-server.conf --no-database-list

Mas se você combinar todos os processos como este (há muitos deles)

postgres  1742  0.0  7.4 338268 153140 ?       Ss   10:59   0:10 postgres: oerp nodbaltic [local] idle 

Depois, leva a maior parte da memória.

É normal que o postgresql tenha muitos processos ociosos que ocupam uma quantidade tão grande de memória?

cat /proc/meminfo :

MemTotal:        2053476 kB
MemFree:           20312 kB
Buffers:           38944 kB
Cached:           926480 kB
SwapCached:         1196 kB
Active:          1431788 kB
Inactive:         490424 kB
Active(anon):     824712 kB
Inactive(anon):   276456 kB
Active(file):     607076 kB
Inactive(file):   213968 kB
Unevictable:        3884 kB
Mlocked:            3884 kB
SwapTotal:       2053112 kB
SwapFree:        2039340 kB
Dirty:              4144 kB
Writeback:             0 kB
AnonPages:        959108 kB
Mapped:           164144 kB
Shmem:            142332 kB
Slab:              58796 kB
SReclaimable:      38440 kB
SUnreclaim:        20356 kB
KernelStack:        1728 kB
PageTables:        28340 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     3079848 kB
Committed_AS:    2131992 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      281432 kB
VmallocChunk:   34359446164 kB
HardwareCorrupted:     0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       10240 kB
DirectMap2M:     2086912 kB

P.S. Ah, e o servidor está rodando na máquina virtual, se isso faz alguma diferença.

    
por Andrius 25.03.2015 / 10:02

3 respostas

1

O comando top mostrará os processos atualmente em execução junto com seu uso de memória. A coluna RES informa a memória realmente usada por um processo. Pressione Shift + M para ordenar por essa coluna. Pressione o botão Q para sair da tela novamente.

    
por 25.03.2015 / 10:19
0

Existem várias maneiras de descobrir quais processos estão sendo executados e usando a memória.

Top já foi mencionado, mas eu prefiro usar no topo ou htop. Você pode instalá-los a partir do seu repositório (yum install atop ou apt-get install no topo), ele fornece uma visão geral muito melhor e completa de tudo o que está acontecendo em seu servidor. Você pode até configurar em cima para registrar tudo a cada x minutos, o que poderia ajudar a depurar seu problema.

Também é possível verificar o que está sendo executado no momento e usar recursos digitando

ps faux

o comando PS fornece um instantâneo de todos os processos atualmente em execução. Há uma coluna para uso de CPU e MEM.

Além disso, apenas usar free -m para depurar problemas de memória pode ser enganoso. Seria uma boa ideia verificar:

cat /proc/meminfo

Ou use as ferramentas que mencionei como no topo ou no htop, pois elas fornecem uma visão melhor sobre o uso da memória (memória reservada por cache e buffers)

Além disso, publicar os resultados do ps faux ou top / atop / htop nos ajudaria a melhor ajudar seu problema.

    
por 25.03.2015 / 11:02
0

Mova todos os dados da memória para o disco, limpando a memória física:

sudo /bin/syncfree pagecache, dentries and inodes 
sudo bash -c "echo 3 > /proc/sys/vm/drop_caches"

Verifique se há memória física suficiente para armazenar todo o espaço de troca e, em seguida, mova os dados trocados de volta para a RAM disponível, executando os dois comandos a seguir:

$ free -m
total       used       free     shared    buffers     cached
Mem:          2048        884       1163          0          0         42
-/+ buffers/cache:        842       1205
Swap:          996        996          0


sudo /sbin/swapoff -a && sudo /sbin/swapon -a 

isso move os itens trocados para a memória física, desativa & reativa a troca.

    
por 25.03.2015 / 11:21