¿Cómo puedo gestionar los problemas de poca memoria libre o alto uso del espacio de intercambio en la instancia de base de datos de Amazon RDS for Oracle?

Actualización más reciente: 30-09-2021

Deseo gestionar los problemas de poca memoria libre o alto uso del espacio de intercambio en la instancia de base de datos de Amazon Relational Database Service (Amazon RDS) for Oracle.

Descripción corta

En las bases de datos de Oracle, la memoria disponible es utilizada principalmente por el área global del programa (PGA) y el área global del sistema (SGA). Al configurar una instancia de base de datos de Oracle, asegúrese de que la suma de estos dos componentes es menor que la memoria física total para dejar memoria libre para otros procesos y funcionalidades del alojamiento. Debe ajustar los parámetros de memoria para evitar un alto uso del espacio de intercambio y la utilización de grandes cantidades de memoria física. Para obtener más información sobre el uso del espacio de intercambio y los límites recomendados, consulte ¿Por qué la instancia de base de datos de Amazon RDS utiliza la memoria de espacio de intercambio cuando tengo suficiente memoria?

Si la instancia de base de datos utiliza la administración automática de la memoria, la cantidad total de memoria utilizada por las bases de datos de Oracle se administra mediante los parámetros MEMORY_TARGET y MEMORY_MAX_TARGET. El valor establecido en MEMORY_TARGET es igual a la suma de SGA y PGA. La memoria utilizada por el SGA está determinada por los parámetros SGA_MAX_SIZE y SGA_TARGET. La memoria utilizada por el PGA se administra mediante los parámetros PGA_AGGREGATE_TARGET y PGA_AGGREGATE_LIMIT. Los valores predeterminados de estos parámetros son altos por razones de rendimiento. Sin embargo, en ciertos casos de uso, estos valores altos pueden causar contención de memoria y un alto uso del espacio de intercambio.

Resolución

Para solucionar este problema, utilice uno de los siguientes métodos en función del modo de administración de la memoria de la instancia.

  • Si la instancia de la base de datos utiliza la administración automática de la memoria, disminuya el valor de MEMORY_TARGET.
  • Si la instancia de base de datos utiliza la administración automática de memoria compartida, reduzca los valores de los parámetros PGA y SGA de la instancia.

Nota: Aunque estos parámetros son dinámicos, debe reiniciar la instancia sin conmutación por error para que se modifiquen estos parámetros. Para obtener más información, consulte la Nota en Habilitar HugePages para una instancia de base de datos de Oracle.

Pruebe los siguientes pasos para solucionar el problema:

1.    Verifique si la instancia de base de datos utiliza la administración automática de la memoria o la administración automática de la memoria compartida. Para ello, se pueden verificar los parámetros SGA, PGA y MEMORY_TARGET:

SQL> SHOW PARAMETER SGA;

SQL> SHOW PARAMETER PGA;

SQL> SHOW PARAMETER MEMORY_TARGET;
  • Si MEMORY_TARGET está establecido, la instancia utiliza la administración automática de la memoria.
  • Si MEMORY_TARGET no está establecido, pero SGA_TARGET y PGA_AGGREGATE_TARGET están establecidos, la instancia utiliza la administración automática de la memoria compartida.

Para obtener más información sobre los diferentes modos de administración de la memoria, consulte la documentación de Oracle, particularmente la sección Acerca de la administración de la memoria.

2.    Ejecute las siguientes consultas para ver el uso de la memoria por PGA y SGA, respectivamente:

SQL> SELECT (value/1024/1024) CURRENT_PGA_IN_USE_IN_MB FROM V$PGASTAT WHERE NAME ='total PGA inuse';

SQL> SELECT SUM (bytes/1024/1024) CURRENT_SGA_SIZE_IN_MB FROM V$SGASTAT;

Ejecute las siguientes consultas para ver la memoria máxima asignada para PGA y SGA, respectivamente, después del último reinicio:

SQL> SELECT (value/1024/1024) MAX_PGA_ALLOCATED_IN_MB FROM V$PGASTAT WHERE NAME = 'maximum PGA allocated';

SQL> SELECT SUM (bytes/1024/1024) MAX_SGA_SIZE_IN_MB FROM V$SGAINFO WHERE NAME='Maximum SGA Size';

Ejecute las siguientes consultas para ver las vistas de asesoramiento correspondientes a PGA y SGA, respectivamente:

SQL> SELECT PGA_TARGET_FOR_ESTIMATE,
PGA_TARGET_FACTOR, ADVICE_STATUS, ESTD_TIME, ESTD_PGA_CACHE_HIT_PERCENTAGE FROM
V$PGA_TARGET_ADVICE ORDER BY PGA_TARGET_FACTOR;

SQL> SELECT SGA_SIZE,
SGA_SIZE_FACTOR, ESTD_DB_TIME_FACTOR, ESTD_PHYSICAL_READS FROM
V$SGA_TARGET_ADVICE ORDER BY SGA_SIZE ASC;

3.    Defina los ajustes apropiados para los parámetros de memoria para evitar un consumo excesivo de memoria y un uso elevado de espacio de intercambio. Estas configuraciones también pueden servir para ajustar la base de datos para obtener un mejor rendimiento. Puede cambiar cualquiera de los parámetros de estos ejemplos con el grupo de parámetros de la instancia.

Si la instancia utiliza la administración automática de la memoria, entonces solo se establece el parámetro MEMORY_TARGET. Este parámetro está configurado de forma predeterminada con el siguiente valor:

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*3/4}

Si la instancia utiliza la administración automática de la memoria compartida, los parámetros PGA_AGGREGATE_TARGET y SGA_TARGET se establecen con los siguientes valores predeterminados, respectivamente:

PGA_AGGREGATE_TARGET= {DBInstanceClassMemory*1/8}

SGA_TARGET= SGA_MAX_SIZE = {DBInstanceClassMemory*3/4}

Si el uso de la memoria es alto con esta configuración predeterminada, entonces podría ajustar la configuración predeterminada para limitar la memoria utilizada por la instancia de Oracle. Puede utilizar las vistas de asesoramiento de memoria anteriores para ajustar los parámetros de memoria. Es una práctica recomendada ajustar los parámetros de memoria en un entorno de prueba antes de aplicar los cambios a las bases de datos de producción.

Por ejemplo:

Si la instancia es de administración automática de memoria, entonces reduzca únicamente los valores MEMORY_TARGET y MEMORY_MAX_TARGET:

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*1/2}

-o bien-

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*3/5}

-o bien-

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*2/3}

Si la instancia utiliza la administración automática de la memoria compartida, reduzca únicamente los parámetros de memoria de SGA o PGA en función de los valores de asesoramiento indicados en el paso anterior. Por ejemplo:

SGA_TARGET = {DBInstanceClassMemory*1/2}

-o bien-

SGA_TARGET = {DBInstanceClassMemory*2/3}

También puede ajustar el uso de la memoria del área de memoria de programa si establece el siguiente valor para PGA_AGGREGATE_TARGET:

PGA_AGGREGATE_TARGET = {DBInstanceClassMemory*1/12}

4.    En ciertos casos de uso, el uso de la memoria por parte del PGA podría exceder el valor de PGA_AGGREGATE_TARGET y llegar hasta el valor establecido en el parámetro PGA_AGGREGATE_LIMIT. El valor predeterminado de PGA_AGGREGATE_LIMIT depende de la configuración de la memoria de la instancia de base de datos. Para obtener más información, consulte PGA_AGGREGATE_LIMIT en la documentación de Oracle. Si el valor predeterminado de PGA_AGGREGATE_LIMIT es muy alto, entonces la instancia RDS podría tener muy poca o ninguna memoria física para el alojamiento subyacente, lo que causa un alto uso de espacio de intercambio y problemas de contención de memoria.

Para solucionar los problemas relacionados con estos casos de uso, identifique qué procesos o consultas utilizan una gran cantidad de PGA. Ejecute la siguiente consulta para visualizar la asignación de área de programa por proceso:

SQL> SELECT spid, program, round(pga_max_mem/1024/1024) max_MB, round(pga_alloc_mem/1024/1024)alloc_MB, round(pga_used_mem/1024/1024) used_MB, round(pga_freeable_mem/1024/1024) free_MB FROM V$PROCESS ORDER BY 3;

Ejecute la siguiente consulta para ver el uso de memoria por parte del PGA correspondiente a las sesiones de usuario, sin incluir los procesos en segundo plano:

SQL> SELECT sum(p.pga_max_mem)/1024/1024 "PGA MAX MEMORY OF USER SESSION (MB)" FROM v$process p, v$session s WHERE P.ADDR = S.paddr and s.username IS NOT NULL;

Ejecute la siguiente consulta para ver el uso de memoria por parte del PGA por sesión y las consultas que se ejecutan por cada sesión:

SQL> SELECT s.username, p.pga_max_mem/1024/1024 "PGA MEMORY OF USER SESSION (MB)", q.sql_text FROM v$process p, v$session s, v$SQL q WHERE P.ADDR = S.paddr AND s.username IS NOT NULL AND s.sql_id = q.sql_id ORDER BY 2;

Para reducir el elevado uso de memoria por parte del PGA, utilice uno o varios de los siguientes métodos:

  • Limite el valor de PGA_AGGREGATE_LIMIT. Esto puede evitar que la instancia se quede sin memoria. Sin embargo, es posible que se produzcan errores de conexión cuando se requiera memoria PGA adicional para un proceso.
  • Reduzca el valor SGA_TARGET de forma adecuada. Esto permite que PGA_AGGREGATE_TARGET aumente hasta el valor de PGA_AGGEGATE_LIMIT sin causar problemas de contención de memoria.
  • Aumente el tamaño de la clase de instancia a un tamaño de instancia más grande con más memoria.

5.    Después de ajustar los parámetros de memoria como se mencionó en los pasos anteriores, monitoree el rendimiento de la base de datos y consulte las vistas de asesoramiento de la base de datos. Si limitar los parámetros de memoria causa una degradación del rendimiento, entonces intente aumentar el tamaño de la instancia. Esto permite un mayor uso de la memoria para que la instancia de la base de datos trabaje eficientemente. Puede utilizar el panel de información sobre el rendimiento para analizar la carga de trabajo de la base de datos e identificar las consultas con mayor uso de memoria. A continuación, puede ajustar las consultas con el mayor uso de memoria para que utilicen menos memoria.


Documentación de Oracle sobre Arquitectura de la memoria

¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?