Utilisation de la fonction autovacuum de PostgreSQL sur Amazon Aurora PostgreSQL - Amazon Aurora

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation de la fonction autovacuum de PostgreSQL sur Amazon Aurora PostgreSQL

Nous vous conseillons vivement d’utiliser la fonction autovacuum afin de maintenir l’intégrité de votre instance de base de données PostgreSQL. La fonction autovacuum automatise le lancement des commandes VACUUM et ANALYZE. Elle vérifie les tables ayant eu un grand nombre de tuples insérés, mis à jour ou supprimés. Après cette vérification, elle récupère le stockage en supprimant les données ou les tuples obsolètes de la base de données PostgreSQL.

Par défaut, la fonction autovacuum est activée sur les instances de base de données Aurora PostgreSQL que vous créez en utilisant l’un des groupes de paramètres de base de données PostgreSQL par défaut. Les autres paramètres de configuration associés à la fonction autovacuum sont également définis par défaut. Comme ces valeurs par défaut sont relativement génériques, vous pouvez bénéficier du réglage de certains paramètres associés à la fonction d’autovacuum pour votre charge de travail spécifique.

Vous trouverez ci-dessous de plus amples informations sur l’autovacuum et sur la façon de régler certains de ses paramètres sur votre instance de base de données Aurora PostgreSQL.

Allocation de mémoire pour la fonction autovacuum

L’un des paramètres les plus importants qui influencent les performances d’autovacuum est autovacuum_work_mem. Dans Aurora PostgreSQL versions 14 et antérieures, le paramètre autovacuum_work_mem est défini sur -1, ce qui indique que le paramètre maintenance_work_mem est utilisé à la place. Pour toutes les autres versions, autovacuum_work_mem est déterminé par GREATEST({DBInstanceClassMemory/32768}, 65536).

Les opérations de vacuum manuel utilisent toujours le paramètre maintenance_work_mem, avec le paramètre par défaut GREATEST({DBInstanceClassMemory/63963136*1024}, 65536). Il peut également être ajusté au niveau de la session à l’aide de la commande SET pour des opérations VACUUM manuelles plus ciblées.

autovacuum_work_mem détermine la mémoire permettant à l’autovacuum de contenir les identifiants des tuples inactifs (pg_stat_all_tables.n_dead_tup) pour les opérations de vacuum d’index.

Lors des calculs visant à déterminer la valeur du paramètre autovacuum_work_mem, tenez compte des points suivants :

  • Si vous définissez une valeur trop basse pour ce paramètre, le processus vacuum pourrait avoir à analyser la table plusieurs fois pour mener à bien sa tâche. Ces nombreuses analyses peuvent avoir un impact négatif sur les performances. Pour les instances plus grandes, le réglage de maintenance_work_mem ou autovacuum_work_mem sur au moins 1 Go peut améliorer les performances des opérations de vacuum des tables contenant un grand nombre de tuples inactifs. Cependant, dans les versions 16 et antérieures de PostgreSQL, l’utilisation de la mémoire de vacuum est limitée à 1 Go, ce qui est suffisant pour traiter environ 179 millions de tuples inactifs en un seul passage. Si une table contient plus de tuples inactifs que cela, l’opération de vacuum doit effectuer plusieurs passages dans les index de la table, ce qui augmente considérablement le temps requis. À partir de la version 17 de PostgreSQL, il n’y a pas de limite de 1 Go et l’autovacuum peut traiter plus de 179 millions de tuples en utilisant des arbres radix.

    Un identifiant de tuple a une taille de 6 octets. Pour estimer la mémoire nécessaire afin d’effectuer le vacuum d’un index d’une table, interrogez pg_stat_all_tables.n_dead_tup pour chercher le nombre de tuples inactifs, puis multipliez ce nombre par 6 pour déterminer la mémoire requise pour effectuer le vacuum de l’index en un seul passage. Vous pouvez utiliser la requête suivante :

    SELECT relname AS table_name, n_dead_tup, pg_size_pretty(n_dead_tup * 6) AS estimated_memory FROM pg_stat_all_tables WHERE relname = 'name_of_the_table';
  • Le paramètre autovacuum_work_mem fonctionne en conjonction avec le paramètre autovacuum_max_workers. Chaque application de travail parmi autovacuum_max_workers peut utiliser la mémoire que vous allouez. Si vous avez beaucoup de petites tables, allouez plus de autovacuum_max_workers et moins de autovacuum_work_mem. Si vous avez de grandes tables (d’une taille supérieure à 100 Go), allouez plus de mémoire et moins de processus de travail. Vous devez avoir alloué suffisamment de mémoire pour pouvoir prendre en charge votre plus grande table. Assurez-vous donc que la combinaison des processus de travail et de la mémoire est égale à la mémoire totale que vous souhaitez allouer.

Réduction de la probabilité de bouclage de l’ID de transaction

Dans certains cas, les valeurs du groupe de paramètres associées à la fonction autovacuum peuvent ne pas être suffisamment agressives pour empêcher le bouclage de l’ID de transaction. Pour résoudre ce problème, Aurora PostgreSQL fournit un mécanisme qui adapte automatiquement les valeurs des paramètres d’autovacuum. Autovacuum adaptatif est une fonctionnalité pour Aurora PostgreSQL. Une explication détaillée du bouclage de l’ID de transaction figure dans la documentation PostgreSQL.

L’autovacuum adaptatif est activé par défaut pour les instances Aurora PostgreSQL avec le paramètre dynamique rds.adaptive_autovacuum défini sur ON. Nous vous recommandons vivement de garder cette option activée. Toutefois, pour désactiver le réglage adaptatif des paramètres d’autovacuum, définissez le paramètre rds.adaptive_autovacuum sur 0 ou OFF.

Le bouclage de l’ID de transaction reste possible même lorsque Aurora Amazon RDS ajuste les paramètres d’autovacuum. Nous vous encourageons à implémenter une alarme Amazon CloudWatch pour le bouclage de l’ID de transaction. Pour plus d’informations, consultez l’article Implement an early warning system for transaction ID wraparound in RDS pour PostgreSQL sur le blog de base de données AWS.

Lorsque le réglage adaptatif des paramètres d’autovacuum est activé, Amazon RDS commence à ajuster les paramètres d’autovacuum lorsque la métrique CloudWatch MaximumUsedTransactionIDs atteint la valeur du paramètre autovacuum_freeze_max_age ou 500 000 000, quelle que soit la valeur la plus élevée.

Amazon RDS continue à ajuster les paramètres pour la fonction autovacuum si une table continue à s’orienter vers le bouclage de l’ID de transaction. Chacun de ces ajustements dédie plus de ressources à la fonction d’autovacuum pour éviter le bouclage. Amazon RDS met à jour les paramètres suivants associés à la fonction d’autovacuum :

RDS modifie ces paramètres seulement si la nouvelle valeur rend la fonction d’autovacuum plus agressive. Ces paramètres sont modifiés dans la mémoire sur l’instance de base de données. Les valeurs figurant dans le groupe de paramètres ne sont pas modifiées. Pour afficher les paramètres en mémoire actuels, utilisez la commande SQL SHOW de PostgreSQL.

Chaque fois que Amazon RDS modifie l’un de ces paramètres d’autovacuum, il génère un événement pour l’instance de base de données concernée. Cet événement est visible sur l’AWS Management Console et via l’API Amazon RDS. Une fois que la métrique CloudWatch MaximumUsedTransactionIDs est repassée sous le seuil, Amazon RDS réinitialise les paramètres associés à la fonction autovacuum en mémoire en rétablissant les valeurs spécifiées dans le groupe de paramètres. Il génère ensuite un autre événement correspondant à cette modification.