Hubo un fallo en Discourse debido a un problema de conexión con PSQL

Hemos estado recibiendo este mensaje en nuestro foro. (cada 3-4 horas). Tenemos 16 núcleos de CPU y 32 GB de RAM. No creo que los recursos sean un problema.

Oops
El software que impulsa este foro de discusión encontró un problema inesperado. Lamentamos las molestias.

Se registró información detallada sobre el error y se generó una notificación automática. Le echaremos un vistazo.

No se requiere ninguna acción adicional. Sin embargo, si la condición de error persiste, puede proporcionar detalles adicionales, incluidos los pasos para reproducir el error, publicando un tema de discusión en la categoría de comentarios del sitio.

El registro de producción muestra


app/models/user_auth_token.rb:125:in `lookup'
lib/auth/default_current_user_provider.rb:131:in `current_user'
lib/current_user.rb:35:in `current_user'
app/controllers/application_controller.rb:1047:in `rate_limit_crawlers'
lib/middleware/omniauth_bypass_middleware.rb:64:in `call'
lib/middleware/csp_script_nonce_injector.rb:12:in `call'
lib/middleware/anonymous_cache.rb:393:in `call'
lib/middleware/csp_script_nonce_injector.rb:12:in `call'
config/initializers/008-rack-cors.rb:14:in `call'
config/initializers/100-silence_logger.rb:27:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:236:in `call'
Error inesperado en Message Bus: ActiveRecord::ConnectionNotEstablished: la conexión al servidor en "172.17.0.2", puerto 5432 falló: FATAL: las ranuras de conexión restantes están reservadas para conexiones de superusuario no de replicación.

Error inesperado en Message Bus: ActiveRecord::ConnectionNotEstablished: la conexión al servidor en "172.17.0.2", puerto 5432 falló: FATAL: las ranuras de conexión restantes están reservadas para conexiones de superusuario no de replicación.

Error inesperado en Message Bus: ActiveRecord::ConnectionNotEstablished: la conexión al servidor en "172.17.0.2", puerto 5432 falló: FATAL: las ranuras de conexión restantes están reservadas para conexiones de superusuario no de replicación.

Error inesperado en Message Bus: ActiveRecord::ConnectionNotEstablished: la conexión al servidor en "172.17.0.2", puerto 5432 falló: FATAL: las ranuras de conexión restantes están reservadas para conexiones de superusuario no de replicación.

Configuramos lo siguiente en

UNICORN_WORKERS: 32
UNICORN_SIDEKIQS: 2

y para psql

db_shared_buffers: "4096MB"

Por favor, hágame saber qué más puedo hacer para mejorar la configuración y asegurarme de que el servidor no falle.

Le daría a postgres (db_shared_buffers) al menos 16 GB, si no 20 GB.

Pero necesitas hacer más conexiones a la base de datos. No recuerdo exactamente cómo hacerlo.

Creo que es max_connections en /etc/postgresql/postgresql.conf (dentro del contenedor que ejecuta postgres) lo que necesitas cambiar.

1 me gusta

Yo también lo creo. :+1:

¿Estás seguro de eso? Eso parece mucho. Consulta PostgreSQL: Documentation: 13: 19.4. Resource Consumption

Si tienes un servidor de base de datos dedicado con 1 GB o más de RAM, un valor inicial razonable para shared_buffers es el 25% de la memoria de tu sistema. Hay algunas cargas de trabajo en las que configuraciones incluso mayores para shared_buffers son efectivas, pero dado que PostgreSQL también depende de la caché del sistema operativo, es poco probable que una asignación de más del 40% de la RAM a shared_buffers funcione mejor que una cantidad menor.

Y este no es un servidor de base de datos dedicado, también hay 32 procesos de unicornio en él.

Siempre me remito a ti en asuntos como este, y pensé que estaba citando un consejo que habías dado en el pasado, así que, NO, no estoy seguro. :rofl:

Está bastante claro que la conexión es el problema y aumentar la RAM al 25% de 32 GB podría ayudar en general, pero no es la causa del error.

EDITAR:

¡Ja! Eso es exactamente lo que recordaba, excepto que parece que iba a superar el 50%. . .

1 me gusta

Me declaro más o menos culpable

Pero eso fue entonces… :wink:

:100:

2 Me gusta

¿Por qué? Esas son la causa de que te quedes sin ranuras de conexión.

1 me gusta

Creo que vi en alguna parte que UNICORN WORKER debería ser 2 * CPU. Así que hice el cálculo y me dio 32. ¿Debería reducir la escala?

Intentamos cambiar la configuración de tiempo de espera para PSQL ejecutando ALTER ROLE discourse SET statement_timeout = '30000';. Y esta consulta es la que se bloqueó, una vez cada pocas horas.


¿No estoy seguro si usted o alguien más tiene alguna idea de lo que sucedió?

No, por favor, elimine esto y deje que los valores predeterminados tengan lugar. Este es el caso clásico de optimización prematura.

2 Me gusta

Sí, tocaste cosas que no debías :wink:

1 me gusta

9 publicaciones se dividieron en un nuevo tema: Recomendación para el número de trabajadores: ¿núcleos × 2?