PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

ERRO:memória insuficiente na máquina com 32 GB de RAM e sem arquivo de troca


Se estou lendo a saída do seu top corretamente, ela não é tirada em um ponto em que você está sem memória.

O erro real parece bom - não está solicitando uma grande quantidade de memória, portanto, presumivelmente, a máquina estava sem memória naquele momento.

Vamos dar uma olhada rápida em suas configurações:
max_connections = 1000                  # (change requires restart)
work_mem = 40MB                         # min 64kB

Então - você é da opinião de que pode suportar 1000 consultas simultâneas, cada uma usando, digamos, 10 + 40 MB (alguns podem usar múltiplos de 40 MB, mas vamos ser razoáveis). Então - isso está me sugerindo que sua máquina tem> 500 núcleos e digamos 100 GB de RAM. Esse não é o caso.

Então - pegue seu número de núcleos e dobre - esse é um valor razoável para o número máximo de conexões. Isso permitirá que você faça uma consulta em cada núcleo enquanto outro aguarda E/S. Em seguida, coloque um pool de conexão na frente do banco de dados, se necessário (pgbouncer / pool de conexão do Java).

Então, você pode até considerar aumentar work_mem se precisar.

Oh - perfeitamente razoável para rodar sem swap habilitado. Uma vez que você começa a trocar, você está em um mundo de dor de qualquer maneira no que diz respeito ao uso do banco de dados.

Editar:expanda em work_mem vs shared

Em caso de dúvida, sempre consulte o documentação .

Os shared_buffers valor é, como o nome sugere, compartilhado entre back-ends. O work_mem não é apenas por backend, na verdade é por classificação. Então - uma consulta pode usar três ou quatro vezes essa quantidade se estiver fazendo classificações em três subconsultas.