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 21/09/2011 16:05:55

7uc0
Membre

Investigation :: Bonnes pratiques

Bonjour la communauté,

Pour mon premier post sur le forum que je suis de plus en plus près, je voudrais en savoir plus sur les bonnes pratiques à adopter sur une base postgresql en souffrance.

J'ai une bdd en version 8.4.7 sous ubuntu 9.10 dont le dump répresente 1.5 Go (de taille normale imho),

Après l'installation de base, j'ai isolé l'ensemble des data sur une partition disque différente de la partition système (c'est d'ailleur la seule modif apportée au fichier postgresql.conf)

Le contexte

-l'applicatif tourne sur la même machine (gandi 2 coeurs 1 Go de ram, 512 Mo pour l'appli JEE) et exploite c3p0 pour pooler les connections
-la base est sollicitée quotidiennement sur une période relativement courte (23h00 - 3h00) notamment pour de l'injection de données dans une table (en moyenne 5 - 9M d'enregistrements quotidien sur cette table, avec une rotation de 2 semaines, soit à peu près 110 - 120 M d'enregistrements)

La maintenance opérationnelle

Les opérations suivantes sont réalisées quotidiennement ou hebdomadairement
- dump complet (via backup-manager)
- observation des logs (rien à observer à part des evènements fataux, la configuration étant vierge)
- sur la base des stats applicatives (temps min / max /moyen de traitement d'une requête http) => isolation des n requêtes http les plus lentes => recensement des requêtes SQL => explain sur ces requêtes => correctif applicatif (reformulation de la requête, découpage fonctionnel différent) ou ajout d'index.

Les symptômes

La stack appli / BDD tourne "normalement" (temps de réponse utilisateur acceptable) depuis 18 mois maintenant, j'observe cependant depuis quelques jours des timeouts http sur des accès en consultation de données. En regardant de plus près, je constate que l'activité appli est nulle, et l'activité bdd un plus importante 3.8 - 4% cpu max, sans plus.

l'affichage des processus postgres (ps -ef ...) me retourne plusieurs (mais pas tous) processus en INSERT waiting et un ou deux en SELECT

l'affichage détaillé sous psql (http://www.lunatech-research.com/archiv … greSQL-tid) m'informe des transactions en cours, mais j'avoue que je ne sais pas trop quoi en conclure du point de vue bdd

Je constate enfin que l'utilisation de pg_cancel_backend (http://www.postgresonline.com/journal/a … -Ends.html) me permet de débloquer la situation, temporairement.

Merci de m'avoir lu jusque là !

Alors je me permets de poster pour :
1 - avoir vos commentaires conseils sur la methodo suivie pour déployer et maintenir la base en l'état.
2 - connaître l'approche la plus efficace pour addresser ce type de comportements observés, mais du point de vue DB (rendre les logs plus verbeux, executer des traitements de maintenance, embaucher un vrai dba...)

Je tiens à préciser que je ne suis pas dbA, ni développeur, ni ingé sys, mais un peu de tout ca au sein de ma petite pme.

Merci pour vos commentaires et conseils

E.

Hors ligne

#2 21/09/2011 16:58:29

gleu
Administrateur

Re : Investigation :: Bonnes pratiques

Le déploiement de la base semble bon, quoiqu'il pourrait être facilement amélioré, notamment par la configuration de PostgreSQL. Néanmoins, cela ne devrait pas corriger le problème que vous avez. Pour traiter votre problème de blocage, et notamment les INSERT en waiting, il faudrait nous fournir plus d'informations pour qu'on puisse vous aider. Notamment avoir le contenu de pg_stat_activity (qui vous indique les INSERT en waiting) pourrait nous mettre sur la piste.

En gros, vous avez un processus qui bloque une partie des autres processus et le but est de trouver lequel et ce qu'il fait pour les bloquer. La solution se trouve dans pg_stat_activity et pg_locks. Et le problème est certainement dû à l'application et non à PostgreSQL.


Guillaume.

Hors ligne

#3 21/09/2011 16:59:10

arthurr
Membre

Re : Investigation :: Bonnes pratiques

Bonjour,

Que donne un "select * from pg_stat_activity;" lorsque la base "bloque" ?
Avez vous des erreurs dans vos logs (Deadlock) ?
Quand vous observez le % de CPU utilisé, qu'avez vous en %wa ?

Remarques concernant les actions de maintenance :
1/ temps min / max /moyen de traitement d'une requête http => log_min_duration du fichier postgresql permet de logger les requêtes trop longues
2/ Quid des vacuum / analyse ?

select
	current_database(),
	schemaname || '.' || relname as table,
	to_char(last_vacuum,'DD-MM-YYYY HH24:mi') as lastvacuum,
	to_char(last_autovacuum,'DD-MM-YYYY HH24:mi') as lastautovacuum,
	to_char(last_analyze,'DD-MM-YYYY HH24:mi') as lastanalyze,
	to_char(last_autoanalyze,'DD-MM-YYYY HH24:mi') as lastautoanalyze
from
	pg_stat_user_tables
order by
	2

Hors ligne

#4 21/09/2011 17:40:45

7uc0
Membre

Re : Investigation :: Bonnes pratiques

Merci pour ces retours,

J'ai en ce moment même la sortie ps  qui me rend ceci

postgres 11328     1  0 08:48 ?        00:00:01 /usr/lib/postgresql/8.4/bin/postgres -D /srv/sdhost-app/pgdata/main -c config_file=/etc/postgresql/8.4/main/postgresql.conf
postgres 11331 11328  0 08:48 ?        00:00:06 postgres: writer process                                                                                                   
postgres 11332 11328  0 08:48 ?        00:00:01 postgres: wal writer process                                                                                               
postgres 11333 11328  0 08:48 ?        00:00:01 postgres: autovacuum launcher process                                                                                      
postgres 11334 11328  0 08:48 ?        00:00:03 postgres: stats collector process                                                                                          
postgres 11710 11328  0 09:01 ?        00:00:00 postgres: sensor sensordb1 127.0.0.1(35923) idle                                                                           
postgres 11711 11328  0 09:01 ?        00:00:00 postgres: sensor sensordb1 127.0.0.1(35924) idle                                                                           
postgres 11914 11328  0 09:26 ?        00:00:52 postgres: sensor sensordb1 127.0.0.1(51881) idle                                                                           
postgres 11915 11328  0 09:26 ?        00:00:00 postgres: sensor sensordb1 127.0.0.1(51882) idle                                                                           
postgres 11917 11328  0 09:26 ?        00:00:00 postgres: sensor sensordb1 127.0.0.1(51884) idle                                                                           
postgres 11918 11328  0 09:26 ?        00:00:00 postgres: sensor sensordb1 127.0.0.1(51885) idle                                                                           
postgres 11920 11328  0 09:26 ?        00:00:00 postgres: sensor sensordb1 127.0.0.1(51887) idle                                                                           
postgres 13297 11328  0 12:42 ?        00:00:06 postgres: sensor sensordb1 127.0.0.1(39026) idle                                                                           
postgres 13298 11328  0 12:42 ?        00:00:00 postgres: sensor sensordb1 127.0.0.1(39027) idle                                                                           
postgres 13299 11328  0 12:42 ?        00:00:00 postgres: sensor sensordb1 127.0.0.1(39028) idle                                                                           
postgres 13302 11328  0 12:42 ?        00:00:07 postgres: sensor sensordb1 127.0.0.1(39031) idle                                                                           
postgres 13304 11328  0 12:42 ?        00:00:48 postgres: sensor sensordb1 127.0.0.1(39033) idle                                                                           
postgres 16205 11328  0 13:22 ?        00:00:00 postgres: sensor sensordb1 127.0.0.1(39690) idle                                                                           
postgres 16206 11328  0 13:22 ?        00:00:31 postgres: sensor sensordb1 127.0.0.1(39691) INSERT waiting                                                                 
postgres 16207 11328  0 13:22 ?        00:00:26 postgres: sensor sensordb1 127.0.0.1(39692) SELECT

J'en conclus après plusieurs secondes d'attente qu'un cas de blocage est en cours

@Arthurr
-pas d'erreur de deadlock dans les logs
-what is %wa ? un top me sort ceci

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                                                                      
16207 postgres  20   0 51864  39m  35m D    4  3.8   0:30.26 postgres

Voici ce qui ressort de la consultation de pg_stat_activity

select procpid, waiting, xact_start, query_start, backend_start from pg_stat_activity;

procpid | waiting |          xact_start           |          query_start          |         backend_start         
---------+---------+-------------------------------+-------------------------------+-------------------------------
   13304 | f       |                               | 2011-09-21 15:17:22.03169+00  | 2011-09-21 12:42:37.973344+00
   16963 | f       | 2011-09-21 15:17:57.914497+00 | 2011-09-21 15:17:57.914497+00 | 2011-09-21 15:14:11.88781+00
   13297 | f       |                               | 2011-09-21 15:12:19.089292+00 | 2011-09-21 12:42:37.892173+00
   13298 | f       |                               | 2011-09-21 13:22:58.327495+00 | 2011-09-21 12:42:37.895526+00
   13299 | f       |                               | 2011-09-21 13:22:58.326579+00 | 2011-09-21 12:42:37.898187+00
   16206 | t       | 2011-09-21 15:09:43.672439+00 | 2011-09-21 15:09:45.756467+00 | 2011-09-21 13:22:57.775099+00 
   16207 | f       | 2011-09-21 14:57:49.827326+00 | 2011-09-21 14:57:50.002233+00 | 2011-09-21 13:22:57.775471+00
   16297 | f       |                               | 2011-09-21 14:19:38.789846+00 | 2011-09-21 13:38:07.210547+00
   13302 | f       |                               | 2011-09-21 13:22:57.883614+00 | 2011-09-21 12:42:37.952311+00
   16205 | f       |                               | 2011-09-21 13:22:57.930659+00 | 2011-09-21 13:22:57.773747+00
   11711 | f       |                               | 2011-09-21 09:26:04.449413+00 | 2011-09-21 09:01:04.774461+00
   11710 | f       |                               | 2011-09-21 09:26:04.439868+00 | 2011-09-21 09:01:04.774133+00
   11914 | f       |                               | 2011-09-21 12:42:13.09521+00  | 2011-09-21 09:26:03.21994+00
   11915 | f       |                               | 2011-09-21 09:26:04.43964+00  | 2011-09-21 09:26:03.221895+00
   11917 | f       |                               | 2011-09-21 09:26:04.444564+00 | 2011-09-21 09:26:03.356444+00
   11918 | f       |                               | 2011-09-21 09:26:03.366232+00 | 2011-09-21 09:26:03.363535+00
   11920 | f       |                               | 2011-09-21 09:26:03.369445+00 | 2011-09-21 09:26:03.366658+00

procpid 16963 : select procpid, waiting, xact_start, query_start...
procpid 16206 : insert into snsrRecord
procpid 16207 : select record0_.id as ..... from snsrRecord where  record0_ where  ... (plusieurs critères, dont deux sur des tables liées et une temporelle - recorddate between X an Y)

Enfin le statut sur l'état des operations de maintenance interne

 current_database |            table             |    lastvacuum    |  lastautovacuum  |   lastanalyze    | lastautoanalyze  
------------------+------------------------------+------------------+------------------+------------------+------------------
 sensordb1        | public.databasechangelog     | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.databasechangeloglock | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.patchlevel            | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrbinding           | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrbroadcast         | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 20-09-2011 19:08
 sensordb1        | public.snsrcfgvar            | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 30-08-2011 15:01
 sensordb1        | public.snsrcmd               | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrcmd_args          | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrcomdqueue         | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrconsolidation     | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrcustomer          | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrdevice            | 06-09-2011 08:00 | 21-09-2011 00:08 | 06-09-2011 08:00 | 21-09-2011 05:37
 sensordb1        | public.snsrdevicecfg         | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrdevicetypeassoc   | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrexport            | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrfactorytest       | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrfactorytest_tests | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 19-09-2011 17:34
 sensordb1        | public.snsrmember            | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrmemberprofile     | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrmetric            | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrmetricvar         | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrmodeldef          | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrnode              | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsroperation         | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrorganisation      | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrpackage           | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrpermassign        | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrpicture           | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrprobalert         | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 15-09-2011 09:48
 sensordb1        | public.snsrprobcond          | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrprobe             | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrprobecfg          | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrproduct           | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrprofile           | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrprop              | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrrecord            | 06-09-2011 08:07 | 20-09-2011 23:11 | 06-09-2011 08:10 | 18-09-2011 01:52
 sensordb1        | public.snsrrelease           | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrsite              | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrsiteway           | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrstatusvar         | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrsystem            | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrtargetmetric      | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrtypedef           | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrvariable          | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrvendor            | 06-09-2011 08:00 |                  | 06-09-2011 08:00 | 
 sensordb1        | public.snsrversion           | 06-09-2011 08:00 |                  | 06-09-2011 08:00 |

Les récentes occurence de vaccum / analyse semblent en phase avec les tables les plus régulièrement sollicitées au niveau applicatif

Je modifie la conf pour tracer les requêtes de plus de X ms

E.

Hors ligne

#5 21/09/2011 20:51:37

gleu
Administrateur

Re : Investigation :: Bonnes pratiques

Alors, le processus qui exécute le INSERT est bien en attente d'un verrou. Pour savoir quel verrou, il faut trouver le processus qui le bloque. Ici, il semble que ce soit le SELECT car tous les autres processus indiquent idle. Il faudrait regarder le contenu de la table pg_locks. La prochaine fois que cela se produit, pouvez-vous fournir le contenu complet de pg_stat_activity (en fait il manque surtout la colonne current_query) ainsi que le contenu complet de pg_locks ? Merci.


Guillaume.

Hors ligne

#6 22/09/2011 11:17:55

7uc0
Membre

Re : Investigation :: Bonnes pratiques

Bonjour Guillaume,

pour des questions de lisibilité, les requêtes sont partielles

select procpid, waiting, xact_start, case when length(current_query) > 40 then substring(current_query for 20) || '...' || substring(current_query from (length(current_query) - 19) for 20) else current_query end as query,query_start, backend_start from pg_stat_activity;


---------+---------+-------------------------------+---------------------------------------------+-------------------------------+-------------------------------
   24994 | f       |                               | <IDLE>                                      | 2011-09-22 08:50:55.843264+00 | 2011-09-22 08:40:39.864567+00
   17706 | f       |                               | <IDLE>                                      | 2011-09-21 16:10:59.431737+00 | 2011-09-21 16:10:59.219198+00
   17707 | f       |                               | <IDLE>                                      | 2011-09-21 16:10:59.431568+00 | 2011-09-21 16:10:59.222115+00
   17708 | f       |                               | <IDLE>                                      | 2011-09-21 16:10:59.437048+00 | 2011-09-21 16:10:59.433722+00
   17709 | f       |                               | <IDLE>                                      | 2011-09-21 16:10:59.439149+00 | 2011-09-21 16:10:59.436508+00
   17710 | f       |                               | <IDLE>                                      | 2011-09-21 16:10:59.442018+00 | 2011-09-21 16:10:59.4399+00
   17711 | f       |                               | <IDLE>                                      | 2011-09-22 01:54:12.438279+00 | 2011-09-21 16:10:59.442741+00
   17713 | f       |                               | <IDLE>                                      | 2011-09-22 08:40:30.040956+00 | 2011-09-21 16:10:59.447902+00
   17715 | f       |                               | <IDLE>                                      | 2011-09-22 08:40:27.187039+00 | 2011-09-21 16:10:59.451399+00
   17719 | f       |                               | <IDLE>                                      | 2011-09-22 01:54:14.501713+00 | 2011-09-21 16:10:59.460876+00
   24989 | f       |                               | <IDLE>                                      | 2011-09-22 08:40:39.851391+00 | 2011-09-22 08:40:39.7986+00
   24990 | f       |                               | <IDLE>                                      | 2011-09-22 08:40:39.851561+00 | 2011-09-22 08:40:39.801836+00
   24991 | f       | 2011-09-22 08:50:31.70157+00  | select record0_.id a...ord0_.recorddate asc | 2011-09-22 08:50:31.814156+00 | 2011-09-22 08:40:39.804197+00
   24992 | t       | 2011-09-22 08:51:34.493436+00 | insert into snsrReco... $3, $4, $5, $6, $7) | 2011-09-22 08:51:36.27359+00  | 2011-09-22 08:40:39.852488+00
   24993 | f       |                               | <IDLE>                                      | 2011-09-22 08:40:40.254967+00 | 2011-09-22 08:40:39.854626+00

les deux requêtes en détails :

select record0_.id as id13_, record0_.broadcast_id as broadcast4_13_, record0_.owner_id as owner5_13_, record0_.recorddate as recorddate13_, record0_.recordvalue as recordva3_13_, record0_.recordvar_id as recordvar6_13_, record0_.target_id as target7_13_ from snsrRecord record0_ where record0_.recordvar_id=$1 and record0_.owner_id=$2 and (record0_.recorddate between $3 and $4) order by record0_.recorddate asc

Et

insert into snsrRecord (broadcast_id, owner_id, recorddate, recordvalue, recordvar_id, target_id, id) values ($1, $2, $3, $4, $5, $6, $7)

Structurellement, la table snsrRecord est liée à plusieurs tables :

    Column    |            Type             | Modifiers 
--------------+-----------------------------+-----------
 id           | bigint                      | not null
 recorddate   | timestamp without time zone | 
 recordvalue  | character varying(255)      | 
 broadcast_id | bigint                      | 
 owner_id     | bigint                      | 
 recordvar_id | bigint                      | 
 target_id    | bigint                      | 
Indexes:
    "snsrrecord_pkey" PRIMARY KEY, btree (id)
    "idx_record_broadcast" btree (broadcast_id)
    "idx_record_bug117" btree (owner_id, recordvar_id, recorddate)
    "idx_record_owner" btree (owner_id)
    "idx_record_recorddate" btree (recorddate)
    "idx_record_target" btree (target_id)
    "idx_record_var" btree (recordvar_id)
Foreign-key constraints:
    "fk_record_broadcast" FOREIGN KEY (broadcast_id) REFERENCES snsrbroadcast(id)
    "fk_record_owner" FOREIGN KEY (owner_id) REFERENCES snsrdevice(id)
    "fk_record_target" FOREIGN KEY (target_id) REFERENCES snsrdevice(id)
    "fk_record_var" FOREIGN KEY (recordvar_id) REFERENCES snsrvariable(id)

Et côté pg_locks, voici ce que me sort la requête suivante (select (*) me renvoie plus de 300 enregistrements):

select
 locktype, database, relation, page, tuple, transactionid, virtualtransaction, mode, granted,
 relname, relkind,
 datname, usename,
 case
  when length(current_query) > 40
    then substring(current_query for 20) || '...'
         || substring(current_query from (length(current_query) - 19) for 20)
  else current_query
 end as query,
 waiting, query_start, client_addr, client_port
from pg_locks
 left outer join pg_class on oid = relation
 left outer join pg_stat_activity on pid = procpid
order by pid;

Résultat (ne porte que sur le select, j'ai du procéder à un nouveau "déblocage"):

   locktype    | database | relation | page | tuple | transactionid | virtualtransaction |       mode       | granted | relname | relkind |  datname  | usename |                    query                    | waiting |          query_start          | client_addr | client_port 
---------------+----------+----------+------+-------+---------------+--------------------+------------------+---------+---------+---------+-----------+---------+---------------------------------------------+---------+-------------------------------+-------------+-------------
 relation      |    26166 |    26346 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27593 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27538 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27615 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27557 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26549 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |  1528078 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26555 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26551 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26523 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26358 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |  1528075 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26385 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26385 |      |       |               | 1/5452             | RowExclusiveLock | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |  1528077 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 transactionid |          |          |      |       |       2275951 | 1/5452             | ExclusiveLock    | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27550 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    28020 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27558 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27559 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26553 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26361 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26507 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26259 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26491 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 virtualxid    |          |          |      |       |               | 1/5452             | ExclusiveLock    | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27563 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26543 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27551 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27551 |      |       |               | 1/5452             | RowExclusiveLock | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26391 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27546 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27543 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |  1528073 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26559 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27539 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27535 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26505 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26265 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27537 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27545 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26295 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |  1528074 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27549 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26379 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27536 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26557 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26557 |      |       |               | 1/5452             | RowExclusiveLock | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26367 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26373 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27617 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27514 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27547 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |  1528076 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27548 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26521 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27592 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    27616 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26280 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26513 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068
 relation      |    26166 |    26298 |      |       |               | 1/5452             | AccessShareLock  | t       |         |         | sensordb1 | sensor  | select record0_.id a...ord0_.recorddate asc | f       | 2011-09-22 09:05:13.962259+00 | 127.0.0.1   |       60068

Mon interprétation

En l'état, la lecture des données de la table snsrRecord prend un temps infini et est à l'origine du blocage progressif des autres requêtes (insertion, maj). J'avais dans l'idée de partir sur un explain de la requête en question pour comprendre l'origine de la lenteur, qu'est ce que je dois comprendre de la sortie précedente concernant les nombreux locks rien que sur la lecture ?

Merci encore

Hors ligne

#7 22/09/2011 11:37:03

Marc Cousin
Membre

Re : Investigation :: Bonnes pratiques

Sous PostgreSQL, un lecteur ne bloque pas un écrivain, et un écrivain ne bloque pas un lecteur (PostgreSQL est MVCC http://docs.postgresql.fr/9.0/mvcc.html)

Il est donc peu probable qu'une lecture qui prend un temps infini bloque même des updates. Du moins pas dans un cas normal (il faudrait un SELECT qui verrouille des enregistrements, donc soit un SELECT FOR UPDATE, soit un SELECT qui appelle une procédure stockée qui fait des mises à jour ou des LOCK TABLE).

Il faut vraiment le contenu de pg_lock entier… là il n'y a pas d'enregistrement avec granted à false. Et vérifier aussi qu'il y a bien une requête en waiting à 't' dans pg_stat_activity. Sinon, il n'y aura de toutes façons pas d'enregistrement de pg_lock avec un granted à false.

Les verrous qu'on voit ici sont
- soit des accessshare, qui empêchent simplement la prise de verrou exclusif par une autre transaction sur l'objet (une table vraisemblablement), histoire que l'opération en cours puisse se faire (un select par exemple)
- soit des exclusive sur des transactions ou des transactions virtuelles, c'est ce qui est utilisé pour qu'une transaction en attende une autre (quand le moteur voit par exemple qu'une session a besoin de savoir ce qu'une autre a fait avant de pouvoir continuer… un update bloqué par un autre par exemple)
- un rowexclusive, qui indique que sur cet objet, il y a une mise à jour. ça empêche d'autres sessions de faire des vacuum full, truncate, create index, alter table sur cette table tant que le verrou est tenu

Donc rien que du normal. Aucun de ces verrous (malgré le nom rowexclusive) n'est un verrou d'enregistrement.


Marc.

Hors ligne

#8 22/09/2011 11:56:03

7uc0
Membre

Re : Investigation :: Bonnes pratiques

Merci Marc, je tombe les pg_lock alors

J'ai un select et 3 inserts waiting

postgres 17687     1  0 Sep21 ?        00:00:02 /usr/lib/postgresql/8.4/bin/postgres -D /srv/sdhost-app/pgdata/main -c config_file=/etc/postgresql/8.4/main/postgresql.conf
postgres 17689 17687  0 Sep21 ?        00:00:17 postgres: writer process                                                                                                   
postgres 17690 17687  0 Sep21 ?        00:00:05 postgres: wal writer process                                                                                               
postgres 17691 17687  0 Sep21 ?        00:00:03 postgres: autovacuum launcher process                                                                                      
postgres 17692 17687  0 Sep21 ?        00:00:06 postgres: stats collector process                                                                                          
postgres 17706 17687  0 Sep21 ?        00:00:00 postgres: sensor sensordb1 127.0.0.1(49816) idle                                                                           
postgres 17707 17687  0 Sep21 ?        00:00:00 postgres: sensor sensordb1 127.0.0.1(49817) idle                                                                           
postgres 17710 17687  0 Sep21 ?        00:00:15 postgres: sensor sensordb1 127.0.0.1(49820) INSERT waiting                                                                 
postgres 17711 17687  0 Sep21 ?        00:00:00 postgres: sensor sensordb1 127.0.0.1(49821) idle                                                                           
postgres 17713 17687  0 Sep21 ?        00:00:55 postgres: sensor sensordb1 127.0.0.1(49823) idle                                                                           
postgres 17715 17687  0 Sep21 ?        00:00:32 postgres: sensor sensordb1 127.0.0.1(49825) idle                                                                           
postgres 17719 17687  0 Sep21 ?        00:03:53 postgres: sensor sensordb1 127.0.0.1(49829) idle                                                                           
postgres 25278 17687  0 09:03 ?        00:00:11 postgres: sensor sensordb1 127.0.0.1(60064) idle                                                                           
postgres 25279 17687  0 09:03 ?        00:00:00 postgres: sensor sensordb1 127.0.0.1(60065) idle                                                                           
postgres 25280 17687  0 09:03 ?        00:00:02 postgres: sensor sensordb1 127.0.0.1(60066) idle                                                                           
postgres 25281 17687  0 09:03 ?        00:00:04 postgres: sensor sensordb1 127.0.0.1(60067) SELECT                                                                         
postgres 25634 25579  0 09:39 pts/2    00:00:00 /usr/lib/postgresql/8.4/bin/psql
postgres 25636 17687  0 09:39 ?        00:00:01 postgres: sensor sensordb1 127.0.0.1(54385) INSERT waiting                                                                 
postgres 25637 17687  0 09:39 ?        00:00:00 postgres: sensor sensordb1 127.0.0.1(54386) idle                                                                           
postgres 25638 17687  0 09:39 ?        00:00:00 postgres: sensor sensordb1 127.0.0.1(54387) idle                                                                           
postgres 25639 17687  0 09:39 ?        00:00:00 postgres: sensor sensordb1 127.0.0.1(54388) INSERT waiting                                                                 
postgres 25651 17687  0 09:41 ?        00:00:00 postgres: postgres sensordb1 [local] idle
   locktype    | database | relation | page | tuple | virtualxid | transactionid | classid | objid | objsubid | virtualtransaction |  pid  |       mode       | granted 
---------------+----------+----------+------+-------+------------+---------------+---------+-------+----------+--------------------+-------+------------------+---------
 relation      |    26166 |    27586 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26543 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26553 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    27551 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26379 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26555 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26361 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26551 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26358 |      |       |            |               |         |       |          | 1/5474             | 25639 | RowExclusiveLock | t
 relation      |    26166 |  1528075 |      |       |            |               |         |       |          | 1/5474             | 25639 | RowExclusiveLock | t
 virtualxid    |          |          |      |       | 5/136      |               |         |       |          | 5/136              | 25716 | ExclusiveLock    | t
 relation      |    26166 |    27536 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26507 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26259 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26259 |      |       |            |               |         |       |          | 6/144              | 17710 | RowShareLock     | t
 relation      |    26166 |    26491 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    27563 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |  1528078 |      |       |            |               |         |       |          | 1/5474             | 25639 | RowExclusiveLock | t
 relation      |    26166 |    26543 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26549 |      |       |            |               |         |       |          | 1/5474             | 25639 | RowExclusiveLock | t
 relation      |    26166 |    26553 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    27551 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26361 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26557 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26557 |      |       |            |               |         |       |          | 14/4861            | 25281 | RowExclusiveLock | t
 relation      |    26166 |    26507 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26259 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26259 |      |       |            |               |         |       |          | 18/75              | 25636 | RowShareLock     | t
 relation      |    26166 |    26491 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    27563 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26367 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26373 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26385 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26385 |      |       |            |               |         |       |          | 6/144              | 17710 | RowShareLock     | t
 relation      |    26166 |    27617 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27550 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    27514 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27547 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27557 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |  1528076 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27548 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |  1528077 |      |       |            |               |         |       |          | 6/144              | 17710 | RowExclusiveLock | t
 relation      |    26166 |    27558 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    27559 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26521 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27592 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    16385 |     1259 |      |       |            |               |         |       |          | 8/2579             | 25717 | AccessShareLock  | t
 relation      |    26166 |    26385 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26385 |      |       |            |               |         |       |          | 18/75              | 25636 | RowShareLock     | t
 relation      |    26166 |    27538 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    27550 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    27615 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 virtualxid    |          |          |      |       | 18/75      |               |         |       |          | 18/75              | 25636 | ExclusiveLock    | t
 relation      |    26166 |    27616 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26280 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26513 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 transactionid |          |          |      |       |            |       2275997 |         |       |          | 1/5474             | 25639 | ExclusiveLock    | t
 relation      |    26166 |    26346 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26298 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |  1528077 |      |       |            |               |         |       |          | 18/75              | 25636 | RowExclusiveLock | t
 relation      |    26166 |    27558 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    27559 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 transactionid |          |          |      |       |            |       2276003 |         |       |          | 18/75              | 25636 | ExclusiveLock    | t
 relation      |    26166 |  1528078 |      |       |            |               |         |       |          | 18/75              | 25636 | RowExclusiveLock | t
 relation      |    26166 |    27586 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26543 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26549 |      |       |            |               |         |       |          | 6/144              | 17710 | RowExclusiveLock | t
 relation      |    26166 |    27551 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26555 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26551 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 transactionid |          |          |      |       |            |       2276025 |         |       |          | 6/144              | 17710 | ExclusiveLock    | t
 relation      |    26166 |    26391 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26358 |      |       |            |               |         |       |          | 18/75              | 25636 | RowExclusiveLock | t
 relation      |    26166 |    27546 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |  1528075 |      |       |            |               |         |       |          | 18/75              | 25636 | RowExclusiveLock | t
 relation      |    26166 |    27543 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26507 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26259 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26259 |      |       |            |               |         |       |          | 1/5474             | 25639 | RowShareLock     | t
 relation      |    26166 |    26491 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    27563 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |  1528078 |      |       |            |               |         |       |          | 6/144              | 17710 | RowExclusiveLock | t
 relation      |    26166 |    27586 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |  1528073 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26559 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26549 |      |       |            |               |         |       |          | 18/75              | 25636 | RowExclusiveLock | t
 relation      |    26166 |    26553 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26555 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26361 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26551 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 virtualxid    |          |          |      |       | 8/2579     |               |         |       |          | 8/2579             | 25717 | ExclusiveLock    | t
 relation      |    26166 |    26358 |      |       |            |               |         |       |          | 6/144              | 17710 | RowExclusiveLock | t
 relation      |    26166 |  1528075 |      |       |            |               |         |       |          | 6/144              | 17710 | RowExclusiveLock | t
 relation      |    26166 |    26346 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 transactionid |          |          |      |       |            |       2275983 |         |       |          | 14/4861            | 25281 | ExclusiveLock    | t
 relation      |    26166 |    27539 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27558 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    27559 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 virtualxid    |          |          |      |       | 6/144      |               |         |       |          | 6/144              | 17710 | ExclusiveLock    | t
 relation      |    26166 |    27538 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    27550 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    27615 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    27535 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26505 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27557 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26346 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |  1528077 |      |       |            |               |         |       |          | 1/5474             | 25639 | RowExclusiveLock | t
 relation      |    26166 |    26265 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27537 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27545 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26385 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26385 |      |       |            |               |         |       |          | 1/5474             | 25639 | RowShareLock     | t
 relation      |    26166 |    27538 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    27615 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26295 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27557 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |  1528074 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27549 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26373 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26385 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26385 |      |       |            |               |         |       |          | 14/4861            | 25281 | RowExclusiveLock | t
 relation      |    26166 |    27617 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26295 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    27547 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |  1528074 |      |       |            |               |         |       |          | 1/5474             | 25639 | RowExclusiveLock | t
 relation      |    26166 |  1528076 |      |       |            |               |         |       |          | 6/144              | 17710 | RowExclusiveLock | t
 relation      |    26166 |    27616 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    27548 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    27549 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |  1528077 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26265 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    27537 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26521 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    27545 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    11564 |    10969 |      |       |            |               |         |       |          | 5/136              | 25716 | AccessShareLock  | t
 relation      |    26166 |    26229 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26373 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    27617 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    27550 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26497 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    27535 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    28020 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26505 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    27547 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |  1528076 |      |       |            |               |         |       |          | 18/75              | 25636 | RowExclusiveLock | t
 relation      |    26166 |    27616 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    27548 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 transactionid |          |          |      |       |            |       2275983 |         |       |          | 1/5474             | 25639 | ShareLock        | f
 relation      |    26166 |    27539 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    27558 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27559 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26521 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26229 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |  1528073 |      |       |            |               |         |       |          | 1/5474             | 25639 | RowExclusiveLock | t
 relation      |    26166 |    26559 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26553 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26379 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26361 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27587 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 tuple         |    26166 |    26385 |    8 |    67 |            |               |         |       |          | 6/144              | 17710 | ShareLock        | t
 relation      |    26166 |    27543 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26557 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    27536 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26507 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26259 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26491 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27563 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26241 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26241 |      |       |            |               |         |       |          | 1/5474             | 25639 | RowShareLock     | t
 relation      |    26166 |    27552 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26367 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26543 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27551 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27551 |      |       |            |               |         |       |          | 14/4861            | 25281 | RowExclusiveLock | t
 relation      |    26166 |    26379 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26391 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    27546 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 tuple         |    26166 |    26385 |    8 |    67 |            |               |         |       |          | 18/75              | 25636 | ShareLock        | t
 relation      |    26166 |    26557 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    27536 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26367 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26346 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 transactionid |          |          |      |       |            |       2275983 |         |       |          | 6/144              | 17710 | ShareLock        | f
 relation      |    26166 |    27539 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26265 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    27537 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    27545 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    27593 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27538 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26497 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    27615 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26295 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    27535 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26505 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |  1528074 |      |       |            |               |         |       |          | 18/75              | 25636 | RowExclusiveLock | t
 relation      |    26166 |    27616 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    27549 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 transactionid |          |          |      |       |            |       2275983 |         |       |          | 18/75              | 25636 | ShareLock        | f
 relation      |    26166 |    27539 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26265 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    27537 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26521 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    27545 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26229 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26373 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    27617 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26497 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26295 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    27535 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26505 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    27547 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    27557 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |  1528074 |      |       |            |               |         |       |          | 6/144              | 17710 | RowExclusiveLock | t
 relation      |    26166 |  1528076 |      |       |            |               |         |       |          | 1/5474             | 25639 | RowExclusiveLock | t
 relation      |    26166 |    27548 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    27549 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 virtualxid    |          |          |      |       | 14/4861    |               |         |       |          | 14/4861            | 25281 | ExclusiveLock    | t
 relation      |    26166 |    27587 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    27543 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26557 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26241 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26241 |      |       |            |               |         |       |          | 18/75              | 25636 | RowShareLock     | t
 relation      |    26166 |    27552 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26367 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |  1528073 |      |       |            |               |         |       |          | 18/75              | 25636 | RowExclusiveLock | t
 relation      |    26166 |    26559 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26549 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26391 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    27546 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    27587 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 tuple         |    26166 |    26385 |    8 |    67 |            |               |         |       |          | 1/5474             | 25639 | ShareLock        | t
 relation      |    26166 |    27543 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    27536 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |  1528078 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26241 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26241 |      |       |            |               |         |       |          | 6/144              | 17710 | RowShareLock     | t
 relation      |    26166 |    27552 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 virtualxid    |          |          |      |       | 1/5474     |               |         |       |          | 1/5474             | 25639 | ExclusiveLock    | t
 relation      |    26166 |  1528073 |      |       |            |               |         |       |          | 6/144              | 17710 | RowExclusiveLock | t
 relation      |    26166 |    26559 |      |       |            |               |         |       |          | 6/144              | 17710 | AccessShareLock  | t
 relation      |    26166 |    26379 |      |       |            |               |         |       |          | 1/5474             | 25639 | AccessShareLock  | t
 relation      |    26166 |    26555 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26551 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26523 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    26391 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |    26358 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t
 relation      |    26166 |    27546 |      |       |            |               |         |       |          | 18/75              | 25636 | AccessShareLock  | t
 relation      |    26166 |  1528075 |      |       |            |               |         |       |          | 14/4861            | 25281 | AccessShareLock  | t

Un explain sur le select me donne ceci

sensordb1=# explain verbose select record0_.id as id13_, record0_.broadcast_id as broadcast4_13_, record0_.owner_id as owner5_13_, record0_.recorddate as recorddate13_, record0_.recordvalue as recordva3_13_, record0_.recordvar_id as recordvar6_13_, record0_.target_id as target7_13_ from snsrRecord record0_ where record0_.recordvar_id='52' and record0_.owner_id='465714329' and (record0_.recorddate between '2011-09-21 00:00:00' and '2011-09-22 00:00:00') order by record0_.recorddate asc
;
                                                                        QUERY PLAN                                                                         
-----------------------------------------------------------------------------------------------------------------------------------------------------------
 Index Scan using idx_record_recorddate on snsrrecord record0_  (cost=0.00..17.08 rows=1 width=53)
   Output: id, broadcast_id, owner_id, recorddate, recordvalue, recordvar_id, target_id
   Index Cond: ((recorddate >= '2011-09-21 00:00:00'::timestamp without time zone) AND (recorddate <= '2011-09-22 00:00:00'::timestamp without time zone))
   Filter: ((recordvar_id = 52::bigint) AND (owner_id = 465714329::bigint))

L'explain analyze est en cours....

Hors ligne

#9 22/09/2011 14:08:35

Marc Cousin
Membre

Re : Investigation :: Bonnes pratiques

Bon, pour déchiffrer: voici un lock non accordé.

transactionid |          |          |      |       |            |       2275983 |         |       |          | 6/144              | 17710 | ShareLock        | f

Ce qu'on en retire: la transaction du pid 17710 a demandé un verrou sur l'id de transaction 2275983. On trouve qui possède cet id de transaction avec cette ligne-ci:

transactionid |          |          |      |       |            |       2275983 |         |       |          | 14/4861            | 25281 | ExclusiveLock    | t

Donc le pid 25281. Donc effectivement, l'ordre SQL de la session 17710 est en attente de la session 25281, qui effectivement fait un SELECT.

Par contre, je doute que la session, dans sa transaction courante, n'ait fait qu'un SELECT, à cause de ça :

relation      |    26166 |    27551 |      |       |            |               |         |       |          | 14/4861            | 25281 | RowExclusiveLock | t

=> Elle a un rowexclusive sur la relation 27751 (voir qui c'est par pg_class, par la colonne cachée oid). Elle a donc voulu effectuer un update sur un enregistrement de cette table.

Ce qui a donc du se passer:

La session 25281 a fait un update d'un enregistrement sur la table «27751». Puis elle s'est lancée sur son select (le select n'a pas l'air de faire de mise à jour, je ne vois pas d'appel de fonction, ni dans son code, ni dans son plan).
La session 17710 est ensuite allée faire un update, un select for update, un delete (sur le même enregistrement), et se retrouve donc en attente de savoir comment va se terminer la session 25281: suivant que la session commit ou rollback, elle ne doit évidemment pas se comporter de la même façon.

Les verrous d'enregistrement ne sont pas dans pg_locks (sauf très temporairement), mais dans les tables, dans Postgres. Ça rend pg_locks moins facile à interpréter, mais ça a plein d'avantages (comme pouvoir verrouiller des millions d'enregistrements sans être à court de verrou).


Marc.

Hors ligne

#10 22/09/2011 14:45:35

7uc0
Membre

Re : Investigation :: Bonnes pratiques

@Marc, tu conclus sur l'éxecution d'une autre instruction qu'un select à cause de l'acquisition d'un verrou RowExclusiveLock durant la même session ?

je tente de determiner la relation en interrogant le champ pg_class, une fois connecté sur la base....

Merci en tout cas

Hors ligne

#11 22/09/2011 14:52:57

Marc Cousin
Membre

Re : Investigation :: Bonnes pratiques

oui, le row exclusive n'est acquis que quand des données sont modifiées dans une table. donc update, delete, insert. J'ai dit une connerie plus haut, ça ne peut pas être juste un select for update, le verrou aurait été row share. Et si c'est vraiment le select qui le fait, c'est qu'il appelle un bout de PL caché quelque part. Ce que je ne vois pas dans son code, ni dans le plan (dans le plan, ça aurait pu être dû à une règle de réécriture de requête).

Donc pour savoir qui est l'heureuse victime:
SELECT relname from pg_class where oid=27751


Marc.

Hors ligne

#12 22/09/2011 14:53:44

gleu
Administrateur

Re : Investigation :: Bonnes pratiques

Plus exactement, il conclut que le SELECT fait partie d'une transaction et que, dans cette transaction, le SELECT est précédé d'au moins un UPDATE. Et je suis d'accord avec lui.


Guillaume.

Hors ligne

#13 22/09/2011 15:09:51

7uc0
Membre

Re : Investigation :: Bonnes pratiques

OK si je résume l'approche sur les comportements bloquants :

1 - A plus haut niveau, verifier les sessions en cours via ps
2 - Regarder la table pg_locks à la recherche de verrous non attribués
3 - Identifier la session ayant acquis le verrou et chercher d'éventuelles raisons de blocage au sein de la même transaction en se calant sur la colonne mode
4 - Identifier les éventuelles relations lockées durant la même session pour en déduire une ou plusieurs instructions bloquantes durant la transaction fonctionnelle
5 - faire évoluer le code (deux tx differentes, update après select) pour eliminer ce cas de blocage.
6 - Une fois les comportements bloquants éliminés -la transaction fonctionnelle peut-être longue, mais elle se termine (cf logs postgres avec log_min_duration)-, on peut se concentrer sur les optimisations des requêtes lentes à coup de explain et de refacto fonctionelle / positionnement d'index / évolution de configuration

Merci de m'apprendre à pêcher.

E.

Hors ligne

#14 22/09/2011 15:20:27

Marc Cousin
Membre

Re : Investigation :: Bonnes pratiques

En fait, la première chose importante est classique sur toutes les bases de données: ne garder les verrous qu'aussi peu de temps que nécessaire. Toute mise à jour des données verrouille au moins un petit quelque chose smile

Après, pour la démarche pour identifier un coupable, oui, elle est bonne. Il faut regarder les verrous qui sont en attente, qui ils attendent, et ce que ce "qui" peut bien être en train de faire. Si nécessaire, on peut trouver l'enregistrement sur lequel une session est bloquée, avec le contrib pgrowlocks (c'est bien sûr une extension en 9.1), mais ça impose un full scan de la table bloquée, ce qui peut être coûteux (pour aller justement consulter les verrous des enregistrements).

Pour ce qui est de localiser, lors d'un audit d'une appli, les causes de ralentissements, les verrous sont effectivement une bonne cible. On peut d'ailleurs assez facilement les repérer en activant log_lock_waits. Une fois qu'on a réduit (si c'est possible) les attentes dues aux verrous, on peut aussi optimiser les requêtes bien entendu. Mais il y a pas mal d'autres facteurs qui peuvent jouer sur des mauvaises performances: la machine, l'architecture, le paramétrage de l'OS, le paramétrage de l'instance, l'application elle même… etc…


Marc.

Hors ligne

#15 22/09/2011 15:58:17

7uc0
Membre

Re : Investigation :: Bonnes pratiques

Noté, Merci encore.


E.

Hors ligne

Pied de page des forums