Lists: | pgsql-fr-generale |
---|
From: | Benoit Lobréau <benoit(dot)lobreau(at)gmail(dot)com> |
---|---|
To: | pgsql-fr-generale(at)postgresql(dot)org |
Subject: | Question sur les restarts points. |
Date: | 2016-02-15 16:19:28 |
Message-ID: | CAPE8EZ6bBtbh3oCD7WpF1_zm5Pqd2pOXy2NJfbooYK60BwS_Fg@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-fr-generale |
Bonjour,
J'utilise les fonctionnalités de HotStandby sur PostgreSQL 9.1.
J'ai constaté en faisant des tests que les restarts_points (sur la standby
donc) ne semblent pas se produire quand checkpoint_segments est atteint
mais uniquement quand checkpoint_timeout est atteint. (et qu'il y a eu un
checkpoint sur la primaire).
En regardant dans le code, j'ai trouvé ça dans bgwrite.c:
/*
* Check progress against WAL segments written and
checkpoint_segments.
*
* We compare the current WAL insert location against the
location
* computed before calling CreateCheckPoint. The code in
XLogInsert that
* actually triggers a checkpoint when checkpoint_segments
is exceeded
* compares against RedoRecptr, so this is not completely
accurate.
* However, it's good enough for our purposes, we're only
calculating an
* estimate anyway.
*/
if (!RecoveryInProgress()) ===> cas d'une restauration ou
d'une standby ?
{
recptr = GetInsertRecPtr();
elapsed_xlogs =
(((double) (int32)
(recptr.xlogid - ckpt_start_recptr.xlogid)) * XLogSegsPerFile +
((double) recptr.xrecoff -
(double) ckpt_start_recptr.xrecoff) / XLogSegSize) /
CheckPointSegments;
if (progress < elapsed_xlogs) ===> progress
en volume
{
ckpt_cached_elapsed =
elapsed_xlogs;
return false;
}
}
/*
* Check progress against time elapsed and
checkpoint_timeout.
*/
gettimeofday(&now, NULL);
elapsed_time = ((double) ((pg_time_t) now.tv_sec -
ckpt_start_time) +
now.tv_usec / 1000000.0) / CheckPointTimeout;
if (progress < elapsed_time) ===> progress en temps
{
ckpt_cached_elapsed = elapsed_time;
return false;
}
/* It looks like we're on schedule. */
return true;
J'ai également trouvé un post de Simon Riggs [1] qui dit:
"checkpoint_segments is ignored on standby. "
ça semble confirmer mes observations mais la doc dit [2]: "In standby mode,
a restartpoint is also triggered if checkpoint_segments log segments have
been replayed since last restartpoint and at least one checkpoint record
has been replayed."
Du coup, je ne comprends pas trop. S'agit il d'une erreur dans la doc ?
[2] http://www.postgresql.org/docs/9.1/static/wal-configuration.html
Merci d'avance.
Benoit
From: | Jehan-Guillaume de Rorthais <ioguix(at)free(dot)fr> |
---|---|
To: | Benoit Lobréau <benoit(dot)lobreau(at)gmail(dot)com> |
Cc: | pgsql-fr-generale(at)postgresql(dot)org |
Subject: | Re: Question sur les restarts points. |
Date: | 2016-02-16 12:25:49 |
Message-ID: | 20160216132549.6197e826@firost |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-fr-generale |
Le Mon, 15 Feb 2016 17:19:28 +0100,
Benoit Lobréau <benoit(dot)lobreau(at)gmail(dot)com> a écrit :
> J'utilise les fonctionnalités de HotStandby sur PostgreSQL 9.1.
>
> J'ai constaté en faisant des tests que les restarts_points (sur la standby
> donc) ne semblent pas se produire quand checkpoint_segments est atteint
> mais uniquement quand checkpoint_timeout est atteint. (et qu'il y a eu un
> checkpoint sur la primaire).
>
>
>
> En regardant dans le code, j'ai trouvé ça dans bgwrite.c:
>
>
>
> /*
>
> * Check progress against WAL segments written and
> checkpoint_segments.
>
> *
>
> * We compare the current WAL insert location against the
> location
>
> * computed before calling CreateCheckPoint. The code in
> XLogInsert that
>
> * actually triggers a checkpoint when checkpoint_segments
> is exceeded
>
> * compares against RedoRecptr, so this is not completely
> accurate.
>
> * However, it's good enough for our purposes, we're only
> calculating an
>
> * estimate anyway.
>
> */
>
> if (!RecoveryInProgress()) ===> cas d'une restauration ou
> d'une standby ?
>
> {
>
> recptr = GetInsertRecPtr();
>
> elapsed_xlogs =
>
> (((double) (int32)
> (recptr.xlogid - ckpt_start_recptr.xlogid)) * XLogSegsPerFile +
>
> ((double) recptr.xrecoff -
> (double) ckpt_start_recptr.xrecoff) / XLogSegSize) /
>
> CheckPointSegments;
>
>
>
> if (progress < elapsed_xlogs) ===> progress
> en volume
>
> {
>
> ckpt_cached_elapsed =
> elapsed_xlogs;
>
> return false;
>
> }
>
> }
>
>
>
> /*
>
> * Check progress against time elapsed and
> checkpoint_timeout.
>
> */
>
> gettimeofday(&now, NULL);
>
> elapsed_time = ((double) ((pg_time_t) now.tv_sec -
> ckpt_start_time) +
>
>
> now.tv_usec / 1000000.0) / CheckPointTimeout;
>
>
>
> if (progress < elapsed_time) ===> progress en temps
>
> {
>
> ckpt_cached_elapsed = elapsed_time;
>
> return false;
>
> }
>
>
>
> /* It looks like we're on schedule. */
>
> return true;
Merci pour avoir creusé dans le code :)
De ce que j'en lis, effectivement les restartpoints ne sont effectués que sur
timeout. Le bloc "if (!RecoveryInProgress())" ne concerne qu'une instance
primaire.
> J'ai également trouvé un post de Simon Riggs [1] qui dit:
> "checkpoint_segments is ignored on standby. "
>
> ça semble confirmer mes observations mais la doc dit [2]: "In standby mode,
> a restartpoint is also triggered if checkpoint_segments log segments have
> been replayed since last restartpoint and at least one checkpoint record
> has been replayed."
>
> Du coup, je ne comprends pas trop. S'agit il d'une erreur dans la doc ?
La meilleure chose à faire est d'en discuter sur pgsql-hackers à mon avis.
++
--
Envoi via la liste pgsql-fr-generale (pgsql-fr-generale(at)postgresql(dot)org)
From: | Benoit Lobréau <benoit(dot)lobreau(at)gmail(dot)com> |
---|---|
To: | Jehan-Guillaume de Rorthais <ioguix(at)free(dot)fr> |
Cc: | pgsql-fr-generale(at)postgresql(dot)org |
Subject: | Re: Question sur les restarts points. |
Date: | 2016-02-16 16:32:06 |
Message-ID: | CAPE8EZ49F+yXsBiUYmic6tCVWbWxB2NGpuYt0sfSUVZRV6zybA@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-fr-generale |
Will do, merci !
From: | Cédric Villemain <cedric(at)2ndquadrant(dot)com> |
---|---|
To: | Benoit Lobréau <benoit(dot)lobreau(at)gmail(dot)com>, pgsql-fr-generale(at)postgresql(dot)org |
Subject: | Re: Question sur les restarts points. |
Date: | 2016-02-17 11:08:30 |
Message-ID: | 56C454AE.9050605@2ndQuadrant.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-fr-generale |
Bonjour Benoit,
> J'utilise les fonctionnalités de HotStandby sur PostgreSQL 9.1.
>
> J'ai constaté en faisant des tests que les restarts_points (sur la
> standby donc) ne semblent pas se produire quand checkpoint_segments est
> atteint mais uniquement quand checkpoint_timeout est atteint. (et qu'il
> y a eu un checkpoint sur la primaire).
>
> En regardant dans le code, j'ai trouvé ça dans bgwrite.c:
>
> * Check progress against WAL segments written and
> checkpoint_segments.
[...]
> if (!RecoveryInProgress()) ===> cas d'une restauration
> ou d'une standby ?
Il me semble que ce code ne fait partie de ce qui est exécuté sur un
standby.
Voir CreateRestartPoint()
> J'ai également trouvé un post de Simon Riggs [1] qui dit:
> "checkpoint_segments is ignored on standby. "
C'était le cas, mais Heikki et Fujii ont modifié cela dans le commit 7181530
> ça semble confirmer mes observations mais la doc dit [2]: "In standby
> mode, a restartpoint is also triggered if checkpoint_segments log
> segments have been replayed since last restartpoint and at least one
> checkpoint record has been replayed."
la doc dit vrai, un bug dans le code n'est pas exclu, je n'ai pas le
temps de tester cela. Quelle version de PostgreSQL utilisez vous
exactement ?
> Du coup, je ne comprends pas trop. S'agit il d'une erreur dans la doc ?
non.
--
Cédric Villemain +33 (0)6 20 30 22 52
http://2ndQuadrant.fr/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
--
Envoi via la liste pgsql-fr-generale (pgsql-fr-generale(at)postgresql(dot)org)
From: | Benoit Lobréau <benoit(dot)lobreau(at)gmail(dot)com> |
---|---|
To: | Cédric Villemain <cedric(at)2ndquadrant(dot)com> |
Cc: | pgsql-fr-generale(at)postgresql(dot)org |
Subject: | Re: Question sur les restarts points. |
Date: | 2016-02-18 09:04:30 |
Message-ID: | CAPE8EZ7Ut+oO4cZksahp=3=TOpf+89D3xRDWJs2r6NhQrVXZ2A@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-fr-generale |
Bonjour,
Merci pour la réponse,
J'utilise cette version: PostgreSQL 9.1.19 on x86_64-unknown-linux-gnu,
compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit
Voici comment je suis arrivé a cette portion de code. Il y a quelques tests
dans BufferSync ou je ne suis pas sur que l'on passe. Donc je me trompe
peut être :
CreateRestartPoint (xlog.c)
CheckPointGuts (xlog.c)
CheckPointBuffers (bufmgr.c)
BufferSync (bufmgr.c)
CheckpointWriteDelay (bgwriter.c)
IsCheckpointOnSchedule (bgwriter.c) => ou on trouve ce test.
Je pensais que cela pouvait influer sur la fréquence de checkpoint en
influant sur leur durée, mais rétrospectivement, je pense que je me trompe.
Je vais regarder les mails sur le commit que tu mentionnes (7181530),
refaire des tests, relire la doc et peut être un peu de code aussi :)
Benoit
From: | Cédric Villemain <cedric(at)2ndQuadrant(dot)com> |
---|---|
To: | Benoit Lobréau <benoit(dot)lobreau(at)gmail(dot)com> |
Cc: | pgsql-fr-generale(at)postgresql(dot)org |
Subject: | Re: Question sur les restarts points. |
Date: | 2016-02-18 09:13:12 |
Message-ID: | 56C58B28.2070808@2ndQuadrant.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-fr-generale |
> Merci pour la réponse,
Avec plaisir, tout l'intérêt d'une liste de diffusion francophone !
> J'utilise cette version: PostgreSQL 9.1.19 on x86_64-unknown-linux-gnu,
> compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit
>
>
> Voici comment je suis arrivé a cette portion de code. Il y a quelques
> tests dans BufferSync ou je ne suis pas sur que l'on passe. Donc je me
> trompe peut être :
>
>
> CreateRestartPoint (xlog.c)
>
> CheckPointGuts (xlog.c)
>
> CheckPointBuffers (bufmgr.c)
>
> BufferSync (bufmgr.c)
>
> CheckpointWriteDelay (bgwriter.c)
>
> IsCheckpointOnSchedule (bgwriter.c) => ou on trouve ce test.
>
> Je pensais que cela pouvait influer sur la fréquence de checkpoint en
> influant sur leur durée, mais rétrospectivement, je pense que je me trompe.
>
> Je vais regarder les mails sur le commit que tu mentionnes (7181530),
> refaire des tests, relire la doc et peut être un peu de code aussi :)
tu peux utiliser un mode de log plus verbeux pour avoir plus de détails,
et je suggère de faire un petit patch pour aider..
Ajouter par exemple:
elog(DEBUG1, ...., new_segno, old_segno, CheckPointSegments)
dans XLogCheckpointNeeded(XLogSegNo new_segno)
--
Cédric Villemain +33 (0)6 20 30 22 52
http://2ndQuadrant.fr/
PostgreSQL: Support 24x7 - Développement, Expertise et Formation
--
Envoi via la liste pgsql-fr-generale (pgsql-fr-generale(at)postgresql(dot)org)