sql >> Base de Datos >  >> RDS >> PostgreSQL

ERROR:sin memoria en la máquina con 32 GB de RAM y sin archivo de intercambio

Si estoy leyendo la salida de tu parte superior correctamente, no se toma en un punto en el que te quedas sin memoria.

El error real parece correcto:no está solicitando una gran cantidad de memoria, por lo que presumiblemente la máquina no tenía memoria en ese momento.

Echemos un vistazo rápido a su configuración:

max_connections = 1000                  # (change requires restart)
work_mem = 40MB                         # min 64kB

Entonces, usted es de la opinión de que puede admitir 1000 consultas simultáneas, cada una con, por ejemplo, 10 + 40 MB (algunas pueden usar múltiplos de 40 MB, pero seamos razonables). Entonces, esto me sugiere que su máquina tiene> 500 núcleos y dice 100 GB de RAM. Ese no es el caso.

Entonces, tome su número de núcleos y duplíquelo, ese es un valor razonable para el número máximo de conexiones. Eso le permitirá realizar una consulta en cada núcleo mientras otro espera E/S. Luego, coloque un agrupador de conexiones frente a la base de datos si lo necesita (pgbouncer / agrupación de conexiones de Java).

Entonces, incluso podría considerar aumentar work_mem si es necesario.

Oh, perfectamente razonable para ejecutar sin el intercambio habilitado. Una vez que comienza a intercambiar, se encuentra en un mundo de dolor de todos modos en lo que respecta al uso de la base de datos.

Editar:ampliar work_mem vs shared

En caso de duda, consulte siempre el documentación .

Los shared_buffers El valor es, como sugiere el nombre, compartido entre backends. El work_mem no es solo por backend, en realidad es por tipo. Entonces, una consulta puede usar tres o cuatro veces esa cantidad si ordena tres subconsultas.