Este documento explica cómo identificar el uso elevado de memoria para instancias de Cloud SQL y proporciona recomendaciones sobre cómo resolver problemas relacionados con la memoria.
Para saber cómo configurar el uso de memoria para una instancia de Cloud SQL, consulta Prácticas recomendadas para administrar el uso de memoria .
Identificar el alto uso de memoria
Las siguientes secciones analizan escenarios de alto uso de memoria.
Utilice el Explorador de métricas para identificar el uso de memoria
Puede revisar el uso de memoria de la instancia con la métrica database/memory/components.usage
en el Explorador de métricas .
Utilice Query Insights para analizar y explicar el plan para consultas que consumen muchos recursos.
Query Insights le ayuda a detectar, diagnosticar y prevenir problemas de rendimiento de consultas en bases de datos de Cloud SQL. Le proporciona una lista de consultas de larga duración junto con su plan de explicación (documentación de PostgreSQL) . Revise el plan de explicación e identifique la parte de la consulta que utiliza un método de escaneo de alto consumo de memoria. Independientemente del tiempo de ejecución de la consulta, Query Insights le proporciona el plan de explicación para todas las consultas. Identifique las consultas complejas que tardan más tiempo para saber cuáles bloquean la memoria durante periodos más largos.
Los métodos de escaneo comunes de PostgreSQL que utilizan mucha memoria incluyen los siguientes:
- Escaneo de montón de mapas de bits
- Ordenación rápida
- Unión hash o Hash
Alto uso de memoria y registros relevantes para instancias habilitadas para Gemini
Si tiene Gemini habilitado, en lugar de un fallo de memoria insuficiente (OOM) que provoque una inactividad de la base de datos, se finaliza la conexión que ejecuta una consulta con alto consumo de memoria, lo que evita la inactividad de la base de datos. Para identificar la consulta predeterminada, puede consultar los registros de la base de datos para ver las siguientes entradas:
(...timestamp….) db=postgres, user=customer FATAL: terminating connection due to administrator command
Se muestra el siguiente registro de la base de datos de Cloud SQL para PostgreSQL, que captura la consulta de alto uso de memoria que se terminó para evitar el OOM. Esta consulta es una versión normalizada de la consulta original:
db=postgres,user=customer LOG: postgres process with PID 1734 for the query "SELECT COUNT(product) AS item_count FROM test_table WHERE product_type = $1 AND product LIKE $2 AND c6_2 IN ($3,$4,$5,$6,$7)" has been cancelled.
También se muestran notificaciones en la página Instancias de Cloud SQL para los siguientes eventos:
- Utilización de memoria de la instancia durante las últimas 24 horas.
- Listado de consultas normalizadas que han sido canceladas en las últimas 24 horas.
- Un enlace a la documentación de Google sobre cómo optimizar el uso de la memoria.
Alto uso de memoria: recomendaciones
Las siguientes recomendaciones abordan los problemas comunes relacionados con la memoria. Si la instancia continúa utilizando mucha memoria, es muy probable que se produzca un problema out of memory
. Si las demandas de memoria de PostgreSQL o de otro proceso provocan que el sistema se quede sin memoria, aparecerá un mensaje de kernel Out of Memory
en los registros de PostgreSQL y la instancia de PostgreSQL se detendrá. Por ejemplo:
Out of Memory: Killed process 12345 (postgres)
El caso más común de un problema de OOM se produce cuando el valor de work_mem
es alto y hay un gran número de conexiones activas. Por lo tanto, si experimenta OOM frecuentes o para evitarlos en su instancia de Cloud SQL para PostgreSQL, le recomendamos seguir estas recomendaciones:
Establecer
work_mem
Las consultas que utilizan ordenación rápida son más rápidas que las que utilizan ordenación por fusión externa. Sin embargo, la primera puede agotar la memoria. Para solucionar este problema, configure el valor
work_mem
con un valor razonable que equilibre las operaciones de ordenación en memoria y disco. También puede considerar configurarwork_mem
a nivel de sesión en lugar de configurarlo para toda la instancia.Monitorizar las sesiones activas
Cada conexión utiliza una cantidad determinada de memoria. Utilice la siguiente consulta para comprobar el número de conexiones activas:
SELECT state, usename, count(1) FROM pg_stat_activity WHERE pid <> pg_backend_pid() GROUP BY state, usename ORDER BY 1;
Si tiene una gran cantidad de sesiones activas, analice la causa raíz de esa gran cantidad de sesiones activas; por ejemplo, bloqueos de transacciones.
Establecer
shared_buffers
Si
shared_buffers
se establece en un valor más alto, considere disminuir el valor deshared_buffers
para que la memoria pueda usarse para otras operaciones, comowork_mem
, o para establecer nuevas conexiones.Tasa de aciertos de caché
PostgreSQL generalmente intenta mantener en caché los datos a los que accede con mayor frecuencia. Cuando un cliente solicita los datos, si ya están almacenados en caché en búferes compartidos, se le entregan directamente. Esto se denomina acierto de caché . Si los datos no están presentes en los búferes compartidos, primero se recuperan en los búferes compartidos desde un disco y luego se entregan al cliente. Esto se denomina error de caché . La tasa de aciertos de caché mide cuántas solicitudes de contenido ha gestionado la caché en comparación con las solicitudes recibidas. Ejecute la siguiente consulta para comprobar la tasa de aciertos de caché de las solicitudes de tabla en la instancia de PostgreSQL:
SELECT sum(heap_blks_read) as heap_read, sum(heap_blks_hit) as heap_hit, sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) as ratio FROM pg_statio_user_tables;
Ejecute la siguiente consulta para comprobar la tasa de aciertos de caché para las solicitudes de índice en la instancia de PostgreSQL:
SELECT sum(idx_blks_read) as idx_read, sum(idx_blks_hit) as idx_hit, (sum(idx_blks_hit) - sum(idx_blks_read)) / sum(idx_blks_hit) as ratio FROM pg_statio_user_indexes;
En general, se considera que un índice de acierto de caché del 95 al 99 % es un buen valor.
Habilitar páginas enormes. Cloud SQL para PostgreSQL tiene habilitada
huge_pages
por defecto para una mejor gestión de la memoria. Recomendamos habilitarla. Para obtener más información sobrehuge_pages
, consulte la documentación de PostgreSQL .Establecer
max_locks_per_transaction
El valor
max_locks_per_transaction
indica la cantidad de objetos de base de datos que se pueden bloquear simultáneamente. En la mayoría de los casos, el valor predeterminado de 64 es suficiente. Sin embargo, si trabaja con un conjunto de datos grande, podría experimentar bloqueos de objetos (OOM). Considere aumentar el valor demax_locks_per_transaction
lo suficiente para evitar bloqueos de objetos (OOM).El valor de
max_locks_per_transaction
debe sermax_locks_per_transaction
* (max_connections
+max_prepared_transactions
) objetos. Esto significa que si tiene 300 mil objetos y el valor demax_connections
es 200, entoncesmax_locks_per_transaction
debe ser 1500.Establecer
max_pred_locks_per_transaction
La transacción podría fallar si tiene clientes que acceden a varias tablas diferentes en una sola transacción serializable. En ese caso, considere aumentar
max_pred_locks_per_transaction
a un valor razonablemente alto. Al igual quemax_locks_per_transaction
,max_pred_locks_per_transaction
también usa memoria compartida, así que no establezca un valor excesivamente alto.Si el uso de memoria sigue siendo alto y considera que esas consultas son tráfico legítimo, considere aumentar la cantidad de recursos de memoria en su instancia para evitar fallas o tiempos de inactividad de la base de datos.