Comment gérer les problèmes de manque de mémoire libre ou d'utilisation élevée de l'espace d'échange dans mon instance Amazon RDS for Oracle Database ?

Dernière mise à jour : 30/09/2021

Je souhaite gérer des problèmes de manque de mémoire libre ou d'utilisation élevée de l'espace d'échange dans mon instance de base de données Amazon Relational Database Service (Amazon RDS) pour Oracle.

Brève description

Dans les bases de données Oracle, la mémoire disponible est principalement utilisée par la zone globale programmes (PGA) et la zone globale système (SGA). Lorsque vous configurez une instance de base de données Oracle, assurez-vous que la somme de ces deux composants est inférieure à la mémoire physique totale pour que de la mémoire libre soit disponible pour d'autres processus et fonctionnalités hôtes. Vous devez régler les paramètres de mémoire pour éviter une utilisation élevée de l'espace d'échange et l'utilisation de grandes quantités de mémoire physique. Pour plus d'informations sur l'utilisation de l'espace d'échange et les limites recommandées, consultez Pourquoi mon instance de base de données Amazon RDS utilise la mémoire d'échange alors que je dispose d'assez de mémoire ?

Si votre instance de base de données utilise la gestion automatique de la mémoire, la quantité totale de mémoire utilisée par les bases de données Oracle est gérée par les paramètres MEMORY_TARGET et MEMORY_MAX_TARGET. La valeur définie dans MEMORY_TARGET est égale à la somme des valeurs SGA et PGA. La mémoire utilisée par SGA est déterminée par les paramètres SGA_MAX_SIZE et SGA_TARGET. La mémoire utilisée par PGA est gérée par les paramètres PGA_AGGREGATE_TARGET et PGA_AGGREGATE_LIMIT. Les valeurs par défaut de ces paramètres sont élevées pour des raisons de performance. Toutefois, dans certains cas d'utilisation, ces valeurs élevées peuvent entraîner des conflits de mémoire et une utilisation élevée de l'espace d'échange.

Solution

Pour résoudre ce problème, utilisez l'une des méthodes suivantes en fonction du mode de gestion de la mémoire de votre instance.

  • Si votre instance de base de données utilise la gestion automatique de la mémoire, diminuez la valeur de MEMORY_TARGET.
  • Si votre instance de base de données utilise la gestion automatique de la mémoire partagée, diminuez la valeur des paramètres PGA et SGA de votre instance.

Remarque : Bien que ces paramètres soient des paramètres dynamiques, vous devez redémarrer votre instance sans basculement pour que ces paramètres soient modifiés. Pour plus d'informations, consultez la Remarque dans Enabling HugePages for an Oracle DB instance (Activation d'HugePages pour une instance de base de données Oracle).

Essayez les étapes de dépannage suivantes :

1.    Vérifiez si votre instance de base de données utilise la gestion automatique de la mémoire ou la gestion automatique de la mémoire partagée. Pour cela, vérifiez les paramètres SGA, PGA et MEMORY_TARGET :

SQL> SHOW PARAMETER SGA;

SQL> SHOW PARAMETER PGA;

SQL> SHOW PARAMETER MEMORY_TARGET;
  • Si MEMORY_TARGET est défini, l'instance utilise la gestion automatique de la mémoire.
  • Si MEMORY_TARGET n'est pas défini, mais que SGA_TARGET et PGA_AGGREGATE_TARGET sont définis, alors l'instance utilise la gestion automatique de la mémoire partagée.

Pour plus d'informations sur les différents modes de gestion de la mémoire, consultez la documentation Oracle About memory management (À propos de la gestion de la mémoire).

2.    Exécutez les requêtes suivantes pour afficher l'utilisation de la mémoire par PGA et SGA, respectivement :

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;

Exécutez les requêtes suivantes pour afficher la mémoire maximale allouée pour PGA et SGA, respectivement, après le dernier redémarrage :

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';

Exécutez les requêtes suivantes pour afficher des conseils pour PGA et SGA, respectivement :

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.    Définissez des paramètres appropriés pour les paramètres de mémoire afin d'éviter une consommation de mémoire excessive et une utilisation élevée de l'espace d'échange. Ces paramètres peuvent également vous aider à régler la base de données pour améliorer la performance. Vous pouvez modifier tous les paramètres de ces exemples à l'aide du groupe de paramètres d'instance.

Si votre instance utilise la gestion automatique de la mémoire, seul le paramètre MEMORY_TARGET est défini. Ce paramètre est défini sur la valeur suivante, par défaut :

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*3/4}

Si votre instance utilise la gestion automatique de la mémoire partagée, les paramètres PGA_AGGREGATE_TARGET et SGA_TARGET sont respectivement définis sur les valeurs par défaut suivantes :

PGA_AGGREGATE_TARGET= {DBInstanceClassMemory*1/8}

SGA_TARGET= SGA_MAX_SIZE = {DBInstanceClassMemory*3/4}

Si l'utilisation de la mémoire avec ces paramètres par défaut est élevée, vous pouvez ajuster les paramètres par défaut pour limiter la mémoire utilisée par l'instance Oracle. Vous pouvez utiliser les conseils présentés précédemment concernant la mémoire pour ajuster les paramètres de mémoire. C'est une bonne pratique de régler les paramètres de mémoire dans un environnement de test avant d'appliquer les modifications aux bases de données de production.

Par exemple :

Si votre instance utilise une gestion automatique de la mémoire, réduisez uniquement les valeurs MEMORY_TARGET et MEMORY_MAX_TARGET :

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*1/2}

- ou -

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*3/5}

- ou -

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*2/3}

Si votre instance utilise la gestion automatique de la mémoire partagée, réduisez uniquement les paramètres de mémoire SGA et/ou PGA en fonction des valeurs conseillées présentées à l'étape précédente. Par exemple :

SGA_TARGET = {DBInstanceClassMemory*1/2}

- ou -

SGA_TARGET = {DBInstanceClassMemory*2/3}

Vous pouvez également régler l'utilisation de la mémoire de la zone mémoire programmes en définissant la valeur suivante pour PGA_AGGREGATE_TARGET :

PGA_AGGREGATE_TARGET = {DBInstanceClassMemory*1/12}

4.    Dans certains cas d'utilisation, l'utilisation de la mémoire par PGA peut dépasser la valeur PGA_AGGREGATE_TARGET et atteindre la valeur définie dans le paramètre PGA_AGGREGATE_LIMIT. La valeur par défaut de PGA_AGGREGATE_LIMIT dépend de la configuration de la mémoire de l'instance de base de données. Pour plus d'informations, consultez la documentation Oracle concernant PGA_AGGREGATE_LIMIT. Si la valeur par défaut de PGA_AGGREGATE_LIMIT est très élevée, l'instance RDS peut avoir une mémoire physique très faible ou indisponible pour l'hôte sous-jacent, ce qui entraîne une utilisation élevée de l'espace d'échange et des problèmes de conflit de mémoire.

Pour résoudre ces cas d'utilisation, recherchez les processus ou requêtes qui utilisent une grande quantité de PGA. Exécutez la requête suivante pour afficher l'allocation de la zone programmes par processus :

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;

Exécutez la requête suivante pour afficher l'utilisation de la mémoire par PGA pour les sessions utilisateur, à l'exclusion des processus en arrière-plan :

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;

Exécutez la requête suivante pour afficher l'utilisation de la mémoire par PGA par session et les requêtes exécutées par chaque session :

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;

Pour réduire l'utilisation élevée de la mémoire par PGA, utilisez une ou plusieurs des méthodes suivantes :

  • Limitez la valeur de PGA_AGGREGATE_LIMIT. Cela peut empêcher l'instance de manquer de mémoire. Toutefois, cela peut entraîner un échec des connexions lorsque de la mémoire PGA supplémentaire est requise pour un processus.
  • Réduisez la valeur SGA_TARGET de manière appropriée. Cela permet à PGA_AGGREGATE_TARGET d'augmente jusqu'à la valeur de PGA_AGGEGATE_LIMIT sans provoquer de problèmes de conflit de mémoire.
  • Augmentez la taille de classe de l'instance pour passer à une taille d'instance plus importante avec plus de mémoire.

5.    Après avoir réglé les paramètres de mémoire comme indiqué dans les étapes précédentes, surveillez les performances de la base de données et consultez les conseils de la base de données. Si la limitation des paramètres de mémoire entraîne une dégradation de la performance, essayez d'augmenter la taille de l'instance. Cela autorise une utilisation plus importante de la mémoire pour que l'instance de base de données fonctionne efficacement. Vous pouvez utiliser le tableau de bord Performance Insights pour analyser l'application de la base de données et identifier les requêtes qui utilisent le plus de mémoire. Vous pouvez ensuite régler ces requêtes qui utilisent le plus de mémoire pour qu'elles en utilisent moins.


Documentation Oracle relative à Memory architecture (Architecture de la mémoire)

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?