diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/catalog/system_views.sql | 1 | ||||
-rw-r--r-- | src/backend/postmaster/bgwriter.c | 16 | ||||
-rw-r--r-- | src/backend/postmaster/pgstat.c | 1 | ||||
-rw-r--r-- | src/backend/storage/smgr/md.c | 3 | ||||
-rw-r--r-- | src/backend/utils/adt/pgstatfuncs.c | 7 |
5 files changed, 24 insertions, 4 deletions
diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 09574c3e82c..82788fa14a6 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -537,6 +537,7 @@ CREATE VIEW pg_stat_bgwriter AS pg_stat_get_bgwriter_buf_written_clean() AS buffers_clean, pg_stat_get_bgwriter_maxwritten_clean() AS maxwritten_clean, pg_stat_get_buf_written_backend() AS buffers_backend, + pg_stat_get_buf_fsync_backend() AS buffers_backend_fsync, pg_stat_get_buf_alloc() AS buffers_alloc; CREATE VIEW pg_user_mappings AS diff --git a/src/backend/postmaster/bgwriter.c b/src/backend/postmaster/bgwriter.c index 0690ab521e7..620b1972a67 100644 --- a/src/backend/postmaster/bgwriter.c +++ b/src/backend/postmaster/bgwriter.c @@ -102,13 +102,15 @@ * * num_backend_writes is used to count the number of buffer writes performed * by non-bgwriter processes. This counter should be wide enough that it - * can't overflow during a single bgwriter cycle. + * can't overflow during a single bgwriter cycle. num_backend_fsync + * counts the subset of those writes that also had to do their own fsync, + * because the background writer failed to absorb their request. * * The requests array holds fsync requests sent by backends and not yet * absorbed by the bgwriter. * - * Unlike the checkpoint fields, num_backend_writes and the requests - * fields are protected by BgWriterCommLock. + * Unlike the checkpoint fields, num_backend_writes, num_backend_fsync, and + * the requests fields are protected by BgWriterCommLock. *---------- */ typedef struct @@ -132,6 +134,7 @@ typedef struct int ckpt_flags; /* checkpoint flags, as defined in xlog.h */ uint32 num_backend_writes; /* counts non-bgwriter buffer writes */ + uint32 num_backend_fsync; /* counts non-bgwriter fsync calls */ int num_requests; /* current # of requests */ int max_requests; /* allocated array size */ @@ -1084,12 +1087,14 @@ ForwardFsyncRequest(RelFileNodeBackend rnode, ForkNumber forknum, LWLockAcquire(BgWriterCommLock, LW_EXCLUSIVE); - /* we count non-bgwriter writes even when the request queue overflows */ + /* Count all backend writes regardless of if they fit in the queue */ BgWriterShmem->num_backend_writes++; if (BgWriterShmem->bgwriter_pid == 0 || BgWriterShmem->num_requests >= BgWriterShmem->max_requests) { + /* Also count the subset where backends have to do their own fsync */ + BgWriterShmem->num_backend_fsync++; LWLockRelease(BgWriterCommLock); return false; } @@ -1137,7 +1142,10 @@ AbsorbFsyncRequests(void) /* Transfer write count into pending pgstats message */ BgWriterStats.m_buf_written_backend += BgWriterShmem->num_backend_writes; + BgWriterStats.m_buf_fsync_backend += BgWriterShmem->num_backend_fsync; + BgWriterShmem->num_backend_writes = 0; + BgWriterShmem->num_backend_fsync = 0; n = BgWriterShmem->num_requests; if (n > 0) diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index a1ad3429535..c3c136a1612 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -4188,6 +4188,7 @@ pgstat_recv_bgwriter(PgStat_MsgBgWriter *msg, int len) globalStats.buf_written_clean += msg->m_buf_written_clean; globalStats.maxwritten_clean += msg->m_maxwritten_clean; globalStats.buf_written_backend += msg->m_buf_written_backend; + globalStats.buf_fsync_backend += msg->m_buf_fsync_backend; globalStats.buf_alloc += msg->m_buf_alloc; } diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c index 1219fcffeb3..604db218eeb 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -1224,6 +1224,9 @@ register_dirty_segment(SMgrRelation reln, ForkNumber forknum, MdfdVec *seg) if (ForwardFsyncRequest(reln->smgr_rnode, forknum, seg->mdfd_segno)) return; /* passed it off successfully */ + ereport(DEBUG1, + (errmsg("could not forward fsync request because request queue is full"))); + if (FileSync(seg->mdfd_vfd) < 0) ereport(ERROR, (errcode_for_file_access(), diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 6edb8bfd130..adab948e0dc 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -78,6 +78,7 @@ extern Datum pg_stat_get_bgwriter_buf_written_checkpoints(PG_FUNCTION_ARGS); extern Datum pg_stat_get_bgwriter_buf_written_clean(PG_FUNCTION_ARGS); extern Datum pg_stat_get_bgwriter_maxwritten_clean(PG_FUNCTION_ARGS); extern Datum pg_stat_get_buf_written_backend(PG_FUNCTION_ARGS); +extern Datum pg_stat_get_buf_fsync_backend(PG_FUNCTION_ARGS); extern Datum pg_stat_get_buf_alloc(PG_FUNCTION_ARGS); extern Datum pg_stat_get_xact_numscans(PG_FUNCTION_ARGS); @@ -1165,6 +1166,12 @@ pg_stat_get_buf_written_backend(PG_FUNCTION_ARGS) } Datum +pg_stat_get_buf_fsync_backend(PG_FUNCTION_ARGS) +{ + PG_RETURN_INT64(pgstat_fetch_global()->buf_fsync_backend); +} + +Datum pg_stat_get_buf_alloc(PG_FUNCTION_ARGS) { PG_RETURN_INT64(pgstat_fetch_global()->buf_alloc); |