diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index 28c90dcac9d346dbce6c1c6482ccfd0c0e8404d4..be32ca8dc5461f55ba50dc5f6def113f419abe4c 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -3754,8 +3754,10 @@ pgstat_read_statsfile_timestamp(bool permanent, TimestampTz *ts)
 static void
 backend_read_statsfile(void)
 {
+	TimestampTz cur_ts;
 	TimestampTz min_ts;
 	int			count;
+	int			last_delay_errno = 0;
 
 	/* already read it? */
 	if (pgStatDBHash)
@@ -3776,12 +3778,11 @@ backend_read_statsfile(void)
 	 * PGSTAT_STAT_INTERVAL; and we don't want to lie to the collector about
 	 * what our cutoff time really is.
 	 */
+	cur_ts = GetCurrentTimestamp();
 	if (IsAutoVacuumWorkerProcess())
-		min_ts = TimestampTzPlusMilliseconds(GetCurrentTimestamp(),
-											 -PGSTAT_RETRY_DELAY);
+		min_ts = TimestampTzPlusMilliseconds(cur_ts, -PGSTAT_RETRY_DELAY);
 	else
-		min_ts = TimestampTzPlusMilliseconds(GetCurrentTimestamp(),
-											 -PGSTAT_STAT_INTERVAL);
+		min_ts = TimestampTzPlusMilliseconds(cur_ts, -PGSTAT_STAT_INTERVAL);
 
 	/*
 	 * Loop until fresh enough stats file is available or we ran out of time.
@@ -3798,9 +3799,29 @@ backend_read_statsfile(void)
 			file_ts >= min_ts)
 			break;
 
+		/* Make debugging printouts once we've waited unreasonably long */
+		if (count >= PGSTAT_POLL_LOOP_COUNT/2)
+		{
+			TimestampTz now_ts = GetCurrentTimestamp();
+
+#ifdef HAVE_INT64_TIMESTAMP
+			elog(WARNING, "pgstat waiting for " INT64_FORMAT " usec (%d loops), file timestamp " INT64_FORMAT " target timestamp " INT64_FORMAT " last errno %d",
+				 now_ts - cur_ts, count,
+				 file_ts, min_ts,
+				 last_delay_errno);
+#else
+			elog(WARNING, "pgstat waiting for %.6f sec (%d loops), file timestamp %.6f target timestamp %.6f last errno %d",
+				 now_ts - cur_ts, count,
+				 file_ts, min_ts,
+				 last_delay_errno);
+#endif
+		}
+
 		/* Not there or too old, so kick the collector and wait a bit */
+		errno = 0;
 		pgstat_send_inquiry(min_ts);
 		pg_usleep(PGSTAT_RETRY_DELAY * 1000L);
+		last_delay_errno = errno;
 	}
 
 	if (count >= PGSTAT_POLL_LOOP_COUNT)