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éfinirwork_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 valeurshared_buffers
afin que la mĂ©moire puisse ĂȘtre utilisĂ©e pour d'autres opĂ©rations, telles quework_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 surhuge_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 demax_locks_per_transaction
pour éviter les OOM.La valeur
max_locks_per_transaction
doit ĂȘtre de typemax_locks_per_transaction
* (max_connections
+max_prepared_transactions
). Cela signifie que si vous avez 300 000 objets et que la valeur demax_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. Commemax_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.