From: Michael Paquier Date: Thu, 6 Mar 2025 00:39:45 +0000 (+0900) Subject: Add more monitoring data for WAL writes in the WAL receiver X-Git-Tag: REL_18_BETA1~673 X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=7f7f324eb5a4754ab9fa1c68dfef952555a94d1b;p=postgresql.git Add more monitoring data for WAL writes in the WAL receiver This commit adds two improvements related to the monitoring of WAL writes for the WAL receiver. First, write counts and timings are now counted in pg_stat_io for the WAL receiver. These have been discarded from pg_stat_wal in ff99918c625a due to performance concerns, related to the fact that we still relied on an on-disk file for the stats back then, even with track_wal_io_timing to avoid the overhead of the timestamp calculations. This implementation is simpler than the original proposal as it is possible to rely on the APIs of pgstat_io.c to do the job. Like the fsync and read data, track_wal_io_timing needs to be enabled to track the timings. Second, a wait event is added around the pg_pwrite() call in charge of the writes, using the exiting WAIT_EVENT_WAL_WRITE. This is useful as the WAL receiver data is tracked in pg_stat_activity. Reviewed-by: Bertrand Drouvot Discussion: https://postgr.es/m/Z8gFnH4o3jBm5BRz@ip-10-97-1-34.eu-west-3.compute.internal --- diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c index 83129cb92af..2e5dd6deb2c 100644 --- a/src/backend/replication/walreceiver.c +++ b/src/backend/replication/walreceiver.c @@ -922,6 +922,7 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr, TimeLineID tli) { int startoff; int byteswritten; + instr_time start; Assert(tli != 0); @@ -952,7 +953,18 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr, TimeLineID tli) /* OK to write the logs */ errno = 0; + /* + * Measure I/O timing to write WAL data, for pg_stat_io. + */ + start = pgstat_prepare_io_time(track_wal_io_timing); + + pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); byteswritten = pg_pwrite(recvFile, buf, segbytes, (off_t) startoff); + pgstat_report_wait_end(); + + pgstat_count_io_op_time(IOOBJECT_WAL, IOCONTEXT_NORMAL, + IOOP_WRITE, start, 1, byteswritten); + if (byteswritten <= 0) { char xlogfname[MAXFNAMELEN];