Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[PostgreSQL] Est ce que la base a besoin de chauffer le matin ?

16 réponses
Avatar
Etienne
Salut.

j'ai un drole de comportement dans ma base de données, lorsque j'execute

explain analyze UPDATE mail SET is_deleted = 't' WHERE idmail IN
(166060,166062,166064,166066,166067,166068,166069,166070,166071,166072,166073,166074,166075,166076);

J'obtiens
Bitmap Heap Scan on mail (cost=59.64..115.10 rows=14 width=1402)
(actual time=0.106..0.279 rows=14 loops=1)
Recheck Cond: (idmail = ANY
('{166060,166062,166064,166066,166067,166068,166069,166070,166071,166072,166073,166074,1660
75,166076}'::integer[]))
-> Bitmap Index Scan on mail_pkey (cost=0.00..59.64 rows=14
width=0) (actual time=0.050..0.050 rows=27 loops=1)
Index Cond: (idmail = ANY
('{166060,166062,166064,166066,166067,166068,166069,166070,166071,166072,166073,166074,
166075,166076}'::integer[]))
Trigger for constraint mail_idfrom_fkey: time=0.130 calls=14
Trigger for constraint mail_idparent_fkey: time=0.050 calls=14
Total runtime: 5202.918 ms

5 secondes quand même !!!
si j'exécute plusieurs fois le même code j'obtiens a peu prêt le même
résultat !!!

Après plusieurs exécutions de la même requête (même en changeant les
idmail) j'obtiens

Bitmap Heap Scan on mail (cost=59.64..115.10 rows=14 width=1402)
(actual time=0.085..0.156 rows=14 loops=1)
Recheck Cond: (idmail = ANY
('{166060,166062,166064,166066,166067,166068,166069,166070,166071,166072,166073,166074,1660
75,166076}'::integer[]))
-> Bitmap Index Scan on mail_pkey (cost=0.00..59.64 rows=14
width=0) (actual time=0.052..0.052 rows=19 loops=1)
Index Cond: (idmail = ANY
('{166060,166062,166064,166066,166067,166068,166069,166070,166071,166072,166073,166074,
166075,166076}'::integer[]))
Trigger for constraint mail_idfrom_fkey: time=0.061 calls=14
Trigger for constraint mail_idparent_fkey: time=0.047 calls=14
Total runtime: 12.523 ms

12 ms!

Alors pourquoi le matin, il me faut 5 secondes pour exécuter LES
premières requêtes alors qu'ensuite tout s'accélère ?

Ca ne doit pas être une histoire de chargement de table en RAM sinon dès
la deuxième exécution ca devrait aller plus vite non ?
Y a t-il un manque de RAM sur mon serveur ?
Comment peut-on détecter ce genre de problème ?

Merci
Etienne

6 réponses

1 2
Avatar
SQLpro
Bonjour,

Le 20/12/2010 10:25, Etienne a écrit :
Le 13/12/2010 09:09, Sebastien Lardiere a écrit :
Salut,

Vu la quantité de données manipulés, les paramétrages mémoire paraissent
largement suffisant, mais ça ne dit rien sur l'activité que peut avoir
la base en parallèle, ni sur sa taille totale.



Bon le dump de la base fait 4Go...

Ensuite l'explain plan ne montre pas ou est consommé le temps ? N'en
manquerait-il pas un morceau ?



Ben non j'ai tout mis.
Peut être que je temps est pris par l'écriture sur disque (ce qui me
semblerai assez étrange).

Est-ce qu'il y a des taches de maintenance qui fonctionnent la nuit ?
backup, vacuum ?



Hum.
Oui.
En plus il s'agit de postresql 8.4 donc il y un auto vaccum.

Juste une remarque, vous parlez de 8GB de RAM disponible, mais on en est
loin, avec les réglages ci-dessus ? comment les utilisez vous ?



Heu en fait il s'agit d'une machine virtuelle qui dispose de 8Go.
Sur cette machine virtuelle il n'y a que postgres qui tourne.
(par contre il y a plusieurs bases).



en règle générale les machines virtuelles tuent les performances des SGBDR.
Lisez l'article que j'ai écrit à ce sujet :
http://blog.developpez.com/sqlpro/p8234/langage-sql-norme/sgbdr-et-virtualisation/


Etienne




A +


--
Frédéric BROUARD - expert SGBDR et SQL - MVP SQL Server - 06 11 86 40 66
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Enseignant Arts & Métiers PACA, ISEN Toulon et CESI/EXIA Aix en Provence
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************
Avatar
helios
SQLpro a écrit :
Bonjour,

Le 20/12/2010 10:25, Etienne a écrit :
Le 13/12/2010 09:09, Sebastien Lardiere a écrit :
Salut,

Vu la quantité de données manipulés, les paramétrages mémoire
paraissent
largement suffisant, mais ça ne dit rien sur l'activité que peut avoir
la base en parallèle, ni sur sa taille totale.



Bon le dump de la base fait 4Go...

Ensuite l'explain plan ne montre pas ou est consommé le temps ? N'en
manquerait-il pas un morceau ?



Ben non j'ai tout mis.
Peut être que je temps est pris par l'écriture sur disque (ce qui me
semblerai assez étrange).

Est-ce qu'il y a des taches de maintenance qui fonctionnent la nuit ?
backup, vacuum ?



Hum.
Oui.
En plus il s'agit de postresql 8.4 donc il y un auto vaccum.

Juste une remarque, vous parlez de 8GB de RAM disponible, mais on en
est
loin, avec les réglages ci-dessus ? comment les utilisez vous ?



Heu en fait il s'agit d'une machine virtuelle qui dispose de 8Go.
Sur cette machine virtuelle il n'y a que postgres qui tourne.
(par contre il y a plusieurs bases).



en règle générale les machines virtuelles tuent les performances des
SGBDR.
Lisez l'article que j'ai écrit à ce sujet :
http://blog.developpez.com/sqlpro/p8234/langage-sql-norme/sgbdr-et-virtualisation/





si je dis ce que je penses de cet article Brouard vas encore être faché
et vouloir faire un procés en diffamation sans savoir que cela aboutira
encore par une non condamnation








Etienne




A +


Avatar
Etienne
Le 01/01/2011 09:52, SQLpro a écrit :
Bonjour,

en règle générale les machines virtuelles tuent les performances des SGBDR.
Lisez l'article que j'ai écrit à ce sujet :
http://blog.developpez.com/sqlpro/p8234/langage-sql-norme/sgbdr-et-virtualisation/



Je suis assez enclin à vous croire.

car les logs des requètes que j'execute sont les suivants

[ext_v2]0.0003049373626709:UPDATE mail SET is_deleted = 't' WHERE idmail
= 171302;
[ext_v2]0.00030899047851562:UPDATE mail SET is_deleted = 't' WHERE
idmail = 171303;
[ext_v2]0.021498203277588:UPDATE mail SET is_deleted = 't' WHERE idmail
= 171304;
[ext_v2]0.00056886672973633:UPDATE mail SET is_deleted = 't' WHERE
idmail = 171305;
[ext_v2]0.036141157150269:UPDATE mail SET is_deleted = 't' WHERE idmail
= 171306;
[ext_v2]0.00051093101501465:UPDATE mail SET is_deleted = 't' WHERE
idmail = 171307;
[ext_v2]0.00030684471130371:UPDATE mail SET is_deleted = 't' WHERE
idmail = 171308;
[ext_v2]0.00031399726867676:UPDATE mail SET is_deleted = 't' WHERE
idmail = 171309;
[ext_v2]2.276673078537:UPDATE mail SET is_deleted = 't' WHERE idmail =
171310;
[ext_v2]0.00075697898864746:UPDATE mail SET is_deleted = 't' WHERE
idmail = 171311;
[ext_v2]0.00035309791564941:UPDATE mail SET is_deleted = 't' WHERE
idmail = 171312;
[ext_v2]0.00032401084899902:UPDATE mail SET is_deleted = 't' WHERE
idmail = 171313;
[ext_v2]0.015580892562866:UPDATE mail SET is_deleted = 't' WHERE idmail
= 171314;

Une même requête (sauf évidement l'id qui change) exécutée dans une même
transaction prends ici 10.000 fois plus de temps... c'est pas top normal
d'après moi.

Surtout que si je ne m'abuse, vu que c'est dans une transaction, il ne
doit pas y avoir d'écriture sur disque avant le commit non ?

Etienne

Etienne
Avatar
Etienne
Le 01/01/2011 09:52, SQLpro a écrit :
Bonjour,

en règle générale les machines virtuelles tuent les performances des SGBDR.
Lisez l'article que j'ai écrit à ce sujet :
http://blog.developpez.com/sqlpro/p8234/langage-sql-norme/sgbdr-et-virtualisation/



Bon tu avais raison...

Alors voila l'explication (enfin disons mon interprétation du problème).
lorsque je supprime des mails (sur mon client mail)
- j'exécute la suppression sur le serveur de mail
- j'exécute la suppression sur postgresql

le serveur imap et postgresql tournent tous les deux dans 2 machines
virtuelles séparées, mais... partage le même raid. (erreur !!!)

Donc lorsque j'exécute ma requêtes SQL, pas de chance, linux est en
train de supprimer les mails (physiquement). Postgres, pour qui, il n'y
a pas d'IO à ce moment décide lui aussi de flusher ses caches.
Et boum... c'est le bouchon.

Donc le matin lorsque j'arrive avant tout le monde, j'ai droit au problème.
A 9h15, lorsque les 200 salariés de la boite sont là et que l'activité
SQL augmente, je suppose qu'il arrive que postgres ne flush pas tout de
suite ses caches. Et donc, paradoxalement, c'est parce qu'il y a plus
d'activité que ca va plus vite (en tout cas que ca n'entre pas en
conflit avec les écritures de l'IMAP).

Alors comment j'en suis arrivé à cette conclusion ???
J'ai juste inversé les requêtes SQL et le requêtes IMAP, et là tout
fonctionne.

Bon évidement c'est juste un patch qui ne corrige absolument pas le
problème. Il va falloir tout réinstaller et séparer les RAIDs!

Bon ben au moins, y a une logique dans cette histoire. c'est déjà ça!

Etienne
Avatar
SQLpro
Le 04/01/2011 10:35, Etienne a écrit :
Le 01/01/2011 09:52, SQLpro a écrit :
Bonjour,



en règle générale les machines virtuelles tuent les performances des
SGBDR.
Lisez l'article que j'ai écrit à ce sujet :
http://blog.developpez.com/sqlpro/p8234/langage-sql-norme/sgbdr-et-virtualisation/




Bon tu avais raison...

Alors voila l'explication (enfin disons mon interprétation du problème).
lorsque je supprime des mails (sur mon client mail)
- j'exécute la suppression sur le serveur de mail
- j'exécute la suppression sur postgresql

le serveur imap et postgresql tournent tous les deux dans 2 machines
virtuelles séparées, mais... partage le même raid. (erreur !!!)

Donc lorsque j'exécute ma requêtes SQL, pas de chance, linux est en
train de supprimer les mails (physiquement). Postgres, pour qui, il n'y
a pas d'IO à ce moment décide lui aussi de flusher ses caches.
Et boum... c'est le bouchon.

Donc le matin lorsque j'arrive avant tout le monde, j'ai droit au problème.
A 9h15, lorsque les 200 salariés de la boite sont là et que l'activité
SQL augmente, je suppose qu'il arrive que postgres ne flush pas tout de
suite ses caches. Et donc, paradoxalement, c'est parce qu'il y a plus
d'activité que ca va plus vite (en tout cas que ca n'entre pas en
conflit avec les écritures de l'IMAP).

Alors comment j'en suis arrivé à cette conclusion ???
J'ai juste inversé les requêtes SQL et le requêtes IMAP, et là tout
fonctionne.

Bon évidement c'est juste un patch qui ne corrige absolument pas le
problème. Il va falloir tout réinstaller et séparer les RAIDs!

Bon ben au moins, y a une logique dans cette histoire. c'est déjà ça!



Au minimum si tu veut rester en virtualisation et avoir des perfs, il
faut faire du disque "pass through" et créer des LUN indépendantes sur
des disques physiques à usage exclusif de la base. En sus, éviter le
RAID 5 ou 6 et toutes combinaisons (50 par exemple).

A +


Etienne




--
Frédéric BROUARD - expert SGBDR et SQL - MVP SQL Server - 06 11 86 40 66
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Enseignant Arts & Métiers PACA, ISEN Toulon et CESI/EXIA Aix en Provence
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************
Avatar
helios
SQLpro a écrit :
Le 04/01/2011 10:35, Etienne a écrit :
Le 01/01/2011 09:52, SQLpro a écrit :
Bonjour,



en règle générale les machines virtuelles tuent les performances des
SGBDR.
Lisez l'article que j'ai écrit à ce sujet :
http://blog.developpez.com/sqlpro/p8234/langage-sql-norme/sgbdr-et-virtualisation/





Bon tu avais raison...

Alors voila l'explication (enfin disons mon interprétation du problème).
lorsque je supprime des mails (sur mon client mail)
- j'exécute la suppression sur le serveur de mail
- j'exécute la suppression sur postgresql

le serveur imap et postgresql tournent tous les deux dans 2 machines
virtuelles séparées, mais... partage le même raid. (erreur !!!)

Donc lorsque j'exécute ma requêtes SQL, pas de chance, linux est en
train de supprimer les mails (physiquement). Postgres, pour qui, il n'y
a pas d'IO à ce moment décide lui aussi de flusher ses caches.
Et boum... c'est le bouchon.

Donc le matin lorsque j'arrive avant tout le monde, j'ai droit au
problème.
A 9h15, lorsque les 200 salariés de la boite sont là et que l'activité
SQL augmente, je suppose qu'il arrive que postgres ne flush pas tout de
suite ses caches. Et donc, paradoxalement, c'est parce qu'il y a plus
d'activité que ca va plus vite (en tout cas que ca n'entre pas en
conflit avec les écritures de l'IMAP).

Alors comment j'en suis arrivé à cette conclusion ???
J'ai juste inversé les requêtes SQL et le requêtes IMAP, et là tout
fonctionne.

Bon évidement c'est juste un patch qui ne corrige absolument pas le
problème. Il va falloir tout réinstaller et séparer les RAIDs!

Bon ben au moins, y a une logique dans cette histoire. c'est déjà ça!



Au minimum si tu veut rester en virtualisation et avoir des perfs, il
faut faire du disque "pass through" et créer des LUN indépendantes sur
des disques physiques à usage exclusif de la base. En sus, éviter le
RAID 5 ou 6 et toutes combinaisons (50 par exemple).

A +




"éviter le RAID5 ou 6" voila un conseil de pro ne pas utiliser de
machine Pro

si on etait dans le monde des motos le "pro" donnerait comme conseil
"pour allez loin ne demarer pas le moteur pedalez plutot vous
consommerez moins d'essence donc irez plus loin" :-)
1 2