Optimiser en cas d'utilisation élevée de la mémoire dans les instances

Ce document explique comment identifier les cas d'utilisation Ă©levĂ©e de la mĂ©moire par des instances Cloud SQL et fournit des recommandations sur la façon de rĂ©soudre les problĂšmes liĂ©s Ă  la mĂ©moire.

Pour apprendre Ă  configurer l'utilisation de la mĂ©moire pour une instance Cloud SQL, consultez la page Bonnes pratiques de gestion de l'utilisation de la mĂ©moire.

Identifier l'utilisation élevée de la mémoire

Les sections suivantes décrivent les scénarios d'utilisation intensive de la mémoire.

Utiliser l'explorateur de métriques pour identifier l'utilisation de la mémoire

Vous pouvez consulter l'utilisation de mémoire de l'instance avec la métrique database/memory/components.usage dans l'explorateur de métriques.

Utiliser Insights sur les requĂȘtes pour analyser le plan d'exĂ©cution des requĂȘtes qui consomment des ressources Ă©levĂ©es

Insights sur les requĂȘtes vous aide Ă  dĂ©tecter, Ă  diagnostiquer et Ă  empĂȘcher les problĂšmes de performances des requĂȘtes pour les bases de donnĂ©es Cloud SQL. Insights sur les requĂȘtes vous fournit une liste des requĂȘtes de longue durĂ©e ainsi que leur plan d'exĂ©cution (documentation PostgreSQL). Examinez le plan d'exĂ©cution et identifiez la partie de la requĂȘte qui utilise une mĂ©thode d'analyse de l'utilisation Ă©levĂ©e de la mĂ©moire. Quelle que soit la durĂ©e d'exĂ©cution de la requĂȘte, Insights sur les requĂȘtes fournit le plan d'exĂ©cution pour toutes les requĂȘtes. Identifiez les requĂȘtes complexes qui prennent plus de temps afin de dĂ©terminer celles qui bloquent la mĂ©moire pour des durĂ©es plus longues.

Les mĂ©thodes courantes PostgreSQL d'analyse de l'utilisation Ă©levĂ©e de la mĂ©moire incluent les suivantes :

  • Analyse des segments de mĂ©moire bitmap
  • Quick sort
  • Hash join ou Hash

Utilisation élevée de la mémoire et journaux correspondants pour les instances avec Gemini activé

Si Gemini est activĂ©, au lieu d'un Ă©chec en raison d'une mĂ©moire saturĂ©e (OOM, Out Of Memory) qui entraĂźne un temps d'arrĂȘt de la base de donnĂ©es, une connexion exĂ©cutant une requĂȘte avec une utilisation Ă©levĂ©e de mĂ©moire est interrompue, ce qui empĂȘche le temps d'arrĂȘt de la base de donnĂ©es. Pour identifier la requĂȘte par dĂ©faut, vous pouvez rechercher les entrĂ©es suivantes dans les journaux de la base de donnĂ©es :

  (...timestamp
.) db=postgres, user=customer FATAL: terminating connection due to administrator command

Le journal de base de donnĂ©es Cloud SQL pour PostgreSQL suivant s'affiche. Il capture la requĂȘte d'utilisation Ă©levĂ©e de la mĂ©moire qui a Ă©tĂ© arrĂȘtĂ©e pour Ă©viter les problĂšmes OOM. La requĂȘte est une version normalisĂ©e de la requĂȘte d'origine :

  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.

Les notifications sont Ă©galement affichĂ©es sur la page Instances Cloud SQL pour les Ă©vĂ©nements suivants :

  • Utilisation de la mĂ©moire de l'instance au cours des derniĂšres 24 heures.
  • Liste des requĂȘtes normalisĂ©es qui ont Ă©tĂ© annulĂ©es au cours des derniĂšres 24 heures.
  • Lien vers la documentation Google sur l'optimisation de l'utilisation de la mĂ©moire.

Utilisation Ă©levĂ©e de la mĂ©moire : recommandations

Les recommandations suivantes traitent des problĂšmes de mĂ©moire courants. Si l'instance continue Ă  utiliser une grande quantitĂ© de mĂ©moire, il est fort probable qu'il s'agisse d'un problĂšme out of memory. Si les demandes de mĂ©moire de PostgreSQL ou d'un autre processus entraĂźnent un manque de mĂ©moire du systĂšme, un message de noyau Out of Memory s'affiche dans les journaux PostgreSQL et l'instance PostgreSQL est arrĂȘtĂ©e. Exemple :

Out of Memory: Killed process 12345 (postgres)

Une valeur de work_mem plus Ă©levĂ©e avec un grand nombre de connexions actives est l'un des problĂšmes OOM les plus courants. Par consĂ©quent, si vous obtenez des OOM frĂ©quents ou pour Ă©viter les OOM dans votre instance Cloud SQL pour PostgreSQL, nous vous recommandons de suivre ces recommandations :

  • DĂ©finir work_mem

    Les requĂȘtes qui utilisent le tri rapide sont plus rapides que celles utilisant le tri externe par fusion. Toutefois, la premiĂšre mĂ©thode peut entraĂźner une saturation de la mĂ©moire. Pour rĂ©soudre ce problĂšme, dĂ©finissez une valeur work_mem suffisamment raisonnable pour Ă©quilibrer les deux opĂ©rations de tri dans la mĂ©moire et le disque. Vous pouvez Ă©galement dĂ©finir work_mem au niveau de la session plutĂŽt qu'au niveau d'une instance entiĂšre.

  • Surveiller les sessions actives

    Chaque connexion utilise une certaine quantitĂ© de mĂ©moire. ExĂ©cutez la requĂȘte suivante pour vĂ©rifier le nombre de connexions actives :

      SELECT
        state,
        usename,
        count(1)
      FROM
        pg_stat_activity
      WHERE
        pid <> pg_backend_pid()
      GROUP BY
        state,
        usename
      ORDER BY
        1;
    

    Si vous avez un grand nombre de sessions actives, analysez la cause d'un grand nombre de sessions actives, par exemple, les verrouillages de transactions.

  • DĂ©finir shared_buffers

    Si shared_buffers est dĂ©fini sur une valeur supĂ©rieure, envisagez de rĂ©duire la valeur shared_buffers afin que la mĂ©moire puisse ĂȘtre utilisĂ©e pour d'autres opĂ©rations, telles que work_mem, ou pour Ă©tablir de nouvelles connexions.

    Taux d'accĂšs au cache

    PostgreSQL tente gĂ©nĂ©ralement de conserver les donnĂ©es auxquelles vous accĂ©dez le plus souvent dans le cache. Lorsque les donnĂ©es sont demandĂ©es par un client, si elles sont dĂ©jĂ  mises en cache dans des tampons partagĂ©s, elles sont directement transmises au client. C'est ce qu'on appelle un succĂšs de cache. Si les donnĂ©es ne sont pas prĂ©sentes dans les tampons partagĂ©s, elles sont d'abord extraites des tampons partagĂ©s Ă  partir d'un disque, puis transmises au client. C'est ce qu'on appelle un dĂ©faut de cache (miss). Ce taux mesure le nombre de requĂȘtes de contenu que le cache a traitĂ©es par rapport aux requĂȘtes reçues. ExĂ©cutez la requĂȘte suivante pour vĂ©rifier le taux d'accĂšs au cache des requĂȘtes de table dans l'instance 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;
    

    ExĂ©cutez la requĂȘte suivante pour vĂ©rifier le taux d'accĂšs au cache des requĂȘtes d'index dans l'instance 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 gĂ©nĂ©ral, 95 Ă  99 % du taux d'accĂšs au cache est considĂ©rĂ© comme une valeur correcte.

  • Dans Cloud SQL pour PostgreSQL, l'indicateur huge_pages est activĂ© par dĂ©faut pour une meilleure gestion de la mĂ©moire. Pour en savoir plus sur huge_pages, consultez la documentation PostgreSQL.

  • DĂ©finir max_locks_per_transaction

    La valeur max_locks_per_transaction indique le nombre d'objets de base de donnĂ©es pouvant ĂȘtre verrouillĂ©s simultanĂ©ment. Dans la plupart des cas, la valeur par dĂ©faut de 64 est suffisante. Toutefois, si vous gĂ©rez un ensemble de donnĂ©es volumineux, vous risquez de vous retrouver avec des erreurs OOM. Pensez Ă  augmenter suffisamment la valeur de max_locks_per_transaction pour Ă©viter les OOM.

    La valeur max_locks_per_transaction doit ĂȘtre de type max_locks_per_transaction * (max_connections + max_prepared_transactions). Cela signifie que si vous avez 300 000 objets et que la valeur de max_connections est 200, max_locks_per_transaction doit ĂȘtre 1 500.

  • DĂ©finir max_pred_locks_per_transaction

    La transaction peut échouer si certains de vos clients ont accÚs à de nombreuses tables différentes dans une seule transaction sérialisable. Dans ce cas, envisagez d'augmenter max_pred_locks_per_transaction à une valeur raisonnablement élevée. Comme max_locks_per_transaction, max_pred_locks_per_transaction utilise également de la mémoire partagée. Par conséquent, ne définissez pas une valeur élevée déraisonnable.

  • Si l'utilisation de mĂ©moire est toujours Ă©levĂ©e et que vous estimez que ces requĂȘtes sont du trafic lĂ©gitime, envisagez d'augmenter le nombre de ressources de mĂ©moire de votre instance afin d'Ă©viter tout plantage ou temps d'arrĂȘt de la base de donnĂ©es.

Étapes suivantes