On Wed, 2021-09-01 at 10:56 +0200, Laurenz Albe wrote:
> On Tue, 2021-08-31 at 21:16 -0700, Andres Freund wrote:
> > On 2021-09-01 05:39:14 +0200, Laurenz Albe wrote:
> > > On Tue, 2021-08-31 at 18:55 -0700, Andres Freund wrote:
> > > > > > On Tue, Aug 31, 2021 at 04:55:35AM +0200, Laurenz Albe wrote:In the
> > > > > > view of that, how about doubling PGSTAT_STAT_INTERVAL to 1000
> > > > > > milliseconds? That would mean slightly less up-to-date statistics, but
> > > > > > I doubt that that will be a problem.
> > > >
> > > > I think it's not helpful. Still increases the number of messages substantially in workloads
> > > > with a lot of connections doing occasional queries. Which is common.
> > >
> > > How come? If originally you send table statistics every 500ms, and now you send
> > > table statistics and session statistics every second, that should amount to the
> > > same thing. Where is my misunderstanding?
> >
> > Consider the case of one query a second.
>
> I guess I am too stupid. I don't see it.
Finally got it. That would send a message every second, and with connection statistics,
twice as many.
Here is my next suggestion for a band-aid to mitigate this problem:
Introduce a second, much longer interval for reporting session statistics.
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -77,6 +77,8 @@
#define PGSTAT_STAT_INTERVAL 500 /* Minimum time between stats file
* updates; in milliseconds. */
+#define PGSTAT_CONSTAT_INTERVAL 60000 /* interval to report connection statistics */
+
#define PGSTAT_RETRY_DELAY 10 /* How long to wait between checks for a
* new file; in milliseconds. */
@@ -889,8 +891,13 @@ pgstat_report_stat(bool disconnect)
!TimestampDifferenceExceeds(last_report, now, PGSTAT_STAT_INTERVAL))
return;
- /* for backends, send connection statistics */
- if (MyBackendType == B_BACKEND)
+ /*
+ * For backends, send connection statistics, but only every
+ * PGSTAT_CONSTAT_INTERVAL or when the backend terminates.
+ */
+ if (MyBackendType == B_BACKEND &&
+ (TimestampDifferenceExceeds(last_report, now, PGSTAT_CONSTAT_INTERVAL) ||
+ disconnect))
pgstat_send_connstats(disconnect, last_report, now);
last_report = now;
That should keep the extra load moderate, except for workloads with lots of tiny connections
(for which this may be the least of their problems).
Yours,
Laurenz Albe