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

#1 01/02/2012 11:06:49

Tony
Membre

Lenteur de Postgresql depuis queslques jours

Bonjour,

C'est mon premier mail sur ce forum.

J'administre une base de données Postgresl 8.4 de 12 Go avec des centaines d'utilisateurs sur un serveur Ubuntu 10.04 LTS

Depuis quelques jours je constate une surcharge inhabituelle du serveur et j'ai du mal a identifier la cause.

J'ai essayé d'optimiser les paramètres de gestion de la mémoire comme indiqué sur cette page, car j'utilise le logiciel Dynacase :
-> http://www.dynacase.org/dynacase/instal … postgresql

Mais à priori, cela n'a pas changé grand chose.

Je suis en particulier étonné du nombre important de requêtes en attentes comme le montre pg_top et du 56.2% de iowait :

ast pid: 13864;  load avg:  2.05,  2.85,  3.53;       up 71+01:19:56                                                                                10:01:56
9 processes: 1 running, 5 sleeping, 3 uninterruptable
CPU states: 37.8% user,  0.0% nice,  6.1% system,  0.0% idle, 56.2% iowait
Memory: 1920M used, 92M free, 28M buffers, 1561M cached
Swap: 10M used, 5885M free, 4168K cached

  PID USERNAME PRI NICE  SIZE   RES STATE   TIME   WCPU    CPU COMMAND
 13840 postgres  20    0  542M  186M disk    0:04  6.23% 33.30% postgres: freedomowner freedom ::1(44041) SELECT                                              
13852 postgres  20    0  543M   21M sleep   0:00  1.57% 13.36% postgres: freedomowner freedom ::1(44053) INSERT                                              
13861 postgres  20    0  546M   24M disk    0:00  0.65%  7.78% postgres: freedomowner freedom ::1(44061) INSERT                                              
13249 postgres  20    0  667M   98M disk    0:03  1.35%  1.60% postgres: autovacuum worker process   freedom                                                 
13862 postgres  20    0  539M 5792K sleep   0:00  0.03%  0.40% postgres: freedomowner freedom ::1(44062) idle                                                
 7583 postgres  20    0  539M 7208K sleep   0:00  0.00%  0.00% postgres: postgres postgres [local] idle                                                      
13853 postgres  20    0  539M 5796K sleep   0:00  0.03%  0.00% postgres: freedomowner freedom ::1(44054) idle                                                
13841 postgres  20    0  539M 5796K sleep   0:00  0.03%  0.00% postgres: freedomowner freedom ::1(44042) idle                                                
13865 postgres  20    0  539M 4448K run     0:00  0.00%  0.00% postgres: postgres postgres [local] idle

A votre avis, d'où peut venir cette surcharge inhabituelle ?

Quel test ou optimisation me conseillez-vous ?

Merci d'avance

Tony

Hors ligne

#2 01/02/2012 11:15:06

gleu
Administrateur

Re : Lenteur de Postgresql depuis queslques jours

Je suis en particulier étonné du nombre important de requêtes en attentes comme le montre pg_top et du 56.2% de iowait :

Je suppose que vous voulez dire en attente du disque à cause de l'iowait.

A votre avis, d'où peut venir cette surcharge inhabituelle ?

Difficile à dire sans plus d'informations. Exécutez-vous des VACUUM de temps en temps ? l'autovacuum est-il activé ? Les disques sont-ils sur le serveur ? etc.


Guillaume.

Hors ligne

#3 01/02/2012 11:30:42

Tony
Membre

Re : Lenteur de Postgresql depuis queslques jours

gleu a écrit :

Je suis en particulier étonné du nombre important de requêtes en attentes comme le montre pg_top et du 56.2% de iowait :

Je suppose que vous voulez dire en attente du disque à cause de l'iowait.
.

Oui


gleu a écrit :

A votre avis, d'où peut venir cette surcharge inhabituelle ?

Difficile à dire sans plus d'informations. Exécutez-vous des VACUUM de temps en temps ? l'autovacuum est-il activé ?

Le processus autovacuum est bien lancé :

postgres 27212  0.0  0.5 548876 11460 ?        S    06:54   0:07 /usr/lib/postgresql/8.4/bin/postgres -D /var/lib/postgresql/8.4/main -c config_file=/etc/postgresql/8.4/main/postgresql.conf
postgres 27214  0.0 25.5 549236 525560 ?       Ss   06:54   0:11  \_ postgres: writer process                                                                                                    
postgres 27215  0.0  0.0 549136   892 ?        Ss   06:54   0:02  \_ postgres: wal writer process                                                                                                
postgres 27216  0.0  0.0 549928  1580 ?        Ss   06:54   0:01  \_ postgres: autovacuum launcher process

Existe-il une commande pour connaitre l'heure de la dernière exécution du Vacuum ?

gleu a écrit :

Les disques sont-ils sur le serveur ? etc.

C'est un serveur dédié avec des disques dédiés

Tony

Hors ligne

#4 01/02/2012 11:34:40

gleu
Administrateur

Re : Lenteur de Postgresql depuis queslques jours

Existe-il une commande pour connaitre l'heure de la dernière exécution du Vacuum ?

Tout se trouve dans le catalogue statistique pg_stat_user_tables.

Concernant l'iowait, le problème est plutôt au niveau disque ou système de fichiers, pas au niveau PostgreSQL.


Guillaume.

Hors ligne

#5 01/02/2012 11:54:06

Tony
Membre

Re : Lenteur de Postgresql depuis queslques jours

gleu a écrit :

Existe-il une commande pour connaitre l'heure de la dernière exécution du Vacuum ?

Tout se trouve dans le catalogue statistique pg_stat_user_tables..

Cette table est vide. Je pense qu'il faut activer les statistiques pour l'alimenter ce qui n'est pas le cas à priori


gleu a écrit :

Concernant l'iowait, le problème est plutôt au niveau disque ou système de fichiers, pas au niveau PostgreSQL.

J'ai tout de même l'impression que les premières requêtes utilisent beaucoup de mémoire et qu'il n'en reste plus suffisamment pour les suivantes ce qui entrainerait cette mise en attente

Le problème ne peut-il pas venir d'un mauvais paramétrage de la mémoire de Postgresql (shared_buffers, work_mem, maintenance_work_mem, effective_cache_size,..) ?

Sinon d'après vous, le problème viendrait du disque dur qui serait fatigué et fonctionnerait moins rapidement qu'auparavant ?
-> Est-il possible de faire un test à ce niveau ?

Merci d'avance

Hors ligne

#6 01/02/2012 12:10:48

gleu
Administrateur

Re : Lenteur de Postgresql depuis queslques jours

Cette table est vide. Je pense qu'il faut activer les statistiques pour l'alimenter ce qui n'est pas le cas à priori

Du coup, l'autovacuum ne peut pas exécuter de VACUUM et d'ANALYZE vu qu'il ne peut pas détecter si les tables en ont besoin ou pas.

J'ai tout de même l'impression que les premières requêtes utilisent beaucoup de mémoire et qu'il n'en reste plus suffisamment pour les suivantes ce qui entrainerait cette mise en attente

Un shared_buffers trop petit peut ralentir les autres requêtes.

Le problème ne peut-il pas venir d'un mauvais paramétrage de la mémoire de Postgresql (shared_buffers, work_mem, maintenance_work_mem, effective_cache_size,..) ?

Je n'y crois pas. Une trop forte valeur de work_mem et maintenance_work_mem peut générer de grosses écritures. effective_cache_size ne peut avoir aucune incidence. shared_buffers peut, s'il est trop petit, être la cause de lectures supplémentaires.

Sinon d'après vous, le problème viendrait du disque dur qui serait fatigué et fonctionnerait moins rapidement qu'auparavant ?
-> Est-il possible de faire un test à ce niveau ?

Ça peut être une cause. L'autre possibilité est que les tables soient fragmentées dû fait du manque d'exécution des VACUUM. Une table fragmentée demandera plus de lectures de blocs, et généralement plus de déplacement de la tête de lecture.

Bref, pour moi, je penche plus vers une fragmentation importantes des tables et des index. Utilisez-vous VACUUM en dehors de l'autovacuum ? et REINDEX ?


Guillaume.

Hors ligne

#7 01/02/2012 17:16:51

Tony
Membre

Re : Lenteur de Postgresql depuis queslques jours

gleu a écrit :

Cette table est vide. Je pense qu'il faut activer les statistiques pour l'alimenter ce qui n'est pas le cas à priori

Du coup, l'autovacuum ne peut pas exécuter de VACUUM et d'ANALYZE vu qu'il ne peut pas détecter si les tables en ont besoin ou pas.

En fait, j'ai fais la requête sur la base 'postgres' et non pas sur la base de Dynacase.

Sur la bonne base, la table est bien remplie. Voici un extrait pour information :

       relname       |          last_vacuum           |         last_autovacuum         |          last_analyze          |        last_autoanalyze         
---------------------+--------------------------------+---------------------------------+--------------------------------+---------------------------------
 doc31               | 01/02/2012 05:57:01.231986 CET |                                 | 01/02/2012 05:57:01.242728 CET | 
 docvaultindex       | 01/02/2012 06:00:49.701209 CET | 17/05/2011 18:40:58.591079 CEST | 01/02/2012 06:00:49.784525 CET | 17/05/2011 18:40:58.591079 CEST
 usertoken           | 01/02/2012 06:01:02.720471 CET | 28/04/2011 11:01:39.176441 CEST | 01/02/2012 06:01:02.735843 CET | 04/01/2012 16:53:13.462413 CET
 doc7994             | 01/02/2012 05:56:55.275817 CET |                                 | 01/02/2012 05:56:55.277852 CET | 
 doc20               | 01/02/2012 05:58:49.394601 CET |                                 | 01/02/2012 05:58:49.404725 CET | 
 doc244220           | 01/02/2012 05:57:00.828779 CET | 08/11/2011 14:06:02.509226 CET  | 01/02/2012 05:57:00.888176 CET | 08/11/2011 14:04:02.63594 CET
 doc10631            | 01/02/2012 06:10:34.155425 CET | 01/02/2012 05:39:30.215997 CET  | 01/02/2012 06:10:34.184137 CET | 01/02/2012 14:02:33.930995 CET
 doc39               | 01/02/2012 05:56:59.36014 CET  |                                 | 01/02/2012 05:56:59.362097 CET |
gleu a écrit :

J'ai tout de même l'impression que les premières requêtes utilisent beaucoup de mémoire et qu'il n'en reste plus suffisamment pour les suivantes ce qui entrainerait cette mise en attente

Un shared_buffers trop petit peut ralentir les autres requêtes.

Le problème ne peut-il pas venir d'un mauvais paramétrage de la mémoire de Postgresql (shared_buffers, work_mem, maintenance_work_mem, effective_cache_size,..) ?

Je n'y crois pas. Une trop forte valeur de work_mem et maintenance_work_mem peut générer de grosses écritures. effective_cache_size ne peut avoir aucune incidence. shared_buffers peut, s'il est trop petit, être la cause de lectures supplémentaires.

Si vous voulez vérifier que rien ne vous parait bizarre dans mon paramétrage, voici mes valeurs :

  Mémoire vive : 2 Go
  max_connections = 64
  shared_buffers = 512MB
  work_mem = 8MB    
  maintenance_work_mem = 128MB

Merci d'avance pour vos lumières

Hors ligne

#8 01/02/2012 18:10:23

gleu
Administrateur

Re : Lenteur de Postgresql depuis queslques jours

Ce paramétrage semble cohérent. Tout dépend ensuite s'il s'agit d'un serveur dédié à PostgreSQL ou non, mais à priori ça me semble bon.

Il faudrait peut-être réindexer la base. Attention que cela prendre du temps et que cela bloquera les écritures sur les tables.

La dernière hypothèse est évidemment un problème disque.


Guillaume.

Hors ligne

#9 01/02/2012 18:18:31

Tony
Membre

Re : Lenteur de Postgresql depuis queslques jours

gleu a écrit :

Ce paramétrage semble cohérent. Tout dépend ensuite s'il s'agit d'un serveur dédié à PostgreSQL ou non, mais à priori ça me semble bon.
.

C'est un serveur dédié à l'application Web Dynanase. Donc c'est essentiellement les services de Postgresql et d'Apache qui tournent


gleu a écrit :

Il faudrait peut-être réindexer la base. Attention que cela prendre du temps et que cela bloquera les écritures sur les tables.

Cela ce fait comment ?


gleu a écrit :

La dernière hypothèse est évidemment un problème disque.

Si je ne trouve rien de plus, je creuserai effectivement cette piste. Cela expliquerait que la lenteur soit apparue quasiment du jour au lendemain sans rien faire de spéciale dans Postgresql

En tout cas, merci pour toutes les réponses

Hors ligne

#10 01/02/2012 18:30:37

gleu
Administrateur

Re : Lenteur de Postgresql depuis queslques jours

Cela se fait comment ?

Il faut utiliser l'ordre SQL REINDEX (http://docs.postgresql.fr/9.1/sql-reindex.html) sans arguments. Il est aussi possible de passer par l'outil reindexdb (http://docs.postgresql.fr/9.1/app-reindexdb.html). Ça rend plus simple son automatisation.


Guillaume.

Hors ligne

#11 01/02/2012 18:30:45

kenrio
Membre

Re : Lenteur de Postgresql depuis queslques jours

pour réindexer la database entièrement c'est ça : REINDEX DATABASE nom_de_la_database;

on peut juste faire l'index ou la table

edit : grilled fffuuuu

Dernière modification par kenrio (01/02/2012 18:31:20)

Hors ligne

Pied de page des forums