La version « beta 4 » des PostgreSQL est sortie fin août et la date de la première version stable approche à grands pas (normalement fin septembre).
Sortant tout juste d’une journée d’ateliers organisée par Dalibo, nous vous proposons une série d’articles visant à vous préparer à la transition.
Aujourd’hui, par exemple, nous allons voir comment installer une distribution binaire en version 10 à coté d’une version 9.6, puis nous ferons quelques tests et reviendrons sur les mesures de performances dont les résultats étaient loin de ceux annoncés.
Pas de panique : la version 10 apporte en effet des améliorations visibles sur les performances. Il y a un juste un piège avec la version béta et cela fausse les mesures.
Avec une introduction aussi accrocheuse, pas de doute : vous allez cliquer sur « lire la suite » !
Installation de PostgreSQL 10
Première chose : récupérer la définition des dépôts Yum pour les développeurs car Postgresql 10 n’est pas encore disponible sur les dépôts habituels :
wget https://download.postgresql.org/pub/repos/yum//testing/10/redhat/rhel-6-x86_64/pgdg-centos10-10-1.noarch.rpm yum install -y pgdg-centos10-10-1.noarch.rpm
Ensuite, installer les RPM :
yum install -y postgresql10 postgresql10-server postgresql10-contrib
Initialiser l’instance v10 à l’aide de la commande initdb après avoir configuré votre environnement :
su - postgres export PGDATA=/var/lib/pgsql/10/data export PATH=/usr/pgsql-10/bin:$PATH initdb pg_ctl start
Tester la connexion avec « psql ». Vous devez voir ceci :
-bash-4.2$ psql psql (10beta4) Saisissez « help » pour l'aide. postgres=# select version(); version ------------------------------------------------------------------------------------------------------ ------ PostgreSQL 10beta4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11), 6 4-bit (1 ligne)
Bienvenue dans le futur. Passons maintenant à l’installation de la 9.6.
Installation de Postgresql 9.6
Mêmes commandes, seules la version change.
Pour pouvoir démarrer deux instances côte à côte, il faut modifier le port d’écoute de la seconde.
wget https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-centos96-9.6-3.noarch.rpm yum install -y pgdg-centos96-9.6-3.noarch.rpm <span class="fontstyle0">yum install -y postgresql96 postgresql96-server postgresql96-contrib</span> export PGDATA=/var/lib/pgsql/9.6/data export PATH=/usr/pgsql-9.6/bin:$PATH export PGPORT=5433 initdb perl -pi.bak -e 's/#port = 5432/port = 5433/g' $PGDATA/postgresql.conf pg_ctl start
Reste à tester la connexion et la version :
-bash-4.2$ psql psql (9.6.5) Saisissez « help » pour l'aide. postgres=# select version(); version ------------------------------------------------------------------------------------------------------ ---- PostgreSQL 9.6.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11), 64- bit (1 ligne)
Nous voici donc avec nos deux instances installées et démarrées. Voyons comment elles se comportent.
Mesure des temps d’insertion
Dans chacune des instances, créer une base de test pour pgbench et l’initialiser :
psql> create database bench; psql> exit; shell> pgbench -i bench
Puis lancer un test pgbench en mode… hum… vigoureux :
pgbench bench -T 30 -j 4 -c 8 -r
Pour la v10, sur une VM de test, nous obtenons ce résultat (moyenne sur 10 exécutions) :
number of transactions actually processed: 19079 latency average = 12.587 ms tps = 635.577918 (including connections establishing) - statement latencies in milliseconds: 0.003 \set aid random(1, 100000 * :scale) 0.000 \set bid random(1, 1 * :scale) 0.001 \set tid random(1, 10 * :scale) 0.000 \set delta random(-5000, 5000) 0.360 BEGIN; 0.413 UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; 0.462 SELECT abalance FROM pgbench_accounts WHERE aid = :aid; 4.361 UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; 6.335 UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; 0.277 INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); 1.157 END;
Et pour la v9.6 :
number of transactions actually processed: 22728 latency average = 10.565 ms tps = 757.229589 (including connections establishing) tps = 757.498710 (excluding connections establishing) - statement latencies in milliseconds: 0.002 \set aid random(1, 100000 * :scale) 0.000 \set bid random(1, 1 * :scale) 0.000 \set tid random(1, 10 * :scale) 0.000 \set delta random(-5000, 5000) 0.230 BEGIN; 0.280 UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; 0.325 SELECT abalance FROM pgbench_accounts WHERE aid = :aid; 3.492 UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; 4.733 UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; 0.168 INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); 0.963 END;
Etrange : malgré les annonces et les mesures officielles, l’avantage de performance va à la 9.6. Pourquoi donc ?
Pourquoi est-ce plus lent ?
C’est toute la question, sachant que l’équipe de développement du projet PostgreSQL n’a pas l’habitude d’avancer des chiffres faux. C’est le privilège des gens qui ne cherchent pas à vendre à tout pris leur dernière version. Suivez mon regard.
L’explication est logique et vient du status de béta de la v10.
En comparant ligne à ligne les options de compilation des binaires v10 et v9.6, on remarque une grosse différence sur la v10 :
pg_config --configure | tr '\ ' '\n'
(…)
‘–enable-debug’
‘–enable-cassert’
(…)
Forcément, avec les options déboggage et de suivi des assertions ( c’est à dire de tous les tests booléens du programme), la V10 fait la course avec des chaussures en béton. Vu les circonstance, elle s’en tire plutôt bien.
Pour en avoir le cœur net, nous avons refait le benchmark avec une version compilée depuis les sources (vous trouverez la procédure de compilation sur ce site. C’est pour la version alpha4 mais le principe est identique) et les résultats sont nettement meilleurs, confirmant les gains de performance annoncés.
Conclusion
La prochaine version majeure de PostgreSQL arrive rapidement à maturation et laisse augurer un très bon cru.
Dans les prochains articles, nous verrons les améliorations du partitionnement (qui déplace les mécanismes de triggers pour les intégrer au noyau, apportant un gain de performance et une facilité accrue pour la mise en place) ainsi que la réplication logique, qui sera sûrement le gros morceau de cette version.
Au passage et en bonus, cet article a permis de revoir quelques commandes utiles pour l’installation et l’utilisation. C’est tout nous : généreux et serviables. Mais vous valez bien ça.
Des problèmes ? des questions ? Exprimez-vous ! Les commentaires sont ouverts. Coquilles et fautes de grammaires sont notre lot quotidien : signalez-les nous à m.capello@dbsqware.com