O PostgreSQL não inicia porque “Não é possível alocar memória”

4

Estou executando o PostgreSQL 8.4.5 no Ubuntu 10.04. Eu executo uma instância do EC2 com alguns sites em execução no nginx. A maioria desses sites é executada no Django e se conecta a essa instância do Postgres.

Por alguma razão, às 8:45 da noite, o Postgres caiu. Eu entrei na máquina e vejo esta mensagem de erro:

 * Starting PostgreSQL 8.4 database server
 * The PostgreSQL server failed to start. Please check the log output:
2011-04-17 04:46:49 UTC FATAL:  could not create shared memory segment: Cannot allocate memory
2011-04-17 04:46:49 UTC DETAIL:  Failed system call was shmget(key=5432001, size=16211968, 03600).
2011-04-17 04:46:49 UTC HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory or swap space. To reduce the request size (currently 16211968 bytes), reduce PostgreSQL's shared_buffers parameter (currently 1792) and/or its max_connections parameter (currently 53).
        The PostgreSQL documentation contains more information about shared memory configuration.
   ...fail!

A primeira coisa que fiz foi alterar a alocação de memória compartilhada do Linux.

sysctl -w kernel.shmmax=367108864>
sysctl -p /etc/sysctl.conf

Isso não foi feito. Então eu editei /etc/postgresql/8.4/main/postgresql.conf e diminuí o valor de max_connections . Isso funcionou ... por cerca de 10 minutos.

Agora estou recebendo o mesmo erro, não importa o quanto max_connections seja baixo. Eu preciso configurá-lo para pelo menos 9 (já que esse é o número de projetos Django que precisam de acesso a este servidor Postgres).

Alguma idéia de como eu poderia consertar isso?

    
por Dan Loewenherz 17.04.2011 / 06:53

3 respostas

4

Você pode usar o comando 'ipcs' para listar todos os segmentos do SHM. Se um programa falhar sem excluí-los, eles podem estar consumindo memória; você pode removê-los manualmente com o comando 'ipcrm'.

    
por 17.04.2011 / 12:10
1

Alguns googling indicam que você deve reduzir os números de shared_buffers e max_connections. você já fez alguma coisa com shared_buffers?

Você já revisou a documentação da memória compartilhada postgresql ? Muitos detalhes sobre como ajustar os parâmetros de memória compartilhada em uma máquina linux.

    
por 17.04.2011 / 08:30
1

Você pode mostrar mais log de cluster detalhado? O postmaster está travando arbitrariamente? Qual código ele retorna ao sistema operacional? Quantos clusters do PostgreSQL você tem, apenas 8,4 / main?

E o seu kernel.shmall e o kernel.shmmni? Tente usar ipcs -ml, ipcs -m e verifique seu uso de memória (livre, superior, System Monitor). Tente acalmar o assassino da OOM:

vm.overcommit_memory = 2
vm.overcommit_ratio = 50

AFAIK sysctl -w não altera os parâmetros permanentemente (somente até a próxima reinicialização do SO) e você precisa adicionar kernel.shmmax=367108864 ao /etc/sysctl.conf.

Se possível, atualize seu PostgreSQL para 8.4.8, conforme sugerido na Política de controle de versão :

We always recommend that all users run the latest available minor release for whatever major version is in use.

Eu acho que esse é provavelmente o problema matador da OOM, porque ele mata o postmaster com sinal SIGKILL e sem liberando memória compartilhada. Veja a documentação :

Important: It is best not to use SIGKILL to shut down the server. Doing so will prevent the server from releasing shared memory and semaphores, which might then have to be done manually before a new server can be started. Furthermore, SIGKILL kills the postgres process without letting it relay the signal to its subprocesses, so it will be necessary to kill the individual subprocesses by hand as well.

e aqui :

n Linux 2.4 and later, the default virtual memory behavior is not optimal for PostgreSQL. Because of the way that the kernel implements memory overcommit, the kernel might terminate the PostgreSQL server (the master server process) if the memory demands of another process cause the system to run out of virtual memory.

BTW max_connections é "barato". Em vez disso, reduza o shared_buffers.

    
por 26.04.2011 / 01:35