From 42cce18fd4565118c430bdd422f509361c8f86e5 Mon Sep 17 00:00:00 2001 From: Bertrand Drouvot Date: Mon, 3 Mar 2025 10:02:40 +0000 Subject: [PATCH v3 2/2] Add a new backend_has_iostats global variable It behaves as the existing have_iostats and replace the existing pg_memory_is_all_zeros() calls in flushing backend stats functions. Indeed some perf measurements report that those calls are responsible for a large part of the flushing backend stats functions. --- src/backend/utils/activity/pgstat_backend.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) 100.0% src/backend/utils/activity/ diff --git a/src/backend/utils/activity/pgstat_backend.c b/src/backend/utils/activity/pgstat_backend.c index a9343b7b59e..0ae3a1d4d23 100644 --- a/src/backend/utils/activity/pgstat_backend.c +++ b/src/backend/utils/activity/pgstat_backend.c @@ -37,6 +37,7 @@ * memory allocation. */ static PgStat_BackendPending PendingBackendStats; +static bool backend_has_iostats = false; /* * Utility routines to report I/O stats for backends, kept here to avoid @@ -68,6 +69,8 @@ pgstat_count_backend_io_op(IOObject io_object, IOContext io_context, PendingBackendStats.pending_io.counts[io_object][io_context][io_op] += cnt; PendingBackendStats.pending_io.bytes[io_object][io_context][io_op] += bytes; + + backend_has_iostats = true; } /* @@ -150,8 +153,7 @@ pgstat_flush_backend_entry_io(PgStat_EntryRef *entry_ref) * statistics. In this case, avoid unnecessarily modifying the stats * entry. */ - if (pg_memory_is_all_zeros(&PendingBackendStats.pending_io, - sizeof(struct PgStat_PendingIO))) + if (!backend_has_iostats) return; shbackendent = (PgStatShared_Backend *) entry_ref->shared_stats; @@ -182,6 +184,8 @@ pgstat_flush_backend_entry_io(PgStat_EntryRef *entry_ref) * Clear out the statistics buffer, so it can be re-used. */ MemSet(&PendingBackendStats.pending_io, 0, sizeof(PgStat_PendingIO)); + + backend_has_iostats = false; } /* @@ -198,8 +202,7 @@ pgstat_flush_backend(bool nowait, bits32 flags) if (!pgstat_tracks_backend_bktype(MyBackendType)) return false; - if (pg_memory_is_all_zeros(&PendingBackendStats, - sizeof(struct PgStat_BackendPending))) + if (!pgstat_backend_have_pending_cb()) return false; entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_BACKEND, InvalidOid, @@ -222,8 +225,7 @@ pgstat_flush_backend(bool nowait, bits32 flags) bool pgstat_backend_have_pending_cb(void) { - return (!pg_memory_is_all_zeros(&PendingBackendStats, - sizeof(struct PgStat_BackendPending))); + return backend_has_iostats; } /* -- 2.34.1