PostgreSQL.Slow Préparez la transaction et commettre préparé
-
13-12-2019 - |
Question
Je viens de rencontrer un problème étrange.J'ai fait un rapport à Pgfourine et j'ai découvert que mes transactions XA commencèrent à travailler vraiment lentement.Préparer une transaction et leur validation préparées combinées ont pris 12,55 sînés sur 13,2.Mais pourquoi?
##### Overall statistics #####
Number of unique normalized queries: 175
Number of queries: 268,772
Total query duration: 13m2s
##### Queries by type #####
SELECT: 116493 43.3%
INSERT: 15926 5.9%
UPDATE: 7935 3.0%
DELETE: 4923 1.8%
##### Queries that took up the most time (N) #####
1) 6m32s - 26,338 - COMMIT PREPARED ''
--
2) 6m23s - 25,972 - PREPARE TRANSACTION ''
--
3) 0.6s - 3,848 - update avatar set lfa_position=NULL where Id=0
.....
7) 0.3s - 21,514 - COMMIT
.....
J'ai une théorie mais n'ai pas de preuve .. J'ai des disques lents et j'ai désactivé synchronous_commit.Peut-être que PostgreSQL doit faire un FSYNC pendant "Préparer une transaction" même si Synchronous_Commit est désactivé?
fsync = on
synchronous_commit = off
Des idées?
mêmes tests avec
fsync = off
synchronous_commit = off
##### Overall statistics #####
Number of unique normalized queries: 155
Number of queries: 186,838
Total query duration: 6.6s
##### Queries by type #####
SELECT: 84367 45.2%
INSERT: 9197 4.9%
UPDATE: 5486 2.9%
DELETE: 2996 1.6%
##### Queries that took up the most time (N) #####
1) 1.8s - 16,972 - PREPARE TRANSACTION ''
--
2) 1.1s - 16,965 - COMMIT PREPARED ''
--
3) 0.4s - 2,904 - update avatar set lfa_position=NULL where Id=0
--
4) 0.2s - 16,031 - COMMIT
ressemble à FSYNC a pris beaucoup de temps, mais pas tout le temps.16k commits - 0.2sec, 17k préparer + commit 2.9Sec.
histoire triste.On dirait que XA commettre prend 15 fois plus de temps que la commission locale et ne prend pas en compte Synchronous_commit.FSYNC= OFF n'est pas sûr pour une utilisation de la production.Donc, si je veux utiliser XA transactions, je dois l'utiliser avec soin et utiliser un bon lecteur SSD avec des iops élevés.
La solution
La théorie que PREPARE TRANSACTION
est immédiatement synchronisé est correct et il est mentionné dans la doc:
extrait de http://www.postgresql.org/Docs / 9.1 / statique / wal-async-commit.html :
Les commandes prennent en charge une validation en deux phases, telles que la transaction préparatoire, sont également toujours synchrones.