PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 15/10/2012 11:44:00

d_light
Membre

Interblocage requête select et process Vacuum postgres 8.2

Bonjour,

   De formation DBA Oracle et en mission sur Postgre que je découvre donc depuis peu je rencontre un phénomène qui ne me semble pas être anodin.

   J'ai une requête que l'on m'a demandé d'optimiser, chose faite je me rend compte que celle ci se retrouve bloqué dés q'un process vaccum devient actif (toutes les heures). J'ai lu que vacuum si il n'est pas full ne pose pas de lock, ma requête est un select et est donc supposé ne pas en mettre non plus; néanmoins d'autres requêtes ne semblent pas reproduire le même problème.

   Aussitôt le vacuum démarre (après test) aussitôt ma requête se bloque ainsi que le vaccum pour ne plus jamais répondre si l'on n'annule pas l'un ou l'autre, de plus a ce moment la j'utilise la commande Unix top je m'aperçois que le process Postgre consomme la totalité de la cpu de la machine (a ce moment la uniquement j'entend).

   Je suis en version 8.2, avez vous déjà rencontré ce problème ? Si oui pouvez m'aider à le diagnostiquer et résoudre ce problème ? Merci d'avance.

Cordialement,

Hors ligne

#2 15/10/2012 12:54:35

rjuju
Administrateur

Re : Interblocage requête select et process Vacuum postgres 8.2

Bonjour,

tout d'abord postgresql 8.2 n'est officiellement plus supporté, je vous conseillerais de migrer vers une version majeure plus récente au plus vite si vous en avez la possibilité.

Pour identifier les verrous lorsque la requête est bloquée, vous pouvez essayer cette requête, pour vérifier qu'elle est bien bloquée et non ralentie :

  select bl.pid as blocked_pid, a.usename as blocked_user,
        ka.current_query as blocking_statement, now() - ka.query_start as blocking_duration,
        kl.pid as blocking_pid, ka.usename as blocking_user, a.current_query as blocked_statement,
        now() - a.query_start as blocked_duration
 from pg_catalog.pg_locks bl
      join pg_catalog.pg_stat_activity a
      on bl.pid = a.procpid
      join pg_catalog.pg_locks kl
           join pg_catalog.pg_stat_activity ka
           on kl.pid = ka.procpid
      on bl.transactionid = kl.transactionid and bl.pid != kl.pid
 where not bl.granted;

Hors ligne

#3 17/10/2012 14:07:13

d_light
Membre

Re : Interblocage requête select et process Vacuum postgres 8.2

Merci,

  Je n'arrive plus a reproduire le probléme, j'ai malgré tout de gros ralentissements due au vacuum (plus du double du temps d'execution normale de la requête).

  Pour les locks durant toute la période ou la requête et le process vacuum s'execute je n'en ai constaté aucun. Personne n'a donc constaté des soucis similaires ?

   Enfin pour la version 9 j'entend, malheureusement et pour des raisons historiques ce n'est pas l'ordre du jour.

Cordialement,

Hors ligne

#4 17/10/2012 15:29:53

rjuju
Administrateur

Re : Interblocage requête select et process Vacuum postgres 8.2

L'autovacuum ne bloque normalement pas le bon fonctionnement de la base. Si des ralentissements se font sentir lorsqu'il tourne, vous pouvez essayer de le rendre moins agressif (augmenter autovacuum_vacuum_cost_delay par exemple), ou augmenter le paramètre maintenance_ork_mem. Il faudrait aussi regarder du coté du système, voir si le problème ne viendrait pas de mauvaises performances sur les disques.

Hors ligne

#5 18/10/2012 14:59:43

d_light
Membre

Re : Interblocage requête select et process Vacuum postgres 8.2

Ok c'est réglé, merci. En jouant avec les paramétres du vacuum et en faisant plusieurs essais j'atteins quelque chose de vraiment stable.

Hors ligne

Pied de page des forums