agora inbox for [email protected]
help / color / mirror / Atom feedFrom: Bertrand Drouvot <[email protected]>
Subject: [PATCH v6 3/5] Add GUC to specify non-transactional statistics flush interval
Date: Wed, 28 Jan 2026 07:53:13 +0000
Adding pgstat_flush_interval, a new GUC to set the interval between flushes of
non-transactional statistics.
---
doc/src/sgml/config.sgml | 34 +++++++++++++++++++
src/backend/utils/activity/pgstat.c | 16 +++++++++
src/backend/utils/misc/guc_parameters.dat | 10 ++++++
src/backend/utils/misc/postgresql.conf.sample | 1 +
src/include/pgstat.h | 6 ++--
src/include/utils/guc_hooks.h | 1 +
6 files changed, 64 insertions(+), 4 deletions(-)
59.1% doc/src/sgml/
14.2% src/backend/utils/activity/
14.5% src/backend/utils/misc/
12.0% src/include/
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index f1af1505cf3..20666679f90 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -8871,6 +8871,40 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
</listitem>
</varlistentry>
+ <varlistentry id="guc-stats-flush-interval" xreflabel="stats_flush_interval">
+ <term><varname>stats_flush_interval</varname> (<type>integer</type>)
+ <indexterm>
+ <primary><varname>stats_flush_interval</varname> configuration parameter</primary>
+ </indexterm>
+ </term>
+ <listitem>
+ <para>
+ Sets the interval at which statistics that can be updated while a
+ transaction is still running are made visible. These include, for example,
+ WAL activity and I/O operations.
+ Such statistics are refreshed at the specified interval and can be observed
+ during active transactions in monitoring views such as
+ <link linkend="monitoring-pg-stat-io-view"><structname>pg_stat_io</structname></link>
+ and
+ <link linkend="monitoring-pg-stat-wal-view"><structname>pg_stat_wal</structname></link>.
+ Other statistics are only made visible at transaction end and are not
+ affected by this setting.
+ If the value is specified without a unit, milliseconds are assumed.
+ The default is 10 seconds (<literal>10s</literal>), which is generally
+ the smallest practical value for long-running transactions.
+ </para>
+ <note>
+ <para>
+ This parameter does not affect statistics that are only reported at
+ transaction end, such as the columns of <structname>pg_stat_all_tables</structname>
+ (for example, <structfield>n_tup_ins</structfield>, <structfield>n_tup_upd</structfield>,
+ and <structfield>n_tup_del</structfield>). These statistics are always
+ flushed at the end of a transaction.
+ </para>
+ </note>
+ </listitem>
+ </varlistentry>
+
</variablelist>
</sect2>
diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c
index 411b65aae3e..79eb59b5625 100644
--- a/src/backend/utils/activity/pgstat.c
+++ b/src/backend/utils/activity/pgstat.c
@@ -123,6 +123,8 @@
* ----------
*/
+/* minimum interval non-forced stats flushes.*/
+#define PGSTAT_MIN_INTERVAL 1000
/* how long until to block flushing pending stats updates */
#define PGSTAT_MAX_INTERVAL 60000
/* when to call pgstat_report_stat() again, even when idle */
@@ -203,6 +205,7 @@ static inline bool pgstat_is_kind_valid(PgStat_Kind kind);
bool pgstat_track_counts = false;
int pgstat_fetch_consistency = PGSTAT_FETCH_CONSISTENCY_CACHE;
+int pgstat_flush_interval = 10000;
/* ----------
@@ -2164,6 +2167,19 @@ assign_stats_fetch_consistency(int newval, void *extra)
force_stats_snapshot_clear = true;
}
+/*
+ * GUC assign_hook for stats_flush_interval.
+ */
+void
+assign_stats_flush_interval(int newval, void *extra)
+{
+ if (get_timeout_active(ANYTIME_STATS_UPDATE_TIMEOUT))
+ {
+ disable_timeout(ANYTIME_STATS_UPDATE_TIMEOUT, false);
+ enable_timeout_after(ANYTIME_STATS_UPDATE_TIMEOUT, newval);
+ }
+}
+
/*
* Flushes only FLUSH_ANYTIME stats using non-blocking locks. Transactional
* stats (FLUSH_AT_TXN_BOUNDARY) remain pending until transaction boundary.
diff --git a/src/backend/utils/misc/guc_parameters.dat b/src/backend/utils/misc/guc_parameters.dat
index c1f1603cd39..fc0e4259b36 100644
--- a/src/backend/utils/misc/guc_parameters.dat
+++ b/src/backend/utils/misc/guc_parameters.dat
@@ -2789,6 +2789,16 @@
assign_hook => 'assign_stats_fetch_consistency',
},
+{ name => 'stats_flush_interval', type => 'int', context => 'PGC_USERSET', group => 'STATS_CUMULATIVE',
+ short_desc => 'Sets the interval between flushes of non-transactional statistics.',
+ flags => 'GUC_UNIT_MS',
+ variable => 'pgstat_flush_interval',
+ boot_val => '10000',
+ min => '1000',
+ max => 'INT_MAX',
+ assign_hook => 'assign_stats_flush_interval'
+},
+
{ name => 'subtransaction_buffers', type => 'int', context => 'PGC_POSTMASTER', group => 'RESOURCES_MEM',
short_desc => 'Sets the size of the dedicated buffer pool used for the subtransaction cache.',
long_desc => '0 means use a fraction of "shared_buffers".',
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 1ae594af843..3f998a0bea0 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -673,6 +673,7 @@
#track_wal_io_timing = off
#track_functions = none # none, pl, all
#stats_fetch_consistency = cache # cache, none, snapshot
+#stats_flush_interval = 10s # in milliseconds
# - Monitoring -
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index b340a680614..ef856dbf55b 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -35,9 +35,6 @@
/* Default directory to store temporary statistics data in */
#define PG_STAT_TMP_DIR "pg_stat_tmp"
-/* Minimum interval non-forced stats flushes */
-#define PGSTAT_MIN_INTERVAL 1000
-
/* Values for track_functions GUC variable --- order is significant! */
typedef enum TrackFunctionsLevel
{
@@ -548,7 +545,7 @@ extern void pgstat_force_next_flush(void);
#define pgstat_schedule_anytime_update() \
do { \
if (IsUnderPostmaster && !get_timeout_active(ANYTIME_STATS_UPDATE_TIMEOUT)) \
- enable_timeout_after(ANYTIME_STATS_UPDATE_TIMEOUT, PGSTAT_MIN_INTERVAL); \
+ enable_timeout_after(ANYTIME_STATS_UPDATE_TIMEOUT, pgstat_flush_interval); \
} while (0)
extern void pgstat_reset_counters(void);
@@ -828,6 +825,7 @@ extern PgStat_WalStats *pgstat_fetch_stat_wal(void);
extern PGDLLIMPORT bool pgstat_track_counts;
extern PGDLLIMPORT int pgstat_track_functions;
extern PGDLLIMPORT int pgstat_fetch_consistency;
+extern PGDLLIMPORT int pgstat_flush_interval;
/*
diff --git a/src/include/utils/guc_hooks.h b/src/include/utils/guc_hooks.h
index b6ecb0e769f..3a2ae6c41cd 100644
--- a/src/include/utils/guc_hooks.h
+++ b/src/include/utils/guc_hooks.h
@@ -132,6 +132,7 @@ extern bool check_session_authorization(char **newval, void **extra, GucSource s
extern void assign_session_authorization(const char *newval, void *extra);
extern void assign_session_replication_role(int newval, void *extra);
extern void assign_stats_fetch_consistency(int newval, void *extra);
+extern void assign_stats_flush_interval(int newval, void *extra);
extern bool check_ssl(bool *newval, void **extra, GucSource source);
extern bool check_stage_log_stats(bool *newval, void **extra, GucSource source);
extern bool check_standard_conforming_strings(bool *newval, void **extra,
--
2.34.1
--DxqFthphbM+ha9Dy
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
filename="v6-0004-Remove-useless-calls-to-flush-some-stats.patch"
view thread (9+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected]
Subject: Re: [PATCH v6 3/5] Add GUC to specify non-transactional statistics flush interval
In-Reply-To: <no-message-id-2599@localhost>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox