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.