199 votes

Optimiser PostgreSQL pour des tests rapides

Je suis de commutation de PostgreSQL à partir de SQLite un exemple d'application Rails.

Le problème est que les spécifications devient lent avec PG.
Sur SQLite il a fallu ~34 secondes, sur PG c'est ~76 secondes qui est plus de 2x plus lent.

Alors maintenant, je veux appliquer quelques techniques pour apporter de la performance de l'specs sur le pair avec SQLite avec pas de modifications de code (idéalement juste en définissant les options de connexion, ce qui n'est probablement pas possible).

Couple de choses évidentes à partir du haut de ma tête sont:

  • Disque RAM (bon programme d'installation avec RSpec sur OSX serait bon de voir)
  • Tables non exploitées (peut-il être appliqué sur l'ensemble de la base de données donc je n'ai pas changer tous les scripts?)

Comme vous l'avez compris, je n'aime pas à propos de la fiabilité et le reste (la bd est tout simplement un jetable truc ici).
J'ai besoin d'obtenir les la plupart hors de la page et de le rendre aussi rapide qu'il pourrait l'être.

Meilleure réponse , l'idéal serait de décrire les astuces pour ce faire, le programme d'installation et les inconvénients de ces astuces.

Mise à JOUR: fsync = off + full_page_writes = off seulement de la diminution du temps de ~65 secondes (~-16 secs). Bon début, mais loin de la cible de 34.

Mise à JOUR 2: j'ai essayé d'utiliser le disque RAM mais le gain de performance est à l'intérieur d'une marge d'erreur. Donc, ne semble pas en valoir la peine.

Mise à JOUR 3:* J'ai trouvé le plus gros goulot d'étranglement et maintenant mes specs courir aussi vite que l'SQLite.

La question a été à la base de données nettoyage de la troncature. Apparemment, SQLite est trop rapide.

Pour le "réparer" j'ai ouvert une transaction avant chaque test et de rouler de nouveau à la fin.

Quelques chiffres pour ~700 tests.

  • Troncature: SQLite - 34s, PG - 76s.
  • Transaction: SQLite - 17, PG - 18.

2x augmentation de la vitesse pour SQLite. 4x augmenter la vitesse de PG.

9voto

Ondrej Ivanic Points 1010

Utiliser différentes mise en page du disque:

  • autre disque pour $PGDATA
  • autre disque pour $PGDATA/pg_xlog
  • disque différent pour le tem fichiers (par la base de données $PGDATA/base//pgsql_tmp) (voir la note sur work_mem)

postgresql.conf tweaks:

  • shared_memory: 30% de la mémoire RAM disponible, mais pas plus de 6 à 8 go. Il semble préférable d'avoir moins de mémoire partagée (2 GO - 4 GO) pour écrire les charges de travail intensives
  • work_mem: surtout pour les requêtes select avec des tris/agrégations. C'est par le réglage de la connexion et de la requête peut attribuer de la valeur à plusieurs reprises. Si les données ne peuvent pas s'adapter ensuite le disque est utilisé (pgsql_tmp). Cochez la case "explain analyze" pour voir combien de mémoire avez-vous besoin
  • fsync et synchronous_commit: les valeurs par Défaut sont sans danger, mais Si vous pouvez tolérer la perte de données, alors vous pouvez activer puis désactiver
  • random_page_cost: si vous avez des disques SSD ou rapide de la matrice RAID, vous pouvez réduire ce 2.0 (RAID) ou même plus bas (1.1) pour le SSD
  • checkpoint_segments: vous pouvez aller plus 32 ou 64 et changement checkpoint_completion_target à 0,9. Valeur inférieure permet le plus rapidement possible après l'accident de récupération

Je pense que c'est tout pour l'instant...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X