¿Por qué aparece el error “FATAL: remaining connection slots are reserved” (Error fatal: las ranuras de conexión restantes están reservadas) cuando me conecto a Amazon RDS para PostgreSQL aunque no haya alcanzado el límite de max_connections?

6 minutos de lectura
0

Aparece el error “FATAL: remaining connection slots are reserved” (Error fatal: las ranuras de conexión restantes están reservadas) cuando me conecto a Amazon Relational Database Service (Amazon RDS) para PostgreSQL aunque no haya alcanzado el límite de max_connections.

Descripción corta

En Amazon RDS para PostgreSQL, el número máximo real de conexiones disponibles para los usuarios que no son superusuarios se calcula de la siguiente manera:

max_connections - superuser_reserved_connections - rds.rds_superuser_reserved_connections.

El valor predeterminado de superuser_reserved_connections es 3 y el valor predeterminado de rds.rds_superuser_reserved_connections es 2.

Por ejemplo, si establece el valor de max_connections en 100, el número real de conexiones disponibles para un usuario que no es superusuario se calculará de la siguiente manera:

100 - 3 - 2 = 95.

La métrica DatabaseConnections de Amazon CloudWatch indica el número de conexiones de red del cliente a la instancia de base de datos en el nivel de sistema operativo. Esta métrica se calcula midiendo el número real de conexiones TCP a la instancia en el puerto 5432. El número de sesiones de base de datos puede ser superior a este valor de métrica porque el valor de métrica no incluye lo siguiente:

  • Procesos de fondo que ya no tienen una conexión de red pero que la base de datos no limpia. (Por ejemplo: la conexión finaliza debido a problemas de red, pero la base de datos no lo sabe hasta que intenta devolver el resultado al cliente).
  • Procesos de backend creados por el programador de trabajos del motor de base de datos. (Por ejemplo: pg_cron)
  • Conexiones de Amazon RDS.

Es posible que reciba este error porque la aplicación que se conecta a la instancia de RDS para PostgreSQL crea y pierde conexiones abruptamente. Esto podría provocar que la conexión de backend permanezca abierta durante algún tiempo. Es posible que esta condición cree una discrepancia entre los valores de la vista pg_stat_activity y la métrica de CloudWatch DatabaseConnections.

Resolución

Solucionar el error

Para solucionar este mensaje de error, lleve a cabo las siguientes comprobaciones:

  • Revise la métrica DatabaseConnections de CloudWatch.
  • Use Información sobre rendimiento para ver la métrica numbackends. Este valor proporciona información sobre el número de conexiones en el momento en que se produjo el error. Si no activó Información de rendimiento, inicie sesión en su instancia como usuario principal. A continuación, compruebe el número de backends mediante la siguiente consulta:
SELECT count(*) FROM pg_stat_activity;

Si encuentra algunas conexiones inactivas que se pueden terminar, utilice la función pg_terminate_backend() para terminar dichos backends. Puede ver todas las conexiones inactivas que desea terminar si ejecuta la siguiente consulta. Esta consulta muestra información sobre los procesos de backend que tienen uno de los siguientes estados durante más de 15 minutos: “idle” (inactivo), “idle in transaction” (inactivo en la transacción), “idle in transaction (aborted)” (inactivo en la transacción [abortado]) y “disabled” (desactivado).

SELECT * FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled')
AND state_change < current_timestamp - INTERVAL '15' MINUTE;

Nota: Asegúrese de actualizar la consulta de acuerdo con su caso de uso.

Después de identificar todos los procesos de backend que deben finalizarse, ejecute la siguiente consulta para finalizar estos procesos.

Nota: Esta consulta de ejemplo finaliza todos los procesos de backend que tienen uno de los estados mencionados anteriormente durante más de 15 minutos.

SELECT pg_terminate_backend(pid) FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled')
AND state_change < current_timestamp - INTERVAL '15' MINUTE
AND usename != 'rdsadmin';

Para terminar todos los procesos de backend inactivos, ejecute la siguiente consulta:

SELECT pg_terminate_backend(pid) FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled')
AND usename != 'rdsadmin';

Nota: No puedes terminar los procesos de backend que se crean con rdsadmin. Por lo tanto, debe excluirlos de la finalización.

Importante: Si no puede conectarse a la instancia de RDS para PostgreSQL con los privilegios rds_superuser, considere cerrar la aplicación correctamente para liberar algunas conexiones.

Administrar el número de conexiones a bases de datos

Utilizar la agrupación de conexiones

En la mayoría de los casos, puede usar un agrupador de conexiones, como un proxy RDS o un agrupador de conexiones de terceros, para administrar el número de conexiones que están abiertas en un momento dado. Por ejemplo, si establece el valor max_connections de la instancia de RDS para PostgreSQL en 500, puede evitar errores relacionados con max_connection si tiene un agrupador de conexiones configurado para un máximo de 400 conexiones.

Aumentar el valor de max_connections

Puede considerar aumentar el valor de max_connections según su caso de uso. Sin embargo, establecer un valor muy alto para max_connections puede provocar problemas de memoria en función de la carga de trabajo y la clase de instancia de la instancia de base de datos.

Nota: Si aumenta el valor de max_connections, debe reiniciar la instancia para que el cambio surta efecto.

Terminar conexiones inactivas

Puede establecer el parámetro idle_in_transaction_session_timeout en un valor que sea apropiado para su caso de uso. Se termina cualquier sesión que esté inactiva dentro de una transacción abierta durante más tiempo del especificado en este parámetro. Por ejemplo, si establece este parámetro en 10 minutos, se termina cualquier consulta que esté inactiva en la transacción durante más de 10 minutos. Este parámetro ayuda a administrar las conexiones que están estancadas en este estado en particular.

Para las versiones 14 y posteriores de PostgreSQL, puede usar el parámetro idle_session_timeout. Después de establecer este parámetro, se terminará cualquier sesión inactiva durante más tiempo del especificado, pero que no esté dentro de una transacción abierta.

Para las versiones 14 y posteriores de PostgreSQL, puede usar el parámetro client_connection_check_interval. Con este parámetro, puede establecer el intervalo de tiempo entre las comprobaciones opcionales de la conexión del cliente al ejecutar consultas. La comprobación se realiza mediante el sondeo de sockets. Esta comprobación permite que las consultas de larga duración finalicen antes si el kernel establece que la conexión está cerrada. Este parámetro ayuda en situaciones en las que PostgreSQL no sabe que se ha perdido la conexión con un proceso de backend.

Aumentar el valor de rds.rds_superuser_reserved_connections

Puede considerar aumentar el valor del parámetro rds.rds_superuser_reserved_connections. El valor predeterminado de este parámetro se establece en 2. Aumentar el valor de este parámetro permite que haya más conexiones de usuarios con la función rds_superuser asociada. Con esta función, los usuarios pueden ejecutar tareas administrativas, como terminar una conexión inactiva mediante el comando pg_terminate_backend().


OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años