diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml
index db4b4e460c..281b13b9fa 100644
--- a/doc/src/sgml/monitoring.sgml
+++ b/doc/src/sgml/monitoring.sgml
@@ -3493,7 +3493,8 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i
Number of times WAL buffers were written out to disk via
- XLogWrite request.
+ XLogWrite request and WAL data were written
+ out to disk by the WAL receiver process.
See for more information about
the internal WAL function XLogWrite.
@@ -3521,7 +3522,8 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i
Total amount of time spent writing WAL buffers to disk via
- XLogWrite request, in milliseconds
+ XLogWrite request and WAL data to disk
+ by the WAL receiver process, in milliseconds
(if is enabled,
otherwise zero). This includes the sync time when
wal_sync_method is either
diff --git a/doc/src/sgml/wal.sgml b/doc/src/sgml/wal.sgml
index ae4a3c1293..39e7028c96 100644
--- a/doc/src/sgml/wal.sgml
+++ b/doc/src/sgml/wal.sgml
@@ -769,7 +769,7 @@
- There are two internal functions to write WAL data to disk:
+ There are two internal functions to write generated WAL data to disk:
XLogWrite and issue_xlog_fsync.
When is enabled, the total
amounts of time XLogWrite writes and
@@ -795,7 +795,19 @@
issue_xlog_fsync syncs WAL data to disk are also
counted as wal_write and wal_sync
in pg_stat_wal, respectively.
-
+ To write replicated WAL data to disk by the WAL receiver is almost the same
+ as above except for some points. First, there is a dedicated code path for the
+ WAL receiver to write data although issue_xlog_fsync is
+ the same for syncing data.
+ Second, the WAL receiver writes replicated WAL data per bytes from the local
+ memory although the generated WAL data is written per WAL buffer pages.
+ The counters of wal_write, wal_sync,
+ wal_write_time, and wal_sync_time are
+ common statistics for writing/syncing both generated and replicated WAL data.
+ But, you can distinguish them because the generated WAL data is written/synced
+ in the primary server and the replicated WAL data is written/synced in
+ the standby server.
+
diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c
index a7a94d2a83..df028c5039 100644
--- a/src/backend/replication/walreceiver.c
+++ b/src/backend/replication/walreceiver.c
@@ -771,6 +771,9 @@ WalRcvDie(int code, Datum arg)
/* Ensure that all WAL records received are flushed to disk */
XLogWalRcvFlush(true);
+ /* Send WAL statistics to the stats collector before terminating */
+ pgstat_send_wal(true);
+
/* Mark ourselves inactive in shared memory */
SpinLockAcquire(&walrcv->mutex);
Assert(walrcv->walRcvState == WALRCV_STREAMING ||
@@ -910,6 +913,12 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr)
XLogArchiveForceDone(xlogfname);
else
XLogArchiveNotify(xlogfname);
+
+ /*
+ * Send WAL statistics to the stats collector when finishing
+ * the current WAL segment file to avoid overloading it.
+ */
+ pgstat_send_wal(false);
}
recvFile = -1;