J'essaie de faire en sorte que PostgreSQL ™ aspire de manière agressive ma base de données. J'ai actuellement configuré le vide automatique comme suit:
- autovacuum_vacuum_cost_delay = 0 # Désactive le vide basé sur les coûts
- autovacuum_vacuum_cost_limit = 10000 #Max
- autovacuum_vacuum_threshold = 50 # Valeur par défaut
- autovacuum_vacuum_scale_factor = 0.2 # Valeur par défaut
Je remarque que le vide automatique ne se déclenche que lorsque la base de données n'est pas chargée, alors je me retrouve dans des situations où il y a beaucoup plus de nuplets morts que de nuplets réels. Voir la capture d'écran ci-jointe pour un exemple. Une des tables a 23 tuples vivants mais 16845 tuples morts en attente d'aspiration. C'est dingue!
Le vide automatique démarre lorsque le test est terminé et que le serveur de base de données est inactif, ce qui n'est pas ce que je veux car je voudrais que le vide automatique démarre lorsque le nombre de tuples morts dépasse 20% de tuples vivants + 50, comme l'a été la base de données configuré. L'aspiration automatique lorsque le serveur est inactif me sert à rien, car le serveur de production est censé atteindre des milliers de mises à jour / s pendant une période prolongée, raison pour laquelle j'ai besoin de l'aspiration automatique même si le serveur est chargé.
Y a-t-il quelque chose qui me manque? Comment forcer l'aspiration automatique à fonctionner lorsque le serveur est soumis à une charge importante?
Mise à jour
Cela pourrait-il être un problème de verrouillage? Les tables en question sont des tables récapitulatives qui sont remplies via un déclencheur après insertion. Ces tables sont verrouillées en mode SHARE ROW EXCLUSIVE pour empêcher les écritures simultanées sur la même ligne.
la source
Augmenter le nombre de processus autovacuum et réduire le nombre de siestes aidera probablement. Voici la configuration pour PostgreSQL 9.1 que j'utilise sur un serveur qui stocke les informations de sauvegarde et génère par conséquent beaucoup d'activité d'insertion.
http://www.postgresql.org/docs/current/static/runtime-config-autovacuum.html
Je vais aussi essayer de baisser le
cost_delay
pour rendre l’aspiration plus agressive.Je peux aussi tester l'autovacuuming en utilisant pgbench.
http://wiki.postgresql.org/wiki/Pgbenchtesting
Exemple de conflit élevé:
Créer une base de données bench_replication
Exécuter pgbench
Vérifier l'état de l'autovacuuming
la source
Le script existant "qualifier pour autovacuum" est très utile, mais (comme indiqué correctement), il manquait des options spécifiques à la table. Voici une version modifiée de celle-ci qui prend en compte ces options:
la source