From abe58c82c35b8193d2cb8448b8147debdd2cb2f7 Mon Sep 17 00:00:00 2001 From: Bertrand Drouvot Date: Mon, 3 Mar 2025 10:02:40 +0000 Subject: [PATCH v4 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 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 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 a8cb54a7732..82dae972c4c 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; /* * WAL usage counters saved from pgWalUsage at the previous call to @@ -76,6 +77,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; } /* @@ -158,8 +161,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; @@ -190,6 +192,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; } /* @@ -259,9 +263,7 @@ pgstat_flush_backend(bool nowait, bits32 flags) return false; /* Some IO data pending? */ - if ((flags & PGSTAT_BACKEND_FLUSH_IO) && - !pg_memory_is_all_zeros(&PendingBackendStats.pending_io, - sizeof(struct PgStat_PendingIO))) + if ((flags & PGSTAT_BACKEND_FLUSH_IO) && backend_has_iostats) has_pending_data = true; /* Some WAL data pending? */ @@ -298,9 +300,7 @@ pgstat_backend_have_pending_cb(void) if (!pgstat_tracks_backend_bktype(MyBackendType)) return false; - return (!pg_memory_is_all_zeros(&PendingBackendStats, - sizeof(struct PgStat_BackendPending)) || - pgstat_backend_wal_have_pending()); + return (backend_has_iostats || pgstat_backend_wal_have_pending()); } /* -- 2.34.1